Reduce redundant recursion in VDS (#5664)

* remove recursion from flattenFolderStructure

findChildren is already recursive by default

* only trigger the top-level updateVisibility on filter update

Every folder widget was connecting the filter update signals to their updateVisibility, but updateVisibility is already recursive.
That means a bunch of redundant updateVisibility calls happen every time a filter update signal is emitted

* reduce redundant recursion in updateVisibility

findChildren is recursive by default, so only the top-level updateVisibility needs to loop through the found children

* delete now-unused signals
This commit is contained in:
RickyRister
2025-03-04 16:56:31 -08:00
committed by GitHub
parent 2f415dcc6e
commit ecbdd32a2d
4 changed files with 18 additions and 40 deletions

View File

@@ -33,13 +33,6 @@ VisualDeckStorageFolderDisplayWidget::VisualDeckStorageFolderDisplayWidget(
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff);
containerLayout->addWidget(flowWidget);
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::tagFilterUpdated, this,
&VisualDeckStorageFolderDisplayWidget::updateVisibility);
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::colorFilterUpdated, this,
&VisualDeckStorageFolderDisplayWidget::updateVisibility);
connect(visualDeckStorageWidget, &VisualDeckStorageWidget::searchFilterUpdated, this,
&VisualDeckStorageFolderDisplayWidget::updateVisibility);
createWidgetsForFiles();
createWidgetsForFolders();
@@ -104,7 +97,12 @@ void VisualDeckStorageFolderDisplayWidget::createWidgetsForFiles()
}
}
void VisualDeckStorageFolderDisplayWidget::updateVisibility()
/**
* Updates the visibility of this folder and all its DeckPreviewWidgets
*
* @param recursive Also update the visibility of all subfolders and their DeckPreviewWidgets.
*/
void VisualDeckStorageFolderDisplayWidget::updateVisibility(bool recursive)
{
bool atLeastOneWidgetVisible = checkVisibility();
if (atLeastOneWidgetVisible) {
@@ -112,8 +110,10 @@ void VisualDeckStorageFolderDisplayWidget::updateVisibility()
for (DeckPreviewWidget *display : flowWidget->findChildren<DeckPreviewWidget *>()) {
display->updateVisibility();
}
for (VisualDeckStorageFolderDisplayWidget *subFolder : findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
subFolder->updateVisibility();
if (recursive) {
for (auto *subFolder : findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
subFolder->updateVisibility(false);
}
}
} else {
setVisible(false);
@@ -181,32 +181,13 @@ void VisualDeckStorageFolderDisplayWidget::updateShowFolders(bool enabled)
}
/**
* Recursively gets all DeckPreviewWidgets in this folder and its subfolders
*/
static QList<DeckPreviewWidget *> getAllDecksRecursive(VisualDeckStorageFolderDisplayWidget *folder)
{
QList<DeckPreviewWidget *> allDecks;
if (auto *flowWidget = folder->getFlowWidget()) {
// Iterate through all DeckPreviewWidgets in this folder
allDecks << flowWidget->findChildren<DeckPreviewWidget *>();
}
for (auto *subFolder : folder->findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
allDecks << getAllDecksRecursive(subFolder);
}
return allDecks;
}
/**
* Recursively steals all DeckPreviewWidgets from this widget's subfolders, and deletes all subfolders
* Steals all DeckPreviewWidgets from this widget's nested subfolders, and deletes those subfolders
*/
void VisualDeckStorageFolderDisplayWidget::flattenFolderStructure()
{
for (VisualDeckStorageFolderDisplayWidget *subFolder : findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
// steal all DeckPreviewWidgets from the subfolder and all its subfolders
for (auto *deck : getAllDecksRecursive(subFolder)) {
for (auto *subFolder : findChildren<VisualDeckStorageFolderDisplayWidget *>()) {
// steal all DeckPreviewWidgets from the subfolder
for (auto *deck : subFolder->getFlowWidget()->findChildren<DeckPreviewWidget *>()) {
flowWidget->addWidget(deck);
}

View File

@@ -28,7 +28,7 @@ public:
};
public slots:
void updateVisibility();
void updateVisibility(bool recursive = true);
bool checkVisibility();
void updateShowFolders(bool enabled);

View File

@@ -198,16 +198,16 @@ void VisualDeckStorageWidget::updateTagFilter()
{
if (folderWidget) {
tagFilterWidget->filterDecksBySelectedTags(folderWidget->findChildren<DeckPreviewWidget *>());
folderWidget->updateVisibility();
}
emit tagFilterUpdated();
}
void VisualDeckStorageWidget::updateColorFilter()
{
if (folderWidget) {
deckPreviewColorIdentityFilterWidget->filterWidgets(folderWidget->findChildren<DeckPreviewWidget *>());
folderWidget->updateVisibility();
}
emit colorFilterUpdated();
}
void VisualDeckStorageWidget::updateSearchFilter()
@@ -215,8 +215,8 @@ void VisualDeckStorageWidget::updateSearchFilter()
if (folderWidget) {
searchWidget->filterWidgets(folderWidget->findChildren<DeckPreviewWidget *>(), searchWidget->getSearchText(),
searchFolderNamesCheckBox->isChecked());
folderWidget->updateVisibility();
}
emit searchFilterUpdated();
}
void VisualDeckStorageWidget::updateTagsVisibility(const bool visible)

View File

@@ -46,9 +46,6 @@ signals:
void bannerCardsRefreshed();
void deckLoadRequested(const QString &filePath);
void openDeckEditor(const DeckLoader *deck);
void tagFilterUpdated();
void colorFilterUpdated();
void searchFilterUpdated();
private:
QVBoxLayout *layout;