From 9a271d2ea522e041ff3c74ab62559d56cf91a223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sun, 16 Mar 2025 13:09:23 +0100 Subject: [PATCH] Allow deleting filters. --- ...tabase_display_filter_save_load_widget.cpp | 40 +++++++--- ...database_display_filter_save_load_widget.h | 3 +- .../visual_database_filter_display_widget.cpp | 80 +++++++++++++++++++ .../visual_database_filter_display_widget.h | 40 ++++++++++ 4 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.cpp create mode 100644 cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.h diff --git a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp index 1db4c0399..44c405a4f 100644 --- a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp @@ -2,10 +2,12 @@ #include "../../../../game/filters/filter_tree.h" #include "../../../../settings/cache_settings.h" +#include "visual_database_filter_display_widget.h" #include #include #include +#include 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); + } } } diff --git a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h index 261e5786d..219efed74 100644 --- a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h @@ -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 fileButtons; +QMap> fileButtons; }; #endif // VISUAL_DATABASE_DISPLAY_FILTER_SAVE_LOAD_WIDGET_H diff --git a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.cpp b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.cpp new file mode 100644 index 000000000..22e94b1e9 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.cpp @@ -0,0 +1,80 @@ +#include "visual_database_filter_display_widget.h" + +#include "../../../../settings/cache_settings.h" + +#include +#include +#include +#include +#include +#include + +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)); + } + } +} \ No newline at end of file diff --git a/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.h b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.h new file mode 100644 index 000000000..79f4133a3 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/visual_database_display/visual_database_filter_display_widget.h @@ -0,0 +1,40 @@ +#ifndef VISUAL_DATABASE_FILTER_DISPLAY_WIDGET_H +#define VISUAL_DATABASE_FILTER_DISPLAY_WIDGET_H + +#include +#include +#include +#include + +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