From 1329da6980fc5555b69c9dae949dc82eea0603f3 Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sat, 8 Feb 2025 16:06:56 -0800 Subject: [PATCH 1/4] rename sort method and leave comment --- .../visual_deck_storage_sort_widget.cpp | 15 +++++++++------ .../visual_deck_storage_sort_widget.h | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) 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 8b5356c08..dce95444d 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 @@ -70,17 +70,22 @@ void VisualDeckStorageSortWidget::sortFolder(VisualDeckStorageFolderDisplayWidge for (auto widget : children) { auto deckPreviewWidgets = widget->findChildren(QString(), Qt::FindChildOption::FindDirectChildrenOnly); - auto newOrder = filterFiles(deckPreviewWidgets); - for (DeckPreviewWidget *previewWidget : newOrder) { + sortDecks(deckPreviewWidgets); + for (DeckPreviewWidget *previewWidget : deckPreviewWidgets) { folderWidget->getFlowWidget()->removeWidget(previewWidget); } - for (DeckPreviewWidget *previewWidget : newOrder) { + for (DeckPreviewWidget *previewWidget : deckPreviewWidgets) { folderWidget->getFlowWidget()->addWidget(previewWidget); } } } -QList VisualDeckStorageSortWidget::filterFiles(QList widgets) +/** + * Sorts the DeckPreviewWidget list in-place, using the currently selected sortOrder + * + * @param widgets The list of widgets to sort + */ +void VisualDeckStorageSortWidget::sortDecks(QList widgets) { // Sort the widgets list based on the current sort order std::sort(widgets.begin(), widgets.end(), [this](DeckPreviewWidget *widget1, DeckPreviewWidget *widget2) { @@ -107,6 +112,4 @@ QList VisualDeckStorageSortWidget::filterFiles(QList filterFiles(QList widgets); + void sortDecks(QList widgets); signals: void sortOrderChanged(); From 0ef3aef12d051648e3b4e2d0bf9af2eb9ef971fe Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sat, 8 Feb 2025 17:09:06 -0800 Subject: [PATCH 2/4] refactor sorting in VDS --- ...ual_deck_storage_folder_display_widget.cpp | 26 +++++++++++++++++ ...isual_deck_storage_folder_display_widget.h | 1 + .../visual_deck_storage_sort_widget.cpp | 29 ++++--------------- .../visual_deck_storage_sort_widget.h | 4 +-- .../visual_deck_storage_widget.cpp | 6 +--- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp index b198d06bd..8725b8bd7 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp @@ -180,6 +180,32 @@ void VisualDeckStorageFolderDisplayWidget::updateShowFolders(bool enabled) header->setHidden(!showFolders); } +/** + * Sorts the DeckPreviewWidgets in this folder and all subfolders + * + * @param comparator The comparator to use for sorting + */ +void VisualDeckStorageFolderDisplayWidget::sortBy( + const std::function &comparator) +{ + auto deckPreviewWidgets = flowWidget->findChildren(); + + std::sort(deckPreviewWidgets.begin(), deckPreviewWidgets.end(), comparator); + + // manually removing and re-adding is the only way to reorder widgets in a flowWidget + for (DeckPreviewWidget *previewWidget : deckPreviewWidgets) { + flowWidget->removeWidget(previewWidget); + } + for (DeckPreviewWidget *previewWidget : deckPreviewWidgets) { + flowWidget->addWidget(previewWidget); + } + + // also sort all subfolders + for (auto *subFolder : findChildren()) { + subFolder->sortBy(comparator); + } +} + /** * Steals all DeckPreviewWidgets from this widget's nested subfolders, and deletes those subfolders */ diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h index 747bcf8bd..7c7bf9556 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h @@ -20,6 +20,7 @@ public: void refreshUi(); void createWidgetsForFiles(); void createWidgetsForFolders(); + void sortBy(const std::function &comparator); void flattenFolderStructure(); QStringList gatherAllTagsFromFlowWidget() const; FlowWidget *getFlowWidget() const 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 dce95444d..c907de239 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 @@ -63,32 +63,13 @@ void VisualDeckStorageSortWidget::updateSortOrder() emit sortOrderChanged(); } -void VisualDeckStorageSortWidget::sortFolder(VisualDeckStorageFolderDisplayWidget *folderWidget) -{ - auto children = - folderWidget->getFlowWidget()->findChildren(QString(), Qt::FindChildOption::FindDirectChildrenOnly); - for (auto widget : children) { - auto deckPreviewWidgets = - widget->findChildren(QString(), Qt::FindChildOption::FindDirectChildrenOnly); - sortDecks(deckPreviewWidgets); - for (DeckPreviewWidget *previewWidget : deckPreviewWidgets) { - folderWidget->getFlowWidget()->removeWidget(previewWidget); - } - for (DeckPreviewWidget *previewWidget : deckPreviewWidgets) { - folderWidget->getFlowWidget()->addWidget(previewWidget); - } - } -} - /** - * Sorts the DeckPreviewWidget list in-place, using the currently selected sortOrder - * - * @param widgets The list of widgets to sort + * Gets the comparator that is used for the current sortOrder */ -void VisualDeckStorageSortWidget::sortDecks(QList widgets) +std::function VisualDeckStorageSortWidget::getComparator() const { // Sort the widgets list based on the current sort order - std::sort(widgets.begin(), widgets.end(), [this](DeckPreviewWidget *widget1, DeckPreviewWidget *widget2) { + return [this](DeckPreviewWidget *widget1, DeckPreviewWidget *widget2) { if (!widget1 || !widget2) { return false; // Handle null pointers gracefully } @@ -111,5 +92,5 @@ void VisualDeckStorageSortWidget::sortDecks(QList widgets) } return false; // Default case, no sorting applied - }); -} + }; +} \ No newline at end of file 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 c6e32b5a5..6b0c06dbf 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 @@ -17,9 +17,9 @@ public: explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent); void retranslateUi(); void updateSortOrder(); - void sortFolder(VisualDeckStorageFolderDisplayWidget *folderWidget); + std::function getComparator() const; + QString getSearchText(); - void sortDecks(QList widgets); signals: void sortOrderChanged(); 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 8ac228410..6a501ec6b 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 @@ -197,11 +197,7 @@ void VisualDeckStorageWidget::updateShowFolders(bool enabled) void VisualDeckStorageWidget::updateSortOrder() { if (folderWidget) { - sortWidget->sortFolder(folderWidget); - for (VisualDeckStorageFolderDisplayWidget *subFolderWidget : - folderWidget->findChildren()) { - sortWidget->sortFolder(subFolderWidget); - } + folderWidget->sortBy(sortWidget->getComparator()); } } From d987664feadddf53dd382d858570408ae5ae7cac Mon Sep 17 00:00:00 2001 From: RickyRister Date: Fri, 21 Feb 2025 13:26:36 -0800 Subject: [PATCH 3/4] capture just sortOrder instead of whole object --- .../visual_deck_storage/visual_deck_storage_sort_widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c907de239..5eacb564e 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 @@ -69,7 +69,7 @@ void VisualDeckStorageSortWidget::updateSortOrder() std::function VisualDeckStorageSortWidget::getComparator() const { // Sort the widgets list based on the current sort order - return [this](DeckPreviewWidget *widget1, DeckPreviewWidget *widget2) { + return [sortOrder = sortOrder](const DeckPreviewWidget *widget1, const DeckPreviewWidget *widget2) { if (!widget1 || !widget2) { return false; // Handle null pointers gracefully } From a4e26922446e6ef193fe6d8587489d38409c85ce Mon Sep 17 00:00:00 2001 From: RickyRister Date: Sun, 2 Mar 2025 03:28:02 -0800 Subject: [PATCH 4/4] reduce redundant recursion --- .../visual_deck_storage_folder_display_widget.cpp | 14 +++++++++----- .../visual_deck_storage_folder_display_widget.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp index 8725b8bd7..c2e4408a5 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.cpp @@ -181,12 +181,14 @@ void VisualDeckStorageFolderDisplayWidget::updateShowFolders(bool enabled) } /** - * Sorts the DeckPreviewWidgets in this folder and all subfolders + * Sorts the DeckPreviewWidgets in this folder * * @param comparator The comparator to use for sorting + * @param recursive Also sort all nested subfolders */ void VisualDeckStorageFolderDisplayWidget::sortBy( - const std::function &comparator) + const std::function &comparator, + bool recursive) { auto deckPreviewWidgets = flowWidget->findChildren(); @@ -200,9 +202,11 @@ void VisualDeckStorageFolderDisplayWidget::sortBy( flowWidget->addWidget(previewWidget); } - // also sort all subfolders - for (auto *subFolder : findChildren()) { - subFolder->sortBy(comparator); + if (recursive) { + // also sort all subfolders + for (auto *subFolder : findChildren()) { + subFolder->sortBy(comparator, false); + } } } diff --git a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h index 7c7bf9556..bd72fc0c3 100644 --- a/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h +++ b/cockatrice/src/client/ui/widgets/visual_deck_storage/visual_deck_storage_folder_display_widget.h @@ -20,7 +20,7 @@ public: void refreshUi(); void createWidgetsForFiles(); void createWidgetsForFolders(); - void sortBy(const std::function &comparator); + void sortBy(const std::function &comparator, bool recursive = true); void flattenFolderStructure(); QStringList gatherAllTagsFromFlowWidget() const; FlowWidget *getFlowWidget() const