From 17055f2e18528ce8e8b401e95d3f9a18240775ed Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 29 Jan 2024 11:13:06 +0100 Subject: [PATCH] Core: Add a MenuBuilder Use it in the AutoTest as example. Change-Id: I357faba71f685ea05206a7e1ca93069a88787823 Reviewed-by: Eike Ziller --- src/plugins/autotest/autotestplugin.cpp | 27 ++++++++------- .../actionmanager/actionmanager.cpp | 34 +++++++++++++++++++ .../coreplugin/actionmanager/actionmanager.h | 17 +++++++++- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/plugins/autotest/autotestplugin.cpp b/src/plugins/autotest/autotestplugin.cpp index 5c35a8e69af..2502b641464 100644 --- a/src/plugins/autotest/autotestplugin.cpp +++ b/src/plugins/autotest/autotestplugin.cpp @@ -161,16 +161,19 @@ TestProjectSettings *projectSettings(ProjectExplorer::Project *project) void AutotestPluginPrivate::initializeMenuEntries() { - ActionContainer *menu = ActionManager::createMenu(Constants::MENU_ID); - menu->menu()->setTitle(Tr::tr("&Tests")); - menu->setOnAllDisabledBehavior(ActionContainer::Show); + const Id menuId = Constants::MENU_ID; + + MenuBuilder(menuId) + .setTitle(Tr::tr("&Tests")) + .setOnAllDisabledBehavior(ActionContainer::Show) + .addToContainer(Core::Constants::M_TOOLS); ActionBuilder(this, Constants::ACTION_RUN_ALL_ID) .setText(Tr::tr("Run &All Tests")) .setIcon(Utils::Icons::RUN_SMALL.icon()) .setToolTip(Tr::tr("Run All Tests")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+A"), Tr::tr("Alt+Shift+T,Alt+A")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .setEnabled(false) .addOnTriggered(this, [this] { onRunAllTriggered(TestRunMode::Run); }); @@ -179,7 +182,7 @@ void AutotestPluginPrivate::initializeMenuEntries() .setIcon(Utils::Icons::RUN_SMALL.icon()) .setToolTip(Tr::tr("Run All Tests Without Deployment")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+E"), Tr::tr("Alt+Shift+T,Alt+E")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .setEnabled(false) .addOnTriggered(this, [this] { onRunAllTriggered(TestRunMode::RunWithoutDeploy); }); @@ -188,7 +191,7 @@ void AutotestPluginPrivate::initializeMenuEntries() .setIcon(Utils::Icons::RUN_SELECTED.icon()) .setToolTip(Tr::tr("Run Selected Tests")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+R"), Tr::tr("Alt+Shift+T,Alt+R")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .setEnabled(false) .addOnTriggered(this, [this] { onRunSelectedTriggered(TestRunMode::Run); }); @@ -197,7 +200,7 @@ void AutotestPluginPrivate::initializeMenuEntries() .setIcon(Utils::Icons::RUN_SELECTED.icon()) .setToolTip(Tr::tr("Run Selected Tests Without Deployment")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+W"), Tr::tr("Alt+Shift+T,Alt+W")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .setEnabled(false) .addOnTriggered(this, [this] { onRunSelectedTriggered(TestRunMode::RunWithoutDeploy); }); @@ -206,7 +209,7 @@ void AutotestPluginPrivate::initializeMenuEntries() .setIcon(Icons::RUN_FAILED.icon()) .setToolTip(Tr::tr("Run Failed Tests")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+F"), Tr::tr("Alt+Shift+T,Alt+F")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .setEnabled(false) .addOnTriggered(this, [this] { onRunFailedTriggered(); }); @@ -215,7 +218,7 @@ void AutotestPluginPrivate::initializeMenuEntries() .setIcon(Utils::Icons::RUN_FILE.icon()) .setToolTip(Tr::tr("Run Tests for Current File")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+C"), Tr::tr("Alt+Shift+T,Alt+C")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .setEnabled(false) .addOnTriggered(this, [this] { onRunFileTriggered(); }); @@ -224,13 +227,13 @@ void AutotestPluginPrivate::initializeMenuEntries() .setToolTip(Tr::tr("Disable scanning and other actions until explicitly rescanning, " "re-enabling, or restarting Qt Creator.")) .setCheckable(true) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .addOnTriggered(this, [this](bool on) { onDisableTemporarily(on); }); ActionBuilder(this, Constants::ACTION_SCAN_ID) .setText(Tr::tr("Re&scan Tests")) .setDefaultKeySequence(Tr::tr("Ctrl+Meta+T, Ctrl+Meta+S"), Tr::tr("Alt+Shift+T,Alt+S")) - .addToContainer(Constants::MENU_ID) + .addToContainer(menuId) .addOnTriggered(this, [] { if (dd->m_testCodeParser.state() == TestCodeParser::DisabledTemporarily) dd->onDisableTemporarily(false); // Rescan Test should explicitly re-enable @@ -238,8 +241,6 @@ void AutotestPluginPrivate::initializeMenuEntries() dd->m_testCodeParser.updateTestTree(); }); - ActionContainer *toolsMenu = ActionManager::actionContainer(Core::Constants::M_TOOLS); - toolsMenu->addMenu(menu); using namespace ProjectExplorer; connect(BuildManager::instance(), &BuildManager::buildStateChanged, this, &updateMenuItemsEnabledState); diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.cpp b/src/plugins/coreplugin/actionmanager/actionmanager.cpp index f2973d15659..c432b3b0e93 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.cpp +++ b/src/plugins/coreplugin/actionmanager/actionmanager.cpp @@ -432,6 +432,40 @@ void Menu::addSeparator() m_menu->addSeparator(); } +// MenuBuilder + +MenuBuilder::MenuBuilder(Id id) +{ + m_menu = ActionManager::createMenu(id); +} + +MenuBuilder::~MenuBuilder() = default; + +MenuBuilder &MenuBuilder::setTitle(const QString &title) +{ + m_menu->menu()->setTitle(title); + return *this; +} + +MenuBuilder &MenuBuilder::setOnAllDisabledBehavior(ActionContainer::OnAllDisabledBehavior behavior) +{ + m_menu->setOnAllDisabledBehavior(behavior); + return *this; +} + +MenuBuilder &MenuBuilder::addToContainer(Id containerId, Id groupId) +{ + ActionContainer *container = ActionManager::actionContainer(containerId); + if (QTC_GUARD(container)) + container->addMenu(m_menu, groupId); + return *this; +} + +MenuBuilder &MenuBuilder::addSeparator() +{ + m_menu->addSeparator(); + return *this; +} /*! \class Core::ActionManager \inheaderfile coreplugin/actionmanager/actionmanager.h diff --git a/src/plugins/coreplugin/actionmanager/actionmanager.h b/src/plugins/coreplugin/actionmanager/actionmanager.h index e71259c0c1b..8382985671a 100644 --- a/src/plugins/coreplugin/actionmanager/actionmanager.h +++ b/src/plugins/coreplugin/actionmanager/actionmanager.h @@ -6,6 +6,7 @@ #include "../core_global.h" #include "../coreconstants.h" #include "../icontext.h" +#include "actioncontainer.h" // For enum ActionContainer::OnAllDisabledBehavior #include "command.h" #include @@ -14,7 +15,6 @@ namespace Core { -class ActionContainer; class ICore; namespace Internal { @@ -115,6 +115,21 @@ private: ActionContainer *m_menu = nullptr; }; +class CORE_EXPORT MenuBuilder +{ +public: + MenuBuilder(Utils::Id menuId); + ~MenuBuilder(); + + MenuBuilder &setTitle(const QString &title); + MenuBuilder &setOnAllDisabledBehavior(ActionContainer::OnAllDisabledBehavior behavior); + MenuBuilder &addToContainer(Utils::Id containerId, Utils::Id groupId = {}); + MenuBuilder &addSeparator(); + +private: + ActionContainer *m_menu = nullptr; +}; + class CORE_EXPORT ActionSeparator { public: