mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-16 07:22:16 -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 "../../../../game/filters/filter_tree.h"
|
||||||
#include "../../../../settings/cache_settings.h"
|
#include "../../../../settings/cache_settings.h"
|
||||||
|
#include "visual_database_filter_display_widget.h"
|
||||||
|
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWidget(QWidget *parent,
|
VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWidget(QWidget *parent,
|
||||||
FilterTreeModel *_filterModel)
|
FilterTreeModel *_filterModel)
|
||||||
|
|
@ -28,7 +30,7 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi
|
||||||
connect(saveButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter);
|
connect(saveButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter);
|
||||||
|
|
||||||
// File list container
|
// 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);
|
layout->addWidget(fileListWidget);
|
||||||
|
|
||||||
refreshFilterList(); // Populate the file list on startup
|
refreshFilterList(); // Populate the file list on startup
|
||||||
|
|
@ -106,20 +108,40 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter(const QString &filena
|
||||||
|
|
||||||
void VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList()
|
void VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList()
|
||||||
{
|
{
|
||||||
// Clear existing file buttons
|
fileListWidget->clearLayout();
|
||||||
for (auto button : fileButtons) {
|
// Clear existing widgets
|
||||||
delete button;
|
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());
|
QDir dir(SettingsCache::instance().getFiltersPath());
|
||||||
QStringList filterFiles = dir.entryList(QStringList() << "*.json", QDir::Files, QDir::Time);
|
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) {
|
for (const QString &filename : filterFiles) {
|
||||||
auto *button = new QPushButton(filename, fileListWidget);
|
bool alreadyAdded = false;
|
||||||
fileListWidget->addWidget(button);
|
|
||||||
fileButtons[filename] = button;
|
|
||||||
|
|
||||||
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 saveFilter();
|
||||||
void loadFilter(const QString &filename);
|
void loadFilter(const QString &filename);
|
||||||
void refreshFilterList();
|
void refreshFilterList();
|
||||||
|
void deleteFilter(const QString &filename, QPushButton *deleteButton);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FilterTreeModel *filterModel;
|
FilterTreeModel *filterModel;
|
||||||
|
|
@ -33,7 +34,7 @@ private:
|
||||||
QPushButton *saveButton;
|
QPushButton *saveButton;
|
||||||
FlowWidget *fileListWidget;
|
FlowWidget *fileListWidget;
|
||||||
|
|
||||||
QMap<QString, QPushButton *> fileButtons;
|
QMap<QString, QPair<QPushButton *, QPushButton *>> fileButtons;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VISUAL_DATABASE_DISPLAY_FILTER_SAVE_LOAD_WIDGET_H
|
#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