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/mainwindow.cpp | 66 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 17 deletions(-) (limited to 'src/mainwindow.cpp') 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); } } -- cgit v1.3.1