mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2025-12-05 20:39:59 -08:00
[VDD] Add search bar for filters. (#6389)
* [VDD] Add search bar for filters. * Update cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com> --------- Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com>
This commit is contained in:
@@ -18,6 +18,16 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi
|
|||||||
layout = new QVBoxLayout(this);
|
layout = new QVBoxLayout(this);
|
||||||
setLayout(layout);
|
setLayout(layout);
|
||||||
|
|
||||||
|
// Filter search input
|
||||||
|
searchInput = new QLineEdit(this);
|
||||||
|
layout->addWidget(searchInput);
|
||||||
|
|
||||||
|
connect(searchInput, &QLineEdit::textChanged, this, &VisualDatabaseDisplayFilterSaveLoadWidget::applySearchFilter);
|
||||||
|
|
||||||
|
// File list container
|
||||||
|
fileListWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
||||||
|
layout->addWidget(fileListWidget);
|
||||||
|
|
||||||
// Input for filter filename
|
// Input for filter filename
|
||||||
filenameInput = new QLineEdit(this);
|
filenameInput = new QLineEdit(this);
|
||||||
layout->addWidget(filenameInput);
|
layout->addWidget(filenameInput);
|
||||||
@@ -25,11 +35,12 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi
|
|||||||
// Save button
|
// Save button
|
||||||
saveButton = new QPushButton(this);
|
saveButton = new QPushButton(this);
|
||||||
layout->addWidget(saveButton);
|
layout->addWidget(saveButton);
|
||||||
connect(saveButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter);
|
// Disable save if empty
|
||||||
|
saveButton->setEnabled(false);
|
||||||
|
connect(filenameInput, &QLineEdit::textChanged, this,
|
||||||
|
[this](const QString &text) { saveButton->setEnabled(!text.trimmed().isEmpty()); });
|
||||||
|
|
||||||
// File list container
|
connect(saveButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter);
|
||||||
fileListWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
|
||||||
layout->addWidget(fileListWidget);
|
|
||||||
|
|
||||||
refreshFilterList(); // Populate the file list on startup
|
refreshFilterList(); // Populate the file list on startup
|
||||||
retranslateUi();
|
retranslateUi();
|
||||||
@@ -37,6 +48,7 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi
|
|||||||
|
|
||||||
void VisualDatabaseDisplayFilterSaveLoadWidget::retranslateUi()
|
void VisualDatabaseDisplayFilterSaveLoadWidget::retranslateUi()
|
||||||
{
|
{
|
||||||
|
searchInput->setPlaceholderText(tr("Search filter..."));
|
||||||
saveButton->setText(tr("Save Filter"));
|
saveButton->setText(tr("Save Filter"));
|
||||||
saveButton->setToolTip(tr("Save all currently applied filters to a file"));
|
saveButton->setToolTip(tr("Save all currently applied filters to a file"));
|
||||||
filenameInput->setPlaceholderText(tr("Enter filename..."));
|
filenameInput->setPlaceholderText(tr("Enter filename..."));
|
||||||
@@ -112,42 +124,36 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter(const QString &filena
|
|||||||
emit filterModel->layoutChanged();
|
emit filterModel->layoutChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VisualDatabaseDisplayFilterSaveLoadWidget::applySearchFilter(const QString &text)
|
||||||
|
{
|
||||||
|
fileListWidget->clearLayout();
|
||||||
|
|
||||||
|
QString filter = text.trimmed();
|
||||||
|
QStringList filtered = allFilterFiles;
|
||||||
|
|
||||||
|
if (!filter.isEmpty()) {
|
||||||
|
filtered = filtered.filter(QRegularExpression(filter, QRegularExpression::CaseInsensitiveOption));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const QString &filename : filtered) {
|
||||||
|
FilterDisplayWidget *filterWidget = new FilterDisplayWidget(this, filename, filterModel);
|
||||||
|
fileListWidget->addWidget(filterWidget);
|
||||||
|
|
||||||
|
connect(filterWidget, &FilterDisplayWidget::filterLoadRequested, this,
|
||||||
|
&VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter);
|
||||||
|
|
||||||
|
connect(filterWidget, &FilterDisplayWidget::filterDeleted, this,
|
||||||
|
&VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList()
|
void VisualDatabaseDisplayFilterSaveLoadWidget::refreshFilterList()
|
||||||
{
|
{
|
||||||
fileListWidget->clearLayout();
|
fileListWidget->clearLayout();
|
||||||
// Clear existing widgets
|
fileButtons.clear();
|
||||||
for (auto buttonPair : fileButtons) {
|
|
||||||
buttonPair.first->deleteLater();
|
|
||||||
buttonPair.second->deleteLater();
|
|
||||||
}
|
|
||||||
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::Name);
|
allFilterFiles = dir.entryList({"*.json"}, QDir::Files, QDir::Name);
|
||||||
|
|
||||||
// Loop through the filter files and create widgets for them
|
applySearchFilter(searchInput->text());
|
||||||
for (const QString &filename : filterFiles) {
|
|
||||||
bool alreadyAdded = false;
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public:
|
|||||||
|
|
||||||
void saveFilter();
|
void saveFilter();
|
||||||
void loadFilter(const QString &filename);
|
void loadFilter(const QString &filename);
|
||||||
|
void applySearchFilter(const QString &text);
|
||||||
void refreshFilterList();
|
void refreshFilterList();
|
||||||
void deleteFilter(const QString &filename, QPushButton *deleteButton);
|
void deleteFilter(const QString &filename, QPushButton *deleteButton);
|
||||||
|
|
||||||
@@ -37,9 +38,11 @@ private:
|
|||||||
FilterTreeModel *filterModel;
|
FilterTreeModel *filterModel;
|
||||||
|
|
||||||
QVBoxLayout *layout;
|
QVBoxLayout *layout;
|
||||||
|
QLineEdit *searchInput;
|
||||||
|
FlowWidget *fileListWidget;
|
||||||
QLineEdit *filenameInput;
|
QLineEdit *filenameInput;
|
||||||
QPushButton *saveButton;
|
QPushButton *saveButton;
|
||||||
FlowWidget *fileListWidget;
|
QStringList allFilterFiles;
|
||||||
|
|
||||||
QMap<QString, QPair<QPushButton *, QPushButton *>> fileButtons;
|
QMap<QString, QPair<QPushButton *, QPushButton *>> fileButtons;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user