refactor sorting in VDS

This commit is contained in:
RickyRister 2025-02-08 17:09:06 -08:00
parent 1329da6980
commit 0ef3aef12d
5 changed files with 35 additions and 31 deletions

View file

@ -180,6 +180,32 @@ void VisualDeckStorageFolderDisplayWidget::updateShowFolders(bool enabled)
header->setHidden(!showFolders); 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<bool(DeckPreviewWidget *, DeckPreviewWidget *)> &comparator)
{
auto deckPreviewWidgets = flowWidget->findChildren<DeckPreviewWidget *>();
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<VisualDeckStorageFolderDisplayWidget *>()) {
subFolder->sortBy(comparator);
}
}
/** /**
* Steals all DeckPreviewWidgets from this widget's nested subfolders, and deletes those subfolders * Steals all DeckPreviewWidgets from this widget's nested subfolders, and deletes those subfolders
*/ */

View file

@ -20,6 +20,7 @@ public:
void refreshUi(); void refreshUi();
void createWidgetsForFiles(); void createWidgetsForFiles();
void createWidgetsForFolders(); void createWidgetsForFolders();
void sortBy(const std::function<bool(DeckPreviewWidget *, DeckPreviewWidget *)> &comparator);
void flattenFolderStructure(); void flattenFolderStructure();
QStringList gatherAllTagsFromFlowWidget() const; QStringList gatherAllTagsFromFlowWidget() const;
FlowWidget *getFlowWidget() const FlowWidget *getFlowWidget() const

View file

@ -63,32 +63,13 @@ void VisualDeckStorageSortWidget::updateSortOrder()
emit sortOrderChanged(); emit sortOrderChanged();
} }
void VisualDeckStorageSortWidget::sortFolder(VisualDeckStorageFolderDisplayWidget *folderWidget)
{
auto children =
folderWidget->getFlowWidget()->findChildren<QWidget *>(QString(), Qt::FindChildOption::FindDirectChildrenOnly);
for (auto widget : children) {
auto deckPreviewWidgets =
widget->findChildren<DeckPreviewWidget *>(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 * Gets the comparator that is used for the current sortOrder
*
* @param widgets The list of widgets to sort
*/ */
void VisualDeckStorageSortWidget::sortDecks(QList<DeckPreviewWidget *> widgets) std::function<bool(DeckPreviewWidget *, DeckPreviewWidget *)> VisualDeckStorageSortWidget::getComparator() const
{ {
// Sort the widgets list based on the current sort order // 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) { if (!widget1 || !widget2) {
return false; // Handle null pointers gracefully return false; // Handle null pointers gracefully
} }
@ -111,5 +92,5 @@ void VisualDeckStorageSortWidget::sortDecks(QList<DeckPreviewWidget *> widgets)
} }
return false; // Default case, no sorting applied return false; // Default case, no sorting applied
}); };
} }

View file

@ -17,9 +17,9 @@ public:
explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent); explicit VisualDeckStorageSortWidget(VisualDeckStorageWidget *parent);
void retranslateUi(); void retranslateUi();
void updateSortOrder(); void updateSortOrder();
void sortFolder(VisualDeckStorageFolderDisplayWidget *folderWidget); std::function<bool(DeckPreviewWidget *, DeckPreviewWidget *)> getComparator() const;
QString getSearchText(); QString getSearchText();
void sortDecks(QList<DeckPreviewWidget *> widgets);
signals: signals:
void sortOrderChanged(); void sortOrderChanged();

View file

@ -197,11 +197,7 @@ void VisualDeckStorageWidget::updateShowFolders(bool enabled)
void VisualDeckStorageWidget::updateSortOrder() void VisualDeckStorageWidget::updateSortOrder()
{ {
if (folderWidget) { if (folderWidget) {
sortWidget->sortFolder(folderWidget); folderWidget->sortBy(sortWidget->getComparator());
for (VisualDeckStorageFolderDisplayWidget *subFolderWidget :
folderWidget->findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
sortWidget->sortFolder(subFolderWidget);
}
} }
} }