diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp index 4d8eb5c57..44b275afd 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp @@ -18,6 +18,16 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi layout = new QVBoxLayout(this); 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 filenameInput = new QLineEdit(this); layout->addWidget(filenameInput); @@ -25,11 +35,12 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi // Save button saveButton = new QPushButton(this); 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 - fileListWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); - layout->addWidget(fileListWidget); + connect(saveButton, &QPushButton::clicked, this, &VisualDatabaseDisplayFilterSaveLoadWidget::saveFilter); refreshFilterList(); // Populate the file list on startup retranslateUi(); @@ -37,6 +48,7 @@ VisualDatabaseDisplayFilterSaveLoadWidget::VisualDatabaseDisplayFilterSaveLoadWi void VisualDatabaseDisplayFilterSaveLoadWidget::retranslateUi() { + searchInput->setPlaceholderText(tr("Search filter...")); saveButton->setText(tr("Save Filter")); saveButton->setToolTip(tr("Save all currently applied filters to a file")); filenameInput->setPlaceholderText(tr("Enter filename...")); @@ -112,42 +124,36 @@ void VisualDatabaseDisplayFilterSaveLoadWidget::loadFilter(const QString &filena 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() { fileListWidget->clearLayout(); - // Clear existing widgets - for (auto buttonPair : fileButtons) { - buttonPair.first->deleteLater(); - buttonPair.second->deleteLater(); - } - fileButtons.clear(); // Clear the list of buttons + fileButtons.clear(); - // Refresh the filter file list 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 - 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); - } - } + applySearchFilter(searchInput->text()); } diff --git a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h index 48e6f9498..bb5921a02 100644 --- a/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h +++ b/cockatrice/src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.h @@ -27,6 +27,7 @@ public: void saveFilter(); void loadFilter(const QString &filename); + void applySearchFilter(const QString &text); void refreshFilterList(); void deleteFilter(const QString &filename, QPushButton *deleteButton); @@ -37,9 +38,11 @@ private: FilterTreeModel *filterModel; QVBoxLayout *layout; + QLineEdit *searchInput; + FlowWidget *fileListWidget; QLineEdit *filenameInput; QPushButton *saveButton; - FlowWidget *fileListWidget; + QStringList allFilterFiles; QMap> fileButtons; };