diff --git a/kdevplatform/shell/mainwindow_p.cpp b/kdevplatform/shell/mainwindow_p.cpp --- a/kdevplatform/shell/mainwindow_p.cpp +++ b/kdevplatform/shell/mainwindow_p.cpp @@ -42,6 +42,7 @@ #include "core.h" #include "partdocument.h" #include "partcontroller.h" +#include "plugincontroller.h" #include "uicontroller.h" #include "statusbar.h" #include "mainwindow.h" @@ -57,7 +58,7 @@ #include #include #include - +#include namespace KDevelop { @@ -84,6 +85,25 @@ location->layout()->addWidget(m_statusBar); } +void sortMenuAlphabetically(QMenu* menu) +{ + auto actions = menu->actions(); + for (auto action : qAsConst(actions)) { + menu->removeAction(action); + } + + std::sort(actions.begin(), actions.end(), [](const QAction* left, const QAction* right) { + const auto leftPlainText = left->text().remove(QLatin1Char('&')); + const auto rightPlainText = right->text().remove(QLatin1Char('&')); + + return (leftPlainText.localeAwareCompare(rightPlainText) < 0); + }); + + for (auto action : qAsConst(actions)) { + menu->addAction(action); + } +} + void MainWindowPrivate::addPlugin( IPlugin *plugin ) { qCDebug(SHELL) << "add plugin" << plugin << plugin->componentName(); @@ -101,6 +121,21 @@ connect(plugin, &IPlugin::destroyed, this, &MainWindowPrivate::pluginDestroyed); m_mainWindow->guiFactory()->addClient(ownClient); } + + // Ensure alphabetical order in "Analzye Current * With" submenus + const auto info = Core::self()->pluginController()->pluginInfo(plugin); + if (info.category() == QStringLiteral("Analyzers")) { + auto fileMenu = static_cast( + m_mainWindow->guiFactory()->container(QStringLiteral("analyze_file"), m_mainWindow)); + Q_ASSERT(fileMenu); + + auto projectMenu = static_cast( + m_mainWindow->guiFactory()->container(QStringLiteral("analyze_project"), m_mainWindow)); + Q_ASSERT(projectMenu); + + sortMenuAlphabetically(fileMenu); + sortMenuAlphabetically(projectMenu); + } } void MainWindowPrivate::pluginDestroyed(QObject* pluginObj)