diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index fc8c32e0694..a64ec2ea986 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -360,7 +360,7 @@ static FileInfos sortedFileInfos(const QVector &proj static RunSettings runSettings() { if (Project *project = SessionManager::startupProject()) { - auto *projectSettings = ClangToolsProjectSettingsManager::getSettings(project); + const auto projectSettings = ClangToolsProjectSettings::getSettings(project); if (!projectSettings->useGlobalSettings()) return projectSettings->runSettings(); } @@ -1075,7 +1075,7 @@ static FileInfos fileInfosMatchingEditedDocuments(const FileInfos &fileInfos) FileInfoProviders ClangTool::fileInfoProviders(ProjectExplorer::Project *project, const FileInfos &allFileInfos) { - ClangToolsProjectSettings *s = ClangToolsProjectSettingsManager::getSettings(project); + const QSharedPointer s = ClangToolsProjectSettings::getSettings(project); static FileInfoSelection openedFilesSelection; static FileInfoSelection editeddFilesSelection; diff --git a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp index c7e96b382d8..b04db2da3be 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticmodel.cpp @@ -591,13 +591,13 @@ void DiagnosticFilterModel::setProject(ProjectExplorer::Project *project) { QTC_ASSERT(project, return); if (m_project) { - disconnect(ClangToolsProjectSettingsManager::getSettings(m_project), + disconnect(ClangToolsProjectSettings::getSettings(m_project).data(), &ClangToolsProjectSettings::suppressedDiagnosticsChanged, this, &DiagnosticFilterModel::handleSuppressedDiagnosticsChanged); } m_project = project; m_lastProjectDirectory = m_project->projectDirectory(); - connect(ClangToolsProjectSettingsManager::getSettings(m_project), + connect(ClangToolsProjectSettings::getSettings(m_project).data(), &ClangToolsProjectSettings::suppressedDiagnosticsChanged, this, &DiagnosticFilterModel::handleSuppressedDiagnosticsChanged); handleSuppressedDiagnosticsChanged(); @@ -755,7 +755,7 @@ void DiagnosticFilterModel::handleSuppressedDiagnosticsChanged() { QTC_ASSERT(m_project, return); m_suppressedDiagnostics - = ClangToolsProjectSettingsManager::getSettings(m_project)->suppressedDiagnostics(); + = ClangToolsProjectSettings::getSettings(m_project)->suppressedDiagnostics(); invalidate(); } diff --git a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp index cf88a37c627..9e6f9d4b921 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp @@ -210,7 +210,7 @@ void DiagnosticView::suppressCurrentDiagnostic() if (!relativeFilePath.isEmpty()) filePath = relativeFilePath; const SuppressedDiagnostic supDiag(filePath, diag.description, diag.explainingSteps.count()); - ClangToolsProjectSettingsManager::getSettings(project)->addSuppressedDiagnostic(supDiag); + ClangToolsProjectSettings::getSettings(project)->addSuppressedDiagnostic(supDiag); } else { filterModel->addSuppressedDiagnostic(SuppressedDiagnostic(diag)); } diff --git a/src/plugins/clangtools/clangtoolsplugin.cpp b/src/plugins/clangtools/clangtoolsplugin.cpp index e9e04e8eb33..ebc85223f46 100644 --- a/src/plugins/clangtools/clangtoolsplugin.cpp +++ b/src/plugins/clangtools/clangtoolsplugin.cpp @@ -95,7 +95,6 @@ class ClangToolsPluginPrivate public: ClangTool clangTool; ClangToolsOptionsPage optionsPage; - ClangToolsProjectSettingsManager settingsManager; }; ClangToolsPlugin::~ClangToolsPlugin() diff --git a/src/plugins/clangtools/clangtoolsprojectsettings.cpp b/src/plugins/clangtools/clangtoolsprojectsettings.cpp index c7d692704e6..e83c3b36f12 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettings.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettings.cpp @@ -178,29 +178,19 @@ void ClangToolsProjectSettings::store() m_project->setNamedSettings(SETTINGS_KEY_MAIN, map); } -ClangToolsProjectSettingsManager::ClangToolsProjectSettingsManager() +ClangToolsProjectSettings::ClangToolsProjectSettingsPtr + ClangToolsProjectSettings::getSettings(ProjectExplorer::Project *project) { - QObject::connect(ProjectExplorer::SessionManager::instance(), - &ProjectExplorer::SessionManager::aboutToRemoveProject, - &ClangToolsProjectSettingsManager::handleProjectToBeRemoved); + const QString key = "ClangToolsProjectSettings"; + QVariant v = project->extraData(key); + if (v.isNull()) { + v = QVariant::fromValue( + ClangToolsProjectSettingsPtr{new ClangToolsProjectSettings(project)}); + project->setExtraData(key, v); + } + return v.value>(); } -ClangToolsProjectSettings *ClangToolsProjectSettingsManager::getSettings( - ProjectExplorer::Project *project) -{ - auto &settings = m_settings[project]; - if (!settings) - settings.reset(new ClangToolsProjectSettings(project)); - return settings.data(); -} - -void ClangToolsProjectSettingsManager::handleProjectToBeRemoved(ProjectExplorer::Project *project) -{ - m_settings.remove(project); -} - -ClangToolsProjectSettingsManager::SettingsMap ClangToolsProjectSettingsManager::m_settings; - SuppressedDiagnostic::SuppressedDiagnostic(const Diagnostic &diag) : filePath(Utils::FilePath::fromString(diag.location.filePath)) , description(diag.description) diff --git a/src/plugins/clangtools/clangtoolsprojectsettings.h b/src/plugins/clangtools/clangtoolsprojectsettings.h index aaf045f056c..1b872c3c317 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettings.h +++ b/src/plugins/clangtools/clangtoolsprojectsettings.h @@ -87,6 +87,9 @@ public: void removeSuppressedDiagnostic(const SuppressedDiagnostic &diag); void removeAllSuppressedDiagnostics(); + using ClangToolsProjectSettingsPtr = QSharedPointer; + static ClangToolsProjectSettingsPtr getSettings(ProjectExplorer::Project *project); + signals: void suppressedDiagnosticsChanged(); @@ -106,19 +109,7 @@ private: SuppressedDiagnosticsList m_suppressedDiagnostics; }; -class ClangToolsProjectSettingsManager -{ -public: - ClangToolsProjectSettingsManager(); - - static ClangToolsProjectSettings *getSettings(ProjectExplorer::Project *project); - -private: - static void handleProjectToBeRemoved(ProjectExplorer::Project *project); - - using SettingsMap = QHash>; - static SettingsMap m_settings; -}; - } // namespace Internal } // namespace ClangTools + +Q_DECLARE_METATYPE(QSharedPointer) diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp index b7a8c14a423..0e88791c428 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.cpp @@ -70,7 +70,7 @@ enum { UseGlobalSettings, UseCustomSettings }; // Values in sync with m_ui->glob ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project, QWidget *parent) : QWidget(parent), m_ui(new Ui::ProjectSettingsWidget) - , m_projectSettings(ClangToolsProjectSettingsManager::getSettings(project)) + , m_projectSettings(ClangToolsProjectSettings::getSettings(project)) { m_ui->setupUi(this); @@ -117,7 +117,7 @@ ProjectSettingsWidget::ProjectSettingsWidget(ProjectExplorer::Project *project, // Suppressed diagnostics auto * const model = new SuppressedDiagnosticsModel(this); model->setDiagnostics(m_projectSettings->suppressedDiagnostics()); - connect(m_projectSettings, &ClangToolsProjectSettings::suppressedDiagnosticsChanged, + connect(m_projectSettings.data(), &ClangToolsProjectSettings::suppressedDiagnosticsChanged, [model, this] { model->setDiagnostics(m_projectSettings->suppressedDiagnostics()); updateButtonStates(); diff --git a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h index b26fee90e3c..a5b0a6267d9 100644 --- a/src/plugins/clangtools/clangtoolsprojectsettingswidget.h +++ b/src/plugins/clangtools/clangtoolsprojectsettingswidget.h @@ -53,7 +53,7 @@ private: void removeSelected(); Ui::ProjectSettingsWidget *const m_ui; - ClangToolsProjectSettings *const m_projectSettings; + QSharedPointer const m_projectSettings; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 99afeb3df05..c549b53e832 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -206,6 +206,8 @@ public: Utils::MacroExpander m_macroExpander; Utils::FilePath m_rootProjectDirectory; mutable QVector m_sortedNodeList; + + QVariantMap m_extraData; }; ProjectPrivate::~ProjectPrivate() @@ -990,6 +992,16 @@ void Project::setPreferredKitPredicate(const Kit::Predicate &predicate) d->m_preferredKitPredicate = predicate; } +void Project::setExtraData(const QString &key, const QVariant &data) +{ + d->m_extraData.insert(key, data); +} + +QVariant Project::extraData(const QString &key) const +{ + return d->m_extraData.value(key); +} + #if defined(WITH_TESTS) } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 4e1118ca92c..bc2bee3b457 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -173,6 +173,9 @@ public: void setProjectLanguage(Core::Id id, bool enabled); void addProjectLanguage(Core::Id id); + void setExtraData(const QString &key, const QVariant &data); + QVariant extraData(const QString &key) const; + signals: void projectFileIsDirty(const Utils::FilePath &path);