mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-03-12 21:22:55 -07:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ public:
|
||||
};
|
||||
|
||||
public slots:
|
||||
void updateVisibility();
|
||||
void updateVisibility(bool recursive = true);
|
||||
bool checkVisibility();
|
||||
void updateShowFolders(bool enabled);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user