Cppcheck: Treat manual run settings as project settings

Instead of always deriving from global settings store the
settings for the manual run into the project settings.

Fixes: QTCREATORBUG-31092
Change-Id: I7854cff4e71b58225c7e9c1198c4e60128ed07e4
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Stenger
2024-07-01 13:56:25 +02:00
parent 6cb0c69c43
commit 6d4e5a0002
3 changed files with 62 additions and 11 deletions

View File

@@ -19,10 +19,12 @@
namespace Cppcheck::Internal { namespace Cppcheck::Internal {
ManualRunDialog::ManualRunDialog(const ProjectExplorer::Project *project) ManualRunDialog::ManualRunDialog(const ProjectExplorer::Project *project,
CppcheckSettings *settings)
: m_model(new ProjectExplorer::SelectableFilesFromDirModel(this)) : m_model(new ProjectExplorer::SelectableFilesFromDirModel(this))
{ {
QTC_ASSERT(project, return ); QTC_ASSERT(project, return );
QTC_ASSERT(settings, return);
setWindowTitle(Tr::tr("Cppcheck Run Configuration")); setWindowTitle(Tr::tr("Cppcheck Run Configuration"));
@@ -52,9 +54,7 @@ ManualRunDialog::ManualRunDialog(const ProjectExplorer::Project *project)
analyzeButton->setEnabled(m_model->hasCheckedFiles()); analyzeButton->setEnabled(m_model->hasCheckedFiles());
}); });
m_manualRunSettings.readSettings(); auto optionsWidget = settings->layouter()().emerge();
m_manualRunSettings.setAutoApply(true);
auto optionsWidget = m_manualRunSettings.layouter()().emerge();
auto layout = new QVBoxLayout(this); auto layout = new QVBoxLayout(this);
layout->addWidget(optionsWidget); layout->addWidget(optionsWidget);

View File

@@ -3,8 +3,6 @@
#pragma once #pragma once
#include "cppchecksettings.h"
#include <QDialog> #include <QDialog>
namespace Utils { namespace Utils {
@@ -19,18 +17,18 @@ class SelectableFilesFromDirModel;
namespace Cppcheck::Internal { namespace Cppcheck::Internal {
class CppcheckSettings;
class ManualRunDialog : public QDialog class ManualRunDialog : public QDialog
{ {
public: public:
explicit ManualRunDialog(const ProjectExplorer::Project *project); explicit ManualRunDialog(const ProjectExplorer::Project *project, CppcheckSettings *settings);
Utils::FilePaths filePaths() const; Utils::FilePaths filePaths() const;
QSize sizeHint() const override; QSize sizeHint() const override;
const CppcheckSettings &manualRunSettings() const { return m_manualRunSettings; }
private: private:
ProjectExplorer::SelectableFilesFromDirModel *m_model; ProjectExplorer::SelectableFilesFromDirModel *m_model;
CppcheckSettings m_manualRunSettings;
}; };
} // Cppcheck::Internal } // Cppcheck::Internal

View File

@@ -40,6 +40,7 @@ class CppcheckPluginPrivate final : public QObject
{ {
public: public:
explicit CppcheckPluginPrivate(); explicit CppcheckPluginPrivate();
~CppcheckPluginPrivate();
CppcheckTextMarkManager marks; CppcheckTextMarkManager marks;
CppcheckTool tool{marks, Constants::CHECK_PROGRESS_ID}; CppcheckTool tool{marks, Constants::CHECK_PROGRESS_ID};
@@ -49,9 +50,12 @@ public:
Utils::Perspective perspective{Constants::PERSPECTIVE_ID, ::Cppcheck::Tr::tr("Cppcheck")}; Utils::Perspective perspective{Constants::PERSPECTIVE_ID, ::Cppcheck::Tr::tr("Cppcheck")};
Action *manualRunAction = nullptr; Action *manualRunAction = nullptr;
QHash<Project *, CppcheckSettings *> projectSettings;
void startManualRun(); void startManualRun();
void updateManualRunAction(); void updateManualRunAction();
void saveProjectSettings(Project *project);
void loadProjectSettings(Project *project);
}; };
CppcheckPluginPrivate::CppcheckPluginPrivate() CppcheckPluginPrivate::CppcheckPluginPrivate()
@@ -104,6 +108,29 @@ CppcheckPluginPrivate::CppcheckPluginPrivate()
action, &QAction::setEnabled); action, &QAction::setEnabled);
perspective.addToolBarAction(action); perspective.addToolBarAction(action);
} }
connect(ProjectManager::instance(), &ProjectManager::startupProjectChanged,
this, [this](Project *project) {
if (!project)
return;
CppcheckSettings *settings = projectSettings.value(project, nullptr);
if (!settings) {
settings = new CppcheckSettings;
settings->readSettings();
settings->setAutoApply(true);
connect(project, &Project::aboutToSaveSettings,
this, [this, project]{ saveProjectSettings(project); });
connect(project, &Project::settingsLoaded,
this, [this, project]{ loadProjectSettings(project); });
projectSettings.insert(project, settings);
loadProjectSettings(project);
}
});
}
CppcheckPluginPrivate::~CppcheckPluginPrivate()
{
qDeleteAll(projectSettings);
projectSettings.clear();
} }
void CppcheckPluginPrivate::startManualRun() void CppcheckPluginPrivate::startManualRun()
@@ -112,7 +139,9 @@ void CppcheckPluginPrivate::startManualRun()
if (!project) if (!project)
return; return;
ManualRunDialog dialog(project); CppcheckSettings *settings = projectSettings.value(project, nullptr);
QTC_ASSERT(settings, return);
ManualRunDialog dialog(project, settings);
if (dialog.exec() == ManualRunDialog::Rejected) if (dialog.exec() == ManualRunDialog::Rejected)
return; return;
@@ -123,7 +152,7 @@ void CppcheckPluginPrivate::startManualRun()
return; return;
manualRunTool.setProject(project); manualRunTool.setProject(project);
manualRunTool.updateOptions(dialog.manualRunSettings()); manualRunTool.updateOptions(*settings);
manualRunTool.check(files); manualRunTool.check(files);
perspective.select(); perspective.select();
} }
@@ -138,6 +167,30 @@ void CppcheckPluginPrivate::updateManualRunAction()
manualRunAction->setEnabled(canRun); manualRunAction->setEnabled(canRun);
} }
void CppcheckPluginPrivate::saveProjectSettings(Project *project)
{
QTC_ASSERT(project, return);
CppcheckSettings *settings = projectSettings.value(project, nullptr);
QTC_ASSERT(settings, return);
Store store;
settings->toMap(store);
project->setNamedSettings("CppcheckManual", Utils::variantFromStore(store));
}
void CppcheckPluginPrivate::loadProjectSettings(Project *project)
{
QTC_ASSERT(project, return);
CppcheckSettings *settings = projectSettings.value(project, nullptr);
QTC_ASSERT(settings, return);
const QVariant variant = project->namedSettings("CppcheckManual");
if (!variant.isValid())
return;
Store store = Utils::storeFromVariant(project->namedSettings("CppcheckManual"));
settings->fromMap(store);
}
class CppcheckPlugin final : public ExtensionSystem::IPlugin class CppcheckPlugin final : public ExtensionSystem::IPlugin
{ {
Q_OBJECT Q_OBJECT