From cee2de45d5314b2c55ef592193b8f35c8fcf4935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Sun, 29 Dec 2024 16:25:04 +0100 Subject: [PATCH] Add a search bar. --- cockatrice/CMakeLists.txt | 1 + .../visual_deck_storage_search_widget.cpp | 59 +++++++++++++++++++ .../visual_deck_storage_search_widget.h | 27 +++++++++ .../visual_deck_storage_widget.cpp | 12 +++- .../visual_deck_storage_widget.h | 6 +- 5 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp create mode 100644 cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 0e2fad5f0..33a93d001 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -162,6 +162,7 @@ set(cockatrice_SOURCES src/client/tabs/visual_deck_storage/tab_deck_storage_visual.cpp src/client/ui/widgets/cards/deck_preview_card_picture_widget.cpp src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp + src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp ${VERSION_STRING_CPP} ) diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp new file mode 100644 index 000000000..3ddcbcb53 --- /dev/null +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.cpp @@ -0,0 +1,59 @@ +#include "visual_deck_storage_search_widget.h" + +/** + * @brief Constructs a PrintingSelectorCardSearchWidget for searching cards by set name or set code. + * + * This widget provides a search bar that allows users to search for cards by either their set name + * or set code. It uses a debounced timer to trigger the search action after the user stops typing. + * + * @param parent The parent PrintingSelector widget that will handle the search results. + */ +VisualDeckStorageSearchWidget::VisualDeckStorageSearchWidget(VisualDeckStorageWidget *parent) : parent(parent) +{ + layout = new QHBoxLayout(this); + setLayout(layout); + + searchBar = new QLineEdit(this); + searchBar->setPlaceholderText(tr("Search by filename")); + layout->addWidget(searchBar); + + // Add a debounce timer for the search bar to limit frequent updates + searchDebounceTimer = new QTimer(this); + searchDebounceTimer->setSingleShot(true); + connect(searchBar, &QLineEdit::textChanged, this, [this]() { + searchDebounceTimer->start(300); // 300ms debounce + }); + + connect(searchDebounceTimer, &QTimer::timeout, parent, &VisualDeckStorageWidget::refreshBannerCards); +} + +/** + * @brief Retrieves the current text in the search bar. + * + * @return The text entered by the user in the search bar. + */ +QString VisualDeckStorageSearchWidget::getSearchText() +{ + return searchBar->text(); +} + +QStringList VisualDeckStorageSearchWidget::filterFiles(const QStringList &files, const QString &searchText) +{ + if (searchText.isEmpty() || searchText.isNull()) { + return files; + } + + QStringList filteredFiles; + + for (const auto &file : files) { + QFileInfo fileInfo(file); + QString fileName = fileInfo.fileName().toLower(); + + if (fileName.contains(searchText.toLower())) { + filteredFiles << file; + } + } + + return filteredFiles; +} + diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.h new file mode 100644 index 000000000..df5b7341c --- /dev/null +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_search_widget.h @@ -0,0 +1,27 @@ +#ifndef VISUAL_DECK_STORAGE_SEARCH_WIDGET_H +#define VISUAL_DECK_STORAGE_SEARCH_WIDGET_H + +#include "visual_deck_storage_widget.h" + +#include +#include +#include +#include + +class VisualDeckStorageWidget; +class VisualDeckStorageSearchWidget : public QWidget +{ + Q_OBJECT + +public: + explicit VisualDeckStorageSearchWidget(VisualDeckStorageWidget *parent); + QString getSearchText();QStringList filterFiles(const QStringList&files, const QString&searchText); + +private: + QHBoxLayout *layout; + VisualDeckStorageWidget *parent; + QLineEdit *searchBar; + QTimer *searchDebounceTimer; +}; + +#endif // VISUAL_DECK_STORAGE_SEARCH_WIDGET_H diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp index d1fd9e5cd..42278030e 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.cpp @@ -1,5 +1,6 @@ #include "visual_deck_storage_widget.h" +#include "visual_deck_storage_search_widget.h" #include "../../../../deck/deck_loader.h" #include "../../../../game/cards/card_database_manager.h" #include "../../../../settings/cache_settings.h" @@ -21,8 +22,11 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare sortComboBox->addItem("Sort Alphabetically (Filename)", Alphabetical); sortComboBox->addItem("Sort by Last Modified", ByLastModified); + searchWidget = new VisualDeckStorageSearchWidget(this); + // Add combo box to the main layout layout->addWidget(sortComboBox); + layout->addWidget(searchWidget); flowWidget = new FlowWidget(this, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); layout->addWidget(flowWidget); @@ -32,7 +36,11 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare sortOrder = static_cast(sortComboBox->currentData().toInt()); refreshBannerCards(); // Refresh the banner cards with the new sort order }); +} +void VisualDeckStorageWidget::showEvent(QShowEvent *event) +{ + QWidget::showEvent(event); refreshBannerCards(); } @@ -73,9 +81,11 @@ void VisualDeckStorageWidget::refreshBannerCards() return false; // Default case }); + auto filteredFiles = searchWidget->filterFiles(allFiles, searchWidget->getSearchText()); + flowWidget->clearLayout(); // Clear existing widgets in the flow layout - foreach (const QString &file, allFiles) { + foreach (const QString &file, filteredFiles) { qDebug() << file; auto deckLoader = new DeckLoader(); deckLoader->loadFromFile(file, DeckLoader::CockatriceFormat); diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.h index 66689d73e..4c53bc432 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_widget.h @@ -1,6 +1,7 @@ #ifndef VISUAL_DECK_STORAGE_WIDGET_H #define VISUAL_DECK_STORAGE_WIDGET_H +#include "visual_deck_storage_search_widget.h" #include "../../../../deck/deck_list_model.h" #include "../../../../deck/deck_view.h" #include "../../../ui/widgets/cards/deck_preview_card_picture_widget.h" @@ -8,6 +9,7 @@ #include +class VisualDeckStorageSearchWidget; class VisualDeckStorageWidget final : public QWidget { Q_OBJECT @@ -18,6 +20,8 @@ public: public slots: void imageClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); void imageDoubleClickedEvent(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); + void refreshBannerCards(); // Refresh the display of cards based on the current sorting option + void showEvent(QShowEvent *event) override; signals: void imageClicked(QMouseEvent *event, DeckPreviewCardPictureWidget *instance); @@ -36,7 +40,7 @@ private: QMap cardContainers; SortOrder sortOrder; // Current sorting option - void refreshBannerCards(); // Refresh the display of cards based on the current sorting option + VisualDeckStorageSearchWidget *searchWidget; }; #endif // VISUAL_DECK_STORAGE_WIDGET_H