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 319393775..f1c67bf98 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 @@ -186,6 +186,36 @@ void VisualDeckStorageFolderDisplayWidget::updateShowFolders(bool enabled) header->setHidden(!showFolders); } +/** + * 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, + bool recursive) +{ + 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); + } + + if (recursive) { + // also sort all subfolders + for (auto *subFolder : findChildren()) { + subFolder->sortBy(comparator, false); + } + } +} + /** * 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..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,6 +20,7 @@ public: void refreshUi(); void createWidgetsForFiles(); void createWidgetsForFolders(); + void sortBy(const std::function &comparator, bool recursive = true); 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 8b5356c08..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 @@ -63,27 +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); - auto newOrder = filterFiles(deckPreviewWidgets); - for (DeckPreviewWidget *previewWidget : newOrder) { - folderWidget->getFlowWidget()->removeWidget(previewWidget); - } - for (DeckPreviewWidget *previewWidget : newOrder) { - folderWidget->getFlowWidget()->addWidget(previewWidget); - } - } -} - -QList VisualDeckStorageSortWidget::filterFiles(QList widgets) +/** + * Gets the comparator that is used for the current sortOrder + */ +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 [sortOrder = sortOrder](const DeckPreviewWidget *widget1, const DeckPreviewWidget *widget2) { if (!widget1 || !widget2) { return false; // Handle null pointers gracefully } @@ -106,7 +92,5 @@ QList VisualDeckStorageSortWidget::filterFiles(QList getComparator() const; + QString getSearchText(); - QList filterFiles(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 47a2a8b9d..3f5b452b2 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 @@ -167,11 +167,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()); } }