summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-11-11 14:59:11 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2020-11-11 20:30:34 +0100
commite528d8b0ad843bf2e728f26c3a1bade145e5ad07 (patch)
tree8fe5db18546af9e7dbaa55dabe22a90da805d13e /src
parent0dddc5eb7b60efd4f124485fd6e3e982c04f8a28 (diff)
Fix display of tools in the MainWindow menu.
Diffstat (limited to 'src')
-rw-r--r--src/iuserinterface.h2
-rw-r--r--src/mainwindow.cpp51
-rw-r--r--src/mainwindow.h9
-rw-r--r--src/plugincontainer.cpp4
-rw-r--r--src/settingsdialogplugins.cpp9
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: