Allow deleting filters.

This commit is contained in:
Lukas Brübach 2025-03-16 13:09:23 +01:00
parent d6d0b35b8d
commit 9a271d2ea5
4 changed files with 153 additions and 10 deletions

View file

@ -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);
}
}
}

View file

@ -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

View file

@ -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));
}
}
}

View file

@ -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