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()); } }