From 0653a14a02da1d25d6cb82a423b2082216cf0af3 Mon Sep 17 00:00:00 2001 From: RickyRister Date: Thu, 6 Feb 2025 23:07:14 -0800 Subject: [PATCH] get it to work --- ...ual_deck_storage_folder_display_widget.cpp | 67 +++++++++++++++++-- ...isual_deck_storage_folder_display_widget.h | 6 +- .../visual_deck_storage_widget.cpp | 9 ++- 3 files changed, 72 insertions(+), 10 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 833707b5e..e977bde22 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 @@ -10,8 +10,9 @@ VisualDeckStorageFolderDisplayWidget::VisualDeckStorageFolderDisplayWidget( QWidget *parent, VisualDeckStorageWidget *_visualDeckStorageWidget, QString _filePath, - bool canBeHidden) - : QWidget(parent), visualDeckStorageWidget(_visualDeckStorageWidget), filePath(_filePath) + bool canBeHidden, + bool _showFolders) + : QWidget(parent), showFolders(_showFolders), visualDeckStorageWidget(_visualDeckStorageWidget), filePath(_filePath) { layout = new QVBoxLayout(this); setLayout(layout); @@ -63,12 +64,14 @@ void VisualDeckStorageFolderDisplayWidget::refreshUi() header->setText(bannerText); } -static QStringList getAllFiles(const QString &filePath) +static QStringList getAllFiles(const QString &filePath, bool recursive) { QStringList allFiles; // QDirIterator with QDir::Files ensures only files are listed (no directories) - QDirIterator it(filePath, QDir::Files); + auto flags = + recursive ? QDirIterator::Subdirectories | QDirIterator::FollowSymlinks : QDirIterator::NoIteratorFlags; + QDirIterator it(filePath, QDir::Files, flags); while (it.hasNext()) { allFiles << it.next(); // Add each file path to the list @@ -80,7 +83,7 @@ static QStringList getAllFiles(const QString &filePath) void VisualDeckStorageFolderDisplayWidget::createWidgetsForFiles() { QList allDecks; - for (const QString &file : getAllFiles(filePath)) { + for (const QString &file : getAllFiles(filePath, !showFolders)) { auto *display = new DeckPreviewWidget(flowWidget, visualDeckStorageWidget, file); connect(display, &DeckPreviewWidget::deckPreviewClicked, visualDeckStorageWidget, @@ -151,12 +154,64 @@ static QStringList getAllSubFolders(const QString &filePath) void VisualDeckStorageFolderDisplayWidget::createWidgetsForFolders() { + if (!showFolders) { + return; + } + for (const QString &dir : getAllSubFolders(filePath)) { - auto *display = new VisualDeckStorageFolderDisplayWidget(this, visualDeckStorageWidget, dir, true); + auto *display = new VisualDeckStorageFolderDisplayWidget(this, visualDeckStorageWidget, dir, true, showFolders); containerLayout->addWidget(display); } } +void VisualDeckStorageFolderDisplayWidget::updateShowFolders(bool enabled) +{ + showFolders = enabled; + + if (!showFolders) { + flattenFolderStructure(); + } else { + // if setting was switched from disabled to enabled, we assume that there isn't any existing subfolders + createWidgetsForFiles(); + createWidgetsForFolders(); + } +} + +/** + * Recursively gets all DeckPreviewWidgets in this folder and its subfolders + */ +static QList getAllDecksRecursive(VisualDeckStorageFolderDisplayWidget *folder) +{ + QList allDecks; + + if (auto *flowWidget = folder->getFlowWidget()) { + // Iterate through all DeckPreviewWidgets in this folder + allDecks << flowWidget->findChildren(); + } + + for (auto *subFolder : folder->findChildren()) { + allDecks << getAllDecksRecursive(subFolder); + } + + return allDecks; +} + +/** + * Recursively steals all DeckPreviewWidgets from this widget's subfolders, and deletes all subfolders + */ +void VisualDeckStorageFolderDisplayWidget::flattenFolderStructure() +{ + for (VisualDeckStorageFolderDisplayWidget *subFolder : findChildren()) { + // steal all DeckPreviewWidgets from the subfolder and all its subfolders + for (auto *deck : getAllDecksRecursive(subFolder)) { + flowWidget->addWidget(deck); + } + + // delete the subfolder + subFolder->deleteLater(); + } +} + QStringList VisualDeckStorageFolderDisplayWidget::gatherAllTagsFromFlowWidget() const { QStringList allTags; 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 fa590a5a5..d149e4d27 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 @@ -15,10 +15,12 @@ public: VisualDeckStorageFolderDisplayWidget(QWidget *parent, VisualDeckStorageWidget *_visualDeckStorageWidget, QString _filePath, - bool canBeHidden); + bool canBeHidden, + bool _showFolders); void refreshUi(); void createWidgetsForFiles(); void createWidgetsForFolders(); + void flattenFolderStructure(); QStringList gatherAllTagsFromFlowWidget() const; FlowWidget *getFlowWidget() const { @@ -28,8 +30,10 @@ public: public slots: void updateVisibility(); bool checkVisibility(); + void updateShowFolders(bool enabled); private: + bool showFolders; QVBoxLayout *layout; VisualDeckStorageWidget *visualDeckStorageWidget; QString filePath; 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 b0637abe7..09a1fc4e4 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 @@ -56,8 +56,6 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - folderWidget = new VisualDeckStorageFolderDisplayWidget(this, this, SettingsCache::instance().getDeckPath(), false); - scrollArea->setWidget(folderWidget); scrollArea->setWidgetResizable(true); @@ -123,7 +121,12 @@ void VisualDeckStorageWidget::deckPreviewDoubleClickedEvent(QMouseEvent *event, void VisualDeckStorageWidget::createRootFolderWidget() { - folderWidget = new VisualDeckStorageFolderDisplayWidget(this, this, SettingsCache::instance().getDeckPath(), false); + folderWidget = + new VisualDeckStorageFolderDisplayWidget(this, this, SettingsCache::instance().getDeckPath(), false, false); + + connect(showFoldersCheckBox, &QCheckBox::QT_STATE_CHANGED, folderWidget, + &VisualDeckStorageFolderDisplayWidget::updateShowFolders); + scrollArea->setWidget(folderWidget); scrollArea->widget()->setMaximumWidth(scrollArea->viewport()->width()); scrollArea->widget()->adjustSize();