From 1b918c95d431da1fe1a268161e8a0945a0303ecb Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 23 Sep 2021 13:18:57 +0200 Subject: [PATCH] Locator: Fix "Files in All Project Directories" filter That filter (by default included with 'a') could end up showing files from projects that were no longer open. In some situations the directories for this filter could be saved in the settings even though they are supposed to be automatically managed when opening and closing projects. It could happend that they never were removed again, for example after saving the locator settings via apply in the options dialog, and then killing Qt Creator. Simply never save or restore which directories the filter handles, and the file cache, by overriding the save/restoreState methods. Change-Id: I2912d64443b5e5ec5a21e0df61d14ffda799a0e7 Reviewed-by: Christian Kandeler --- .../coreplugin/locator/directoryfilter.h | 4 +- .../projectexplorer/projectexplorer.cpp | 51 ++++++++++++++++--- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/plugins/coreplugin/locator/directoryfilter.h b/src/plugins/coreplugin/locator/directoryfilter.h index c629722ac2a..ea17dc4f9b5 100644 --- a/src/plugins/coreplugin/locator/directoryfilter.h +++ b/src/plugins/coreplugin/locator/directoryfilter.h @@ -60,8 +60,8 @@ public: void setExclusionFilters(const QStringList &exclusionFilters); protected: - void saveState(QJsonObject &object) const final; - void restoreState(const QJsonObject &object) final; + void saveState(QJsonObject &object) const override; + void restoreState(const QJsonObject &object) override; private: void handleAddDirectory(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index b776a9dec91..e1f0629878b 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -154,6 +154,7 @@ #include #include #include +#include #include #include #include @@ -396,6 +397,15 @@ public: } }; +class AllProjectFilesFilter : public DirectoryFilter +{ +public: + AllProjectFilesFilter(); + +protected: + void saveState(QJsonObject &object) const override; + void restoreState(const QJsonObject &object) override; +}; class ProjectExplorerPluginPrivate : public QObject { @@ -626,7 +636,7 @@ public: AllProjectsFilter m_allProjectsFilter; CurrentProjectFilter m_currentProjectFilter; - DirectoryFilter m_allProjectDirectoriesFilter; + AllProjectFilesFilter m_allProjectDirectoriesFilter; ProcessStepFactory m_processStepFactory; @@ -2848,14 +2858,7 @@ bool ProjectExplorerPlugin::saveModifiedFiles() // because someone delete all build configurations ProjectExplorerPluginPrivate::ProjectExplorerPluginPrivate() - : m_allProjectDirectoriesFilter("Files in All Project Directories") { - m_allProjectDirectoriesFilter.setDisplayName(m_allProjectDirectoriesFilter.id().toString()); - // shared with "Files in Any Project": - m_allProjectDirectoriesFilter.setDefaultShortcutString("a"); - m_allProjectDirectoriesFilter.setDefaultIncludedByDefault(false); // but not included in default - m_allProjectDirectoriesFilter.setFilters({}); - m_allProjectDirectoriesFilter.setIsCustomFilter(false); } void ProjectExplorerPluginPrivate::runProjectContextMenu() @@ -4163,4 +4166,36 @@ bool ProjectManager::canOpenProjectForMimeType(const MimeType &mt) return false; } +AllProjectFilesFilter::AllProjectFilesFilter() + : DirectoryFilter("Files in All Project Directories") +{ + setDisplayName(id().toString()); + // shared with "Files in Any Project": + setDefaultShortcutString("a"); + setDefaultIncludedByDefault(false); // but not included in default + setFilters({}); + setIsCustomFilter(false); +} + +const char kDirectoriesKey[] = "directories"; +const char kFilesKey[] = "files"; + +void AllProjectFilesFilter::saveState(QJsonObject &object) const +{ + DirectoryFilter::saveState(object); + // do not save the directories, they are automatically managed + object.remove(kDirectoriesKey); + object.remove(kFilesKey); +} + +void AllProjectFilesFilter::restoreState(const QJsonObject &object) +{ + // do not restore the directories (from saved settings from Qt Creator <= 5, + // they are automatically managed + QJsonObject withoutDirectories = object; + withoutDirectories.remove(kDirectoriesKey); + withoutDirectories.remove(kFilesKey); + DirectoryFilter::restoreState(withoutDirectories); +} + } // namespace ProjectExplorer