mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-14 22:42:14 -07:00
Allow deleting filters.
This commit is contained in:
parent
d6d0b35b8d
commit
9a271d2ea5
4 changed files with 153 additions and 10 deletions
|
|
@ -2,10 +2,12 @@
|
|||
|
||||
#include "../../../../game/filters/filter_tree.h"
|
||||
#include "../../../../settings/cache_settings.h"
|
||||
#include "visual_database_filter_display_widget.h"
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
#include <QMessageBox>
|
||||
|
||||
VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWidget(QWidget *parent,
|
||||
FilterTreeModel *_filterModel)
|
||||
|
|
@ -28,7 +30,7 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi
|
|||
connect(saveButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter);
|
||||
|
||||
// File list container
|
||||
fileListWidget = new FlowWidget(this, Qt::Vertical, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
||||
fileListWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
||||
layout->addWidget(fileListWidget);
|
||||
|
||||
refreshFilterList(); // Populate the file list on startup
|
||||
|
|
@ -106,20 +108,40 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter(const QString &filena
|
|||
|
||||
void VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList()
|
||||
{
|
||||
// Clear existing file buttons
|
||||
for (auto button : fileButtons) {
|
||||
delete button;
|
||||
fileListWidget->clearLayout();
|
||||
// Clear existing widgets
|
||||
for (auto buttonPair : fileButtons) {
|
||||
buttonPair.first->deleteLater();
|
||||
buttonPair.second->deleteLater();
|
||||
}
|
||||
fileButtons.clear();
|
||||
fileButtons.clear(); // Clear the list of buttons
|
||||
|
||||
// Refresh the filter file list
|
||||
QDir dir(SettingsCache::instance().getFiltersPath());
|
||||
QStringList filterFiles = dir.entryList(QStringList() << "*.json", QDir::Files, QDir::Time);
|
||||
|
||||
// Loop through the filter files and create widgets for them
|
||||
for (const QString &filename : filterFiles) {
|
||||
auto *button = new QPushButton(filename, fileListWidget);
|
||||
fileListWidget->addWidget(button);
|
||||
fileButtons[filename] = button;
|
||||
bool alreadyAdded = false;
|
||||
|
||||
connect(button, &QPushButton::clicked, this, [this, filename]() { loadFilter(filename); });
|
||||
// Check if the widget for this filter file already exists to avoid duplicates
|
||||
for (const auto &pair : fileButtons) {
|
||||
if (pair.first->text() == filename) {
|
||||
alreadyAdded = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!alreadyAdded) {
|
||||
// Create a new custom widget for the filter
|
||||
FilterDisplayWidget *filterWidget = new FilterDisplayWidget(this, filename, filterModel);
|
||||
fileListWidget->addWidget(filterWidget);
|
||||
|
||||
// Connect signals to handle loading and deletion
|
||||
connect(filterWidget, &FilterDisplayWidget::filterLoadRequested, this,
|
||||
&VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter);
|
||||
connect(filterWidget, &FilterDisplayWidget::filterDeleted, this,
|
||||
&VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ public:
|
|||
void saveFilter();
|
||||
void loadFilter(const QString &filename);
|
||||
void refreshFilterList();
|
||||
void deleteFilter(const QString &filename, QPushButton *deleteButton);
|
||||
|
||||
private:
|
||||
FilterTreeModel *filterModel;
|
||||
|
|
@ -33,7 +34,7 @@ private:
|
|||
QPushButton *saveButton;
|
||||
FlowWidget *fileListWidget;
|
||||
|
||||
QMap<QString, QPushButton *> fileButtons;
|
||||
QMap<QString, QPair<QPushButton *, QPushButton *>> fileButtons;
|
||||
};
|
||||
|
||||
#endif // VISUAL_DATABASE_DISPLAY_FILTER_SAVE_LOAD_WIDGET_H
|
||||
|
|
|
|||
|
|
@ -0,0 +1,80 @@
|
|||
#include "visual_database_filter_display_widget.h"
|
||||
|
||||
#include "../../../../settings/cache_settings.h"
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <QHBoxLayout>
|
||||
#include <QMessageBox>
|
||||
#include <QPushButton>
|
||||
|
||||
FilterDisplayWidget::FilterDisplayWidget(QWidget *parent, const QString &filename, FilterTreeModel *_filterModel)
|
||||
: QWidget(parent), filterFilename(filename), filterModel(_filterModel)
|
||||
{
|
||||
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
||||
// Create layout
|
||||
auto *layout = new QHBoxLayout(this);
|
||||
layout->setContentsMargins(5, 5, 5, 5);
|
||||
layout->setSpacing(5);
|
||||
|
||||
// Filter button (displays filename)
|
||||
filterButton = new QPushButton(filterFilename, this);
|
||||
layout->addWidget(filterButton);
|
||||
|
||||
// Create close button (inside the filter button)
|
||||
closeButton = new QPushButton("x", this);
|
||||
closeButton->setFixedSize(20, 20); // Small square close button
|
||||
closeButton->setFocusPolicy(Qt::NoFocus);
|
||||
layout->addWidget(closeButton);
|
||||
|
||||
// Connect the filter button for loading the filter
|
||||
connect(filterButton, &QPushButton::clicked, this, &FilterDisplayWidget::loadFilter);
|
||||
|
||||
// Connect the close button for deleting the filter
|
||||
connect(closeButton, &QPushButton::clicked, this, &FilterDisplayWidget::deleteFilter);
|
||||
}
|
||||
|
||||
QSize FilterDisplayWidget::sizeHint() const
|
||||
{
|
||||
// Calculate the size based on the filter name and the close button
|
||||
QFontMetrics fm(font());
|
||||
int textWidth = fm.horizontalAdvance(filterFilename);
|
||||
int width = textWidth + 30 + 16; // Space for the filename and close button
|
||||
int height = fm.height() + 10; // Height based on font size + padding
|
||||
|
||||
return QSize(width, height);
|
||||
}
|
||||
|
||||
void FilterDisplayWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->button() == Qt::LeftButton) {
|
||||
emit filterClicked(); // Emit signal for the widget click
|
||||
}
|
||||
QWidget::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void FilterDisplayWidget::loadFilter()
|
||||
{
|
||||
// Trigger the loading of the filter
|
||||
emit filterLoadRequested(filterFilename);
|
||||
}
|
||||
|
||||
void FilterDisplayWidget::deleteFilter()
|
||||
{
|
||||
// Show confirmation dialog before deleting the filter
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(
|
||||
this, tr("Confirm Delete"), tr("Are you sure you want to delete the filter '%1'?").arg(filterFilename),
|
||||
QMessageBox::Yes | QMessageBox::No);
|
||||
if (reply == QMessageBox::Yes) {
|
||||
// If confirmed, delete the filter
|
||||
QString filePath = SettingsCache::instance().getFiltersPath() + QDir::separator() + filterFilename;
|
||||
QFile file(filePath);
|
||||
if (file.remove()) {
|
||||
emit filterDeleted(filterFilename); // Emit signal for deletion
|
||||
delete this; // Delete this widget
|
||||
} else {
|
||||
QMessageBox::warning(this, tr("Delete Failed"), tr("Failed to delete filter '%1'.").arg(filterFilename));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef VISUAL_DATABASE_FILTER_DISPLAY_WIDGET_H
|
||||
#define VISUAL_DATABASE_FILTER_DISPLAY_WIDGET_H
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QPushButton>
|
||||
#include <QString>
|
||||
#include <QWidget>
|
||||
|
||||
class FilterTreeModel; // Forward declaration of your FilterTreeModel class
|
||||
|
||||
class FilterDisplayWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit FilterDisplayWidget(QWidget *parent, const QString &filename, FilterTreeModel *_filterModel);
|
||||
~FilterDisplayWidget() = default;
|
||||
|
||||
QSize sizeHint() const override;
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
|
||||
private slots:
|
||||
void loadFilter();
|
||||
void deleteFilter();
|
||||
|
||||
signals:
|
||||
void filterClicked();
|
||||
void filterLoadRequested(const QString &filename);
|
||||
void filterDeleted(const QString &filename);
|
||||
|
||||
private:
|
||||
QString filterFilename;
|
||||
FilterTreeModel *filterModel;
|
||||
QPushButton *filterButton; // Button for the filter text
|
||||
QPushButton *closeButton; // Close button to delete the filter
|
||||
};
|
||||
|
||||
#endif // VISUAL_DATABASE_FILTER_DISPLAY_WIDGET_H
|
||||
Loading…
Add table
Add a link
Reference in a new issue