This commit is contained in:
RickyRister 2025-09-18 21:21:35 -07:00 committed by GitHub
commit 4681f00c39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 41 additions and 30 deletions

View file

@ -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<bool(DeckPreviewWidget *, DeckPreviewWidget *)> &comparator,
bool recursive)
{
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);
}
if (recursive) {
// also sort all subfolders
for (auto *subFolder : findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
subFolder->sortBy(comparator, false);
}
}
}
/**
* Steals all DeckPreviewWidgets from this widget's nested subfolders, and deletes those subfolders
*/

View file

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

View file

@ -63,27 +63,13 @@ void VisualDeckStorageSortWidget::updateSortOrder()
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);
auto newOrder = filterFiles(deckPreviewWidgets);
for (DeckPreviewWidget *previewWidget : newOrder) {
folderWidget->getFlowWidget()->removeWidget(previewWidget);
}
for (DeckPreviewWidget *previewWidget : newOrder) {
folderWidget->getFlowWidget()->addWidget(previewWidget);
}
}
}
QList<DeckPreviewWidget *> VisualDeckStorageSortWidget::filterFiles(QList<DeckPreviewWidget *> widgets)
/**
* Gets the comparator that is used for the current sortOrder
*/
std::function<bool(DeckPreviewWidget *, DeckPreviewWidget *)> 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<DeckPreviewWidget *> VisualDeckStorageSortWidget::filterFiles(QList<DeckPr
}
return false; // Default case, no sorting applied
});
return widgets;
}
};
}

View file

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

View file

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