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 index 383755175..397c3367b 100644 --- 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 @@ -38,22 +38,23 @@ QString VisualDeckStorageSearchWidget::getSearchText() return searchBar->text(); } -QStringList VisualDeckStorageSearchWidget::filterFiles(const QStringList &files, const QString &searchText) +QList VisualDeckStorageSearchWidget::filterFiles(QList &widgets, + const QString &searchText) { if (searchText.isEmpty() || searchText.isNull()) { - return files; + return widgets; } - QStringList filteredFiles; + QList filteredWidgets; - for (const auto &file : files) { - QFileInfo fileInfo(file); + for (const auto &file : widgets) { + QFileInfo fileInfo(file->filePath); QString fileName = fileInfo.fileName().toLower(); if (fileName.contains(searchText.toLower())) { - filteredFiles << file; + filteredWidgets << file; } } - return filteredFiles; + return filteredWidgets; } 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 index e136c5491..880cc4a47 100644 --- 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 @@ -16,7 +16,7 @@ class VisualDeckStorageSearchWidget : public QWidget public: explicit VisualDeckStorageSearchWidget(VisualDeckStorageWidget *parent); QString getSearchText(); - QStringList filterFiles(const QStringList &files, const QString &searchText); + QList filterFiles(QList &widgets, const QString &searchText); private: QHBoxLayout *layout; diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp index c9a1dacef..c75003af1 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.cpp @@ -18,8 +18,10 @@ VisualDeckStorageSortWidget::VisualDeckStorageSortWidget(VisualDeckStorageWidget // ComboBox for sorting options sortComboBox = new QComboBox(this); + sortComboBox->addItem("Sort Alphabetically (Deck Name)", ByName); sortComboBox->addItem("Sort Alphabetically (Filename)", Alphabetical); sortComboBox->addItem("Sort by Last Modified", ByLastModified); + sortComboBox->addItem("Sort by Last Loaded", ByLastLoaded); // Connect sorting change signal to refresh the file list connect(sortComboBox, QOverload::of(&QComboBox::currentIndexChanged), this, @@ -42,22 +44,30 @@ void VisualDeckStorageSortWidget::updateSortOrder() emit sortOrderChanged(); } -QStringList VisualDeckStorageSortWidget::filterFiles(QStringList &files) +QList &VisualDeckStorageSortWidget::filterFiles(QList &widgets) { - // Sort files based on the current sort order - std::sort(files.begin(), files.end(), [this](const QString &file1, const QString &file2) { - QFileInfo info1(file1); - QFileInfo info2(file2); + // Sort the widgets list based on the current sort order + std::sort(widgets.begin(), widgets.end(), [this](DeckPreviewWidget *widget1, DeckPreviewWidget *widget2) { + if (!widget1 || !widget2) { + return false; // Handle null pointers gracefully + } + + QFileInfo info1(widget1->filePath); + QFileInfo info2(widget2->filePath); switch (sortOrder) { + case ByName: + return widget1->deckLoader->getName() < widget2->deckLoader->getName(); case Alphabetical: return info1.fileName().toLower() < info2.fileName().toLower(); case ByLastModified: return info1.lastModified() > info2.lastModified(); + case ByLastLoaded: + return widget1->deckLoader->getLastLoadedTimestamp() > widget2->deckLoader->getLastLoadedTimestamp(); } - return false; // Default case + return false; // Default case, no sorting applied }); - return files; + return widgets; } diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.h index e826a6391..aac6b6711 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_sort_widget.h @@ -16,7 +16,7 @@ public: explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent); void updateSortOrder(); QString getSearchText(); - QStringList filterFiles(QStringList &files); + QList &filterFiles(QList &widgets); public slots: void showEvent(QShowEvent *event) override; @@ -28,7 +28,9 @@ private: enum SortOrder { Alphabetical, - ByLastModified + ByLastModified, + ByLastLoaded, + ByName, }; QHBoxLayout *layout; VisualDeckStorageWidget *parent; 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 237474480..381f17a71 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 @@ -58,6 +58,7 @@ void VisualDeckStorageWidget::deckPreviewDoubleClickedEvent(QMouseEvent *event, void VisualDeckStorageWidget::refreshBannerCards() { QStringList allFiles; + QList allDecks; // QDirIterator with QDir::Files and QDir::NoSymLinks ensures only files are listed (no directories or symlinks) QDirIterator it(SettingsCache::instance().getDeckPath(), QDir::Files | QDir::NoSymLinks, @@ -67,11 +68,7 @@ void VisualDeckStorageWidget::refreshBannerCards() allFiles << it.next(); // Add each file path to the list } - auto filteredFiles = searchWidget->filterFiles(sortWidget->filterFiles(allFiles), searchWidget->getSearchText()); - - flowWidget->clearLayout(); // Clear existing widgets in the flow layout - - foreach (const QString &file, filteredFiles) { + foreach (const QString &file, allFiles) { auto *display = new DeckPreviewWidget(flowWidget, file); connect(display, &DeckPreviewWidget::deckPreviewClicked, this, @@ -81,6 +78,14 @@ void VisualDeckStorageWidget::refreshBannerCards() connect(cardSizeWidget->getSlider(), &QSlider::valueChanged, display->bannerCardDisplayWidget, &CardInfoPictureWidget::setScaleFactor); display->bannerCardDisplayWidget->setScaleFactor(cardSizeWidget->getSlider()->value()); - flowWidget->addWidget(display); + allDecks.append(display); + } + + auto filteredFiles = searchWidget->filterFiles(sortWidget->filterFiles(allDecks), searchWidget->getSearchText()); + + flowWidget->clearLayout(); // Clear existing widgets in the flow layout + + foreach (DeckPreviewWidget *deck, filteredFiles) { + flowWidget->addWidget(deck); } }