From b2f5ed78e187fe57308549dde306563c7a9520e3 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 25 Nov 2019 10:09:21 +0100 Subject: [PATCH] ClangTools: Add "go to project settings" toolbar button With the introduction of the "Analyze Current File" action the widget to configure the diagnostic config was moved to the project panel (Project mode > Project Settings > Clang Tools). As not too many users are aware of the project settings there and navigating there involves more user interation now (mode switch, looking for the "Clang Tools" item), add a toolbar button as a shortcut. Change-Id: I4c864045ef41ff501d925d3175ce604def213f29 Reviewed-by: hjk Reviewed-by: Leena Miettinen Reviewed-by: Christian Kandeler --- src/plugins/clangtools/clangtool.cpp | 11 ++++++++++ src/plugins/clangtools/clangtool.h | 1 + src/plugins/clangtools/clangtoolsconstants.h | 2 ++ src/plugins/clangtools/clangtoolsplugin.cpp | 10 ++++++++- src/plugins/clangtools/clangtoolsplugin.h | 4 ++++ .../projectexplorer/projectexplorer.cpp | 6 +++++ src/plugins/projectexplorer/projectexplorer.h | 2 ++ .../projectexplorer/projectpanelfactory.cpp | 10 +++++++++ .../projectexplorer/projectpanelfactory.h | 6 +++++ src/plugins/projectexplorer/projectwindow.cpp | 22 +++++++++++++++++++ src/plugins/projectexplorer/projectwindow.h | 4 ++++ 11 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 607b78680cd..780a38c4ffa 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -33,6 +33,7 @@ #include "clangtoolsdiagnosticmodel.h" #include "clangtoolsdiagnosticview.h" #include "clangtoolslogfilereader.h" +#include "clangtoolsplugin.h" #include "clangtoolsprojectsettings.h" #include "clangtoolssettings.h" #include "clangtoolsutils.h" @@ -399,6 +400,15 @@ ClangTool::ClangTool() ApplyFixIts(diagnosticItems).apply(m_diagnosticModel); }); + // Open Project Settings + action = new QAction(this); + action->setIcon(Utils::Icons::SETTINGS_TOOLBAR.icon()); + //action->setToolTip(tr("Open Project Settings")); // TODO: Uncomment in master. + connect(action, &QAction::triggered, []() { + ProjectExplorerPlugin::activateProjectPanel(Constants::PROJECT_PANEL_ID); + }); + m_openProjectSettings = action; + ActionContainer *menu = ActionManager::actionContainer(Debugger::Constants::M_DEBUG_ANALYZER); const QString toolTip = tr("Clang-Tidy and Clazy use a customized Clang executable from the " "Clang project to search for diagnostics."); @@ -424,6 +434,7 @@ ClangTool::ClangTool() m_perspective.addToolBarAction(m_startAction); m_perspective.addToolBarAction(m_startOnCurrentFileAction); m_perspective.addToolBarAction(m_stopAction); + m_perspective.addToolBarAction(m_openProjectSettings); m_perspective.addToolBarAction(m_loadExported); m_perspective.addToolBarAction(m_clear); m_perspective.addToolBarAction(m_goBack); diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index bde31d355dc..d994a6b2f9c 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -129,6 +129,7 @@ private: Utils::FancyLineEdit *m_filterLineEdit = nullptr; QToolButton *m_applyFixitsButton = nullptr; + QAction *m_openProjectSettings = nullptr; QAction *m_goBack = nullptr; QAction *m_goNext = nullptr; QAction *m_loadExported = nullptr; diff --git a/src/plugins/clangtools/clangtoolsconstants.h b/src/plugins/clangtools/clangtoolsconstants.h index a3da1d78f54..8f09865b1c1 100644 --- a/src/plugins/clangtools/clangtoolsconstants.h +++ b/src/plugins/clangtools/clangtoolsconstants.h @@ -28,6 +28,8 @@ namespace ClangTools { namespace Constants { +const char PROJECT_PANEL_ID[] = "ClangTools"; + const char RUN_ON_PROJECT[] = "ClangTools.RunOnProject"; const char RUN_ON_CURRENT_FILE[] = "ClangTools.RunOnCurrentFile"; diff --git a/src/plugins/clangtools/clangtoolsplugin.cpp b/src/plugins/clangtools/clangtoolsplugin.cpp index cdcda4d3c6e..b53901e95ac 100644 --- a/src/plugins/clangtools/clangtoolsplugin.cpp +++ b/src/plugins/clangtools/clangtoolsplugin.cpp @@ -67,6 +67,13 @@ using namespace ProjectExplorer; namespace ClangTools { namespace Internal { +static ProjectPanelFactory *m_projectPanelFactoryInstance = nullptr; + +ProjectPanelFactory *projectPanelFactory() +{ + return m_projectPanelFactoryInstance; +} + class ClangToolsOptionsPage : public IOptionsPage { public: @@ -123,8 +130,9 @@ bool ClangToolsPlugin::initialize(const QStringList &arguments, QString *errorSt ActionManager::registerAction(d->clangTool.startOnCurrentFileAction(), Constants::RUN_ON_CURRENT_FILE); - auto panelFactory = new ProjectPanelFactory(); + auto panelFactory = m_projectPanelFactoryInstance = new ProjectPanelFactory; panelFactory->setPriority(100); + panelFactory->setId(Constants::PROJECT_PANEL_ID); panelFactory->setDisplayName(tr("Clang Tools")); panelFactory->setCreateWidgetFunction([](Project *project) { return new ProjectSettingsWidget(project); }); ProjectPanelFactory::registerFactory(panelFactory); diff --git a/src/plugins/clangtools/clangtoolsplugin.h b/src/plugins/clangtools/clangtoolsplugin.h index 7f24d79f4bc..30c28b276b9 100644 --- a/src/plugins/clangtools/clangtoolsplugin.h +++ b/src/plugins/clangtools/clangtoolsplugin.h @@ -27,9 +27,13 @@ #include +namespace ProjectExplorer { class ProjectPanelFactory; } + namespace ClangTools { namespace Internal { +ProjectExplorer::ProjectPanelFactory *projectPanelFactory(); + class ClangToolsPlugin : public ExtensionSystem::IPlugin { Q_OBJECT diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 30fdbcc58a0..96f46a11c9e 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3903,6 +3903,12 @@ void ProjectExplorerPlugin::updateActions() dd->updateActions(); } +void ProjectExplorerPlugin::activateProjectPanel(Core::Id panelId) +{ + Core::ModeManager::activateMode(Constants::MODE_SESSION); + dd->m_proWindow->activateProjectPanel(panelId); +} + QList > ProjectExplorerPlugin::recentProjects() { return dd->recentProjects(); diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index feb53ccdef2..5b1617e1828 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -172,6 +172,8 @@ public: static void updateActions(); + static void activateProjectPanel(Core::Id panelId); + signals: void finishedInitialization(); diff --git a/src/plugins/projectexplorer/projectpanelfactory.cpp b/src/plugins/projectexplorer/projectpanelfactory.cpp index d734b8d336d..c4eaef05b4c 100644 --- a/src/plugins/projectexplorer/projectpanelfactory.cpp +++ b/src/plugins/projectexplorer/projectpanelfactory.cpp @@ -80,6 +80,16 @@ void ProjectPanelFactory::destroyFactories() s_factories.clear(); } +Core::Id ProjectPanelFactory::id() const +{ + return m_id; +} + +void ProjectPanelFactory::setId(Core::Id id) +{ + m_id = id; +} + QString ProjectPanelFactory::icon() const { return m_icon; diff --git a/src/plugins/projectexplorer/projectpanelfactory.h b/src/plugins/projectexplorer/projectpanelfactory.h index 27e643b0ed2..6d031253982 100644 --- a/src/plugins/projectexplorer/projectpanelfactory.h +++ b/src/plugins/projectexplorer/projectpanelfactory.h @@ -30,6 +30,8 @@ #include "panelswidget.h" #include "projectwindow.h" +#include + #include #include @@ -44,6 +46,9 @@ class PROJECTEXPLORER_EXPORT ProjectPanelFactory public: ProjectPanelFactory(); + Core::Id id() const; + void setId(Core::Id id); + // simple properties QString displayName() const; void setDisplayName(const QString &name); @@ -78,6 +83,7 @@ private: friend class ProjectExplorerPlugin; static void destroyFactories(); + Core::Id m_id; int m_priority = 0; QString m_displayName; SupportsFunction m_supportsFunction; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index dfa20793e31..d72f7812ffe 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -84,6 +84,8 @@ public: Qt::ItemFlags flags(int column) const override; bool setData(int column, const QVariant &, int role) override; + ProjectPanelFactory *factory() const { return m_factory; } + protected: ProjectPanelFactory *m_factory = nullptr; QPointer m_project; @@ -281,6 +283,13 @@ public: return activeItem ? activeItem->index() : QModelIndex(); } + TreeItem *itemForProjectPanel(Core::Id panelId) + { + return m_miscItem->findChildAtLevel(1, [panelId](const TreeItem *item){ + return static_cast(item)->factory()->id() == panelId; + }); + } + private: int m_currentChildIndex = 0; // Start with Build & Run. Project *m_project = nullptr; @@ -497,6 +506,14 @@ public: item->setData(0, QVariant(), ItemActivatedDirectlyRole); } + void activateProjectPanel(Core::Id panelId) + { + if (ProjectItem *projectItem = m_projectsModel.rootItem()->childAt(0)) { + if (TreeItem *item = projectItem->itemForProjectPanel(panelId)) + itemActivated(item->index()); + } + } + void openContextMenu(const QPoint &pos) { QMenu menu; @@ -606,6 +623,11 @@ ProjectWindow::ProjectWindow() setContextMenuPolicy(Qt::CustomContextMenu); } +void ProjectWindow::activateProjectPanel(Core::Id panelId) +{ + d->activateProjectPanel(panelId); +} + ProjectWindow::~ProjectWindow() = default; QSize SelectorDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const diff --git a/src/plugins/projectexplorer/projectwindow.h b/src/plugins/projectexplorer/projectwindow.h index 1aeeb882f92..01840951ab1 100644 --- a/src/plugins/projectexplorer/projectwindow.h +++ b/src/plugins/projectexplorer/projectwindow.h @@ -31,6 +31,8 @@ #include +namespace Core { class Id; } + namespace ProjectExplorer { namespace Internal { @@ -60,6 +62,8 @@ public: ProjectWindow(); ~ProjectWindow() override; + void activateProjectPanel(Core::Id panelId); + private: const std::unique_ptr d; };