From dac716bb86a9e4ff514fe7d939f33b397dc120e5 Mon Sep 17 00:00:00 2001 From: LostDragonist Date: Tue, 11 Dec 2018 14:15:37 -0600 Subject: Allow tool plugins to define a submenu with the display name Setting the display name to "/" will group plugins under the submenu. --- src/iuserinterface.h | 5 +++- src/mainwindow.cpp | 66 ++++++++++++++++++++++++++++++++++++++-------------- src/mainwindow.h | 3 ++- 3 files changed, 55 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/iuserinterface.h b/src/iuserinterface.h index 7ce71c24..034fa029 100644 --- a/src/iuserinterface.h +++ b/src/iuserinterface.h @@ -8,6 +8,8 @@ #include #include +#include + class QSettings; class IUserInterface @@ -16,7 +18,8 @@ public: virtual void storeSettings(QSettings &settings) = 0; - virtual void registerPluginTool(MOBase::IPluginTool *tool) = 0; + virtual void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr) = 0; + virtual void registerPluginTools(std::vector toolPlugins) = 0; virtual void registerModPage(MOBase::IPluginModPage *modPage) = 0; virtual void installTranslator(const QString &name) = 0; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b06eb44d..61a745b2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -267,7 +267,7 @@ MainWindow::MainWindow(QSettings &initSettings // insert spacers ui->toolBar->insertWidget(action, spacer); m_Sep = action; - // m_Sep would only use the last seperator anyway, and we only have the one anyway? + // m_Sep would only use the last separator anyway, and we only have the one anyway? break; } } @@ -437,15 +437,7 @@ MainWindow::MainWindow(QSettings &initSettings installTranslator(QFileInfo(fileName).baseName()); } - std::vector toolPlugins = m_PluginContainer.plugins(); - std::sort(toolPlugins.begin(), toolPlugins.end(), - [](IPluginTool *left, IPluginTool *right){ - return left->displayName().toLower() < right->displayName().toLower(); - } - ); - for (IPluginTool *toolPlugin : toolPlugins) { - registerPluginTool(toolPlugin); - } + registerPluginTools(m_PluginContainer.plugins()); for (IPluginModPage *modPagePlugin : m_PluginContainer.plugins()) { registerModPage(modPagePlugin); @@ -1046,15 +1038,57 @@ void MainWindow::modPagePluginInvoke() } } -void MainWindow::registerPluginTool(IPluginTool *tool) +void MainWindow::registerPluginTool(IPluginTool *tool, QString name, QMenu *menu) { - QAction *action = new QAction(tool->icon(), tool->displayName(), ui->toolBar); + if (name.isEmpty()) + name = tool->displayName(); + + QAction *action = new QAction(tool->icon(), name, ui->toolBar); action->setToolTip(tool->tooltip()); tool->setParentWidget(this); action->setData(qVariantFromValue((QObject*)tool)); connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection); - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); - toolBtn->menu()->addAction(action); + + if (menu == nullptr) { + QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); + toolBtn->menu()->addAction(action); + } else { + menu->addAction(action); + } +} + +void MainWindow::registerPluginTools(std::vector toolPlugins) +{ + // Sort the plugins by display name + std::sort(toolPlugins.begin(), toolPlugins.end(), + [](IPluginTool *left, IPluginTool *right) { + return left->displayName().toLower() < right->displayName().toLower(); + } + ); + + // Group the plugins into submenus + QMap>> submenuMap; + for (auto toolPlugin : toolPlugins) { + QStringList toolName = toolPlugin->displayName().split("/"); + QString submenu = toolName[0]; + toolName.pop_front(); + submenuMap[submenu].append(QPair(toolName.join("/"), toolPlugin)); + } + + // Start registering plugins + for (auto submenuKey : submenuMap.keys()) { + if (submenuMap[submenuKey].length() > 1) { + QMenu *submenu = new QMenu(submenuKey, this); + for (auto info : submenuMap[submenuKey]) { + registerPluginTool(info.second, info.first, submenu); + } + QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); + toolBtn->menu()->addMenu(submenu); + } + else { + registerPluginTool(submenuMap[submenuKey].front().second); + } + } } void MainWindow::registerModPage(IPluginModPage *modPage) @@ -1171,7 +1205,6 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director std::wostringstream temp; temp << directorySoFar << "\\" << directoryEntry.getName(); { - std::vector::const_iterator current, end; directoryEntry.getSubDirectories(current, end); for (; current != end; ++current) { @@ -1275,7 +1308,6 @@ void MainWindow::updateTo(QTreeWidgetItem *subTree, const std::wstring &director } } - //subTree->sortChildren(0, Qt::AscendingOrder); } @@ -2845,7 +2877,7 @@ void MainWindow::openOriginExplorer_clicked() QString fileName = idx.data().toString(); ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName))); std::vector flags = modInfo->getFlags(); - + ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index d5484400..69d08337 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -132,7 +132,8 @@ public: void saveArchiveList(); - void registerPluginTool(MOBase::IPluginTool *tool); + void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr); + void registerPluginTools(std::vector toolPlugins); void registerModPage(MOBase::IPluginModPage *modPage); void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info); -- cgit v1.3.1