diff options
| author | Mikaël Capelle <capelle.mikael@gmail.com> | 2020-11-11 14:59:11 +0100 |
|---|---|---|
| committer | Mikaël Capelle <capelle.mikael@gmail.com> | 2020-11-11 20:30:34 +0100 |
| commit | e528d8b0ad843bf2e728f26c3a1bade145e5ad07 (patch) | |
| tree | 8fe5db18546af9e7dbaa55dabe22a90da805d13e | |
| parent | 0dddc5eb7b60efd4f124485fd6e3e982c04f8a28 (diff) | |
Fix display of tools in the MainWindow menu.
| -rw-r--r-- | src/iuserinterface.h | 2 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 51 | ||||
| -rw-r--r-- | src/mainwindow.h | 9 | ||||
| -rw-r--r-- | src/plugincontainer.cpp | 4 | ||||
| -rw-r--r-- | src/settingsdialogplugins.cpp | 9 |
5 files changed, 34 insertions, 41 deletions
diff --git a/src/iuserinterface.h b/src/iuserinterface.h index cce89070..a2a91e62 100644 --- a/src/iuserinterface.h +++ b/src/iuserinterface.h @@ -13,8 +13,6 @@ class IUserInterface
{
public:
- virtual void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr) = 0;
- virtual void registerPluginTools(std::vector<MOBase::IPluginTool *> 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 9bbe3da9..b5a6382f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -467,6 +467,7 @@ MainWindow::MainWindow(Settings &settings connect(ui->toolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(toolBar_customContextMenuRequested(QPoint))); connect(ui->menuToolbars, &QMenu::aboutToShow, [&]{ updateToolbarMenu(); }); connect(ui->menuView, &QMenu::aboutToShow, [&]{ updateViewMenu(); }); + connect(ui->actionTool->menu(), &QMenu::aboutToShow, [&] { updateToolMenu(); }); connect(&m_OrganizerCore, &OrganizerCore::modInstalled, this, &MainWindow::modInstalled); connect(&m_OrganizerCore, &OrganizerCore::close, this, &QMainWindow::close); @@ -508,8 +509,6 @@ MainWindow::MainWindow(Settings &settings installTranslator(QFileInfo(fileName).baseName()); } - registerPluginTools(m_PluginContainer.plugins<IPluginTool>()); - for (IPluginModPage *modPagePlugin : m_PluginContainer.plugins<IPluginModPage>()) { registerModPage(modPagePlugin); } @@ -1597,22 +1596,6 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event) return false; } - -void MainWindow::toolPluginInvoke() -{ - QAction *triggeredAction = qobject_cast<QAction*>(sender()); - IPluginTool *plugin = qobject_cast<IPluginTool*>(triggeredAction->data().value<QObject*>()); - if (plugin != nullptr) { - try { - plugin->display(); - } catch (const std::exception &e) { - reportError(tr("Plugin \"%1\" failed: %2").arg(plugin->name()).arg(e.what())); - } catch (...) { - reportError(tr("Plugin \"%1\" failed").arg(plugin->name())); - } - } -} - void MainWindow::modPagePluginInvoke() { QAction *triggeredAction = qobject_cast<QAction*>(sender()); @@ -1648,24 +1631,42 @@ void MainWindow::registerPluginTool(IPluginTool *tool, QString name, QMenu *menu QAction *action = new QAction(tool->icon(), name, menu); action->setToolTip(tool->tooltip()); tool->setParentWidget(this); - action->setData(QVariant::fromValue((QObject*)tool)); - connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection); + connect(action, &QAction::triggered, this, [this, tool]() { + try { + tool->display(); + } + catch (const std::exception& e) { + reportError(tr("Plugin \"%1\" failed: %2").arg(tool->localizedName()).arg(e.what())); + } + catch (...) { + reportError(tr("Plugin \"%1\" failed").arg(tool->localizedName())); + } + }, Qt::QueuedConnection); menu->addAction(action); - if (!m_PluginContainer.isEnabled(tool)) { - action->setVisible(false); - } } -void MainWindow::registerPluginTools(std::vector<IPluginTool *> toolPlugins) +void MainWindow::updateToolMenu() { + // Clear the menu: + ui->actionTool->menu()->clear(); + + std::vector<IPluginTool*> toolPlugins = m_PluginContainer.plugins<IPluginTool>(); + // Sort the plugins by display name - std::sort(toolPlugins.begin(), toolPlugins.end(), + std::sort(std::begin(toolPlugins), std::end(toolPlugins), [](IPluginTool *left, IPluginTool *right) { return left->displayName().toLower() < right->displayName().toLower(); } ); + // Remove disabled plugins: + toolPlugins.erase( + std::remove_if(std::begin(toolPlugins), std::end(toolPlugins), [&](auto* tool) { + return !m_PluginContainer.isEnabled(tool); + }), + toolPlugins.end()); + // Group the plugins into submenus QMap<QString, QList<QPair<QString, IPluginTool *>>> submenuMap; for (auto toolPlugin : toolPlugins) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 8b2188c8..d4aa0bc2 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -129,10 +129,6 @@ public: void saveArchiveList(); - void registerPluginTool(MOBase::IPluginTool *tool, QString name = QString(), QMenu *menu = nullptr); - void registerPluginTools(std::vector<MOBase::IPluginTool *> toolPlugins); - void registerModPage(MOBase::IPluginModPage *modPage); - void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info); void installTranslator(const QString &name); @@ -160,7 +156,6 @@ public slots: void directory_refreshed(); - void toolPluginInvoke(); void modPagePluginInvoke(); signals: @@ -212,7 +207,11 @@ private: void setToolbarSize(const QSize& s); void setToolbarButtonStyle(Qt::ToolButtonStyle s); + void registerModPage(MOBase::IPluginModPage* modPage); + void registerPluginTool(MOBase::IPluginTool* tool, QString name = QString(), QMenu* menu = nullptr); + void updateToolbarMenu(); + void updateToolMenu(); void updateViewMenu(); QMenu* createPopupMenu() override; diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index 021fe3c8..030fdb31 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -180,10 +180,6 @@ void PluginContainer::setUserInterface(IUserInterface *userInterface, QWidget *w for (IPluginModPage *modPage : bf::at_key<IPluginModPage>(m_Plugins)) {
userInterface->registerModPage(modPage);
}
-
- for (IPluginTool *tool : bf::at_key<IPluginTool>(m_Plugins)) {
- userInterface->registerPluginTool(tool);
- }
}
m_UserInterface = userInterface;
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp index 8a70475c..0c02ffb0 100644 --- a/src/settingsdialogplugins.cpp +++ b/src/settingsdialogplugins.cpp @@ -88,10 +88,9 @@ void PluginsSettingsTab::updateListItems() auto* item = topLevelItem->child(j); auto* plugin = this->plugin(item); - if (!m_pluginContainer->implementInterface<IPluginGame>(plugin) - && !m_pluginContainer->isEnabled(plugin)) { - item->setBackgroundColor(0, Qt::gray); - } + bool inactive = !m_pluginContainer->implementInterface<IPluginGame>(plugin) + && !m_pluginContainer->isEnabled(plugin); + // TODO: Better display. } } @@ -198,7 +197,7 @@ void PluginsSettingsTab::on_checkboxEnabled_clicked(bool checked) return; } - m_pluginContainer->setEnabled(plugin, false, true); + m_pluginContainer->setEnabled(plugin, true, false); } else { // Custom check for proxy + current game: |
