summaryrefslogtreecommitdiff
path: root/src/settingsdialogplugins.cpp
diff options
context:
space:
mode:
authorMikaƫl Capelle <capelle.mikael@gmail.com>2020-10-01 18:52:35 +0200
committerGitHub <noreply@github.com>2020-10-01 18:52:35 +0200
commit4167e6768e3d82f831982588347a5a8606fe82f6 (patch)
treeb31dc6b9711ed0681d28beb5a1314f10474950ce /src/settingsdialogplugins.cpp
parentcd3f496a5b9f6cc090c66a226d4f7f7557c9a8e1 (diff)
parent475fc0b813497d81aed92b0659cb2213dd9ce14f (diff)
Merge pull request #1248 from Holt59/iplugin-interface-improvements
Better display of MO2 plugins
Diffstat (limited to 'src/settingsdialogplugins.cpp')
-rw-r--r--src/settingsdialogplugins.cpp138
1 files changed, 115 insertions, 23 deletions
diff --git a/src/settingsdialogplugins.cpp b/src/settingsdialogplugins.cpp
index c84d0556..5faa0dc9 100644
--- a/src/settingsdialogplugins.cpp
+++ b/src/settingsdialogplugins.cpp
@@ -3,47 +3,135 @@
#include "noeditdelegate.h"
#include <iplugin.h>
+#include "plugincontainer.h"
+
using MOBase::IPlugin;
-PluginsSettingsTab::PluginsSettingsTab(Settings& s, SettingsDialog& d)
- : SettingsTab(s, d)
+PluginsSettingsTab::PluginsSettingsTab(Settings& s, PluginContainer* pluginContainer, SettingsDialog& d)
+ : SettingsTab(s, d), m_pluginContainer(pluginContainer)
{
ui->pluginSettingsList->setStyleSheet("QTreeWidget::item {padding-right: 10px;}");
+ // Create top-level tree widget:
+ QStringList pluginInterfaces = m_pluginContainer->pluginInterfaces();
+ pluginInterfaces.sort(Qt::CaseInsensitive);
+ std::map<QString, QTreeWidgetItem*> topItems;
+ for (QString interfaceName : pluginInterfaces) {
+ auto* item = new QTreeWidgetItem(ui->pluginsList, { interfaceName });
+ item->setFlags(item->flags() & ~Qt::ItemIsSelectable);
+ auto font = item->font(0);
+ font.setBold(true);
+ item->setFont(0, font);
+ topItems[interfaceName] = item;
+ item->setExpanded(true);
+ }
+ ui->pluginsList->setHeaderHidden(true);
+
// display plugin settings
QSet<QString> handledNames;
- for (IPlugin *plugin : settings().plugins().plugins()) {
- if (handledNames.contains(plugin->name()))
+ for (IPlugin* plugin : settings().plugins().plugins()) {
+ if (handledNames.contains(plugin->name())) {
+ continue;
+ }
+ if (!m_filter.matches([plugin](const QRegularExpression& regex) {
+ return regex.match(plugin->localizedName()).hasMatch();
+ })) {
continue;
- QListWidgetItem *listItem = new QListWidgetItem(plugin->name(), ui->pluginsList);
- listItem->setData(Qt::UserRole, QVariant::fromValue((void*)plugin));
- listItem->setData(Qt::UserRole + 1, settings().plugins().settings(plugin->name()));
- listItem->setData(Qt::UserRole + 2, settings().plugins().descriptions(plugin->name()));
- ui->pluginsList->addItem(listItem);
+ }
+ QTreeWidgetItem* listItem = new QTreeWidgetItem(
+ topItems.at(m_pluginContainer->topImplementedInterface(plugin)));
+ listItem->setData(0, Qt::DisplayRole, plugin->localizedName());
+ listItem->setData(0, ROLE_PLUGIN, QVariant::fromValue((void*)plugin));
+ listItem->setData(0, ROLE_SETTINGS, settings().plugins().settings(plugin->name()));
+ listItem->setData(0, ROLE_DESCRIPTIONS, settings().plugins().descriptions(plugin->name()));
+
handledNames.insert(plugin->name());
}
+ for (auto& [k, item] : topItems) {
+ if (item->childCount() == 0) {
+ item->setHidden(true);
+ }
+ }
+
+ ui->pluginsList->sortByColumn(0, Qt::AscendingOrder);
+
// display plugin blacklist
for (const QString &pluginName : settings().plugins().blacklist()) {
ui->pluginBlacklist->addItem(pluginName);
}
+ m_filter.setEdit(ui->pluginFilterEdit);
+
QObject::connect(
- ui->pluginsList, &QListWidget::currentItemChanged,
+ ui->pluginsList, &QTreeWidget::currentItemChanged,
[&](auto* current, auto* previous) { on_pluginsList_currentItemChanged(current, previous); });
QShortcut *delShortcut = new QShortcut(
QKeySequence(Qt::Key_Delete), ui->pluginBlacklist);
- QObject::connect(delShortcut, &QShortcut::activated, &dialog(), [&]{ deleteBlacklistItem(); });
+ QObject::connect(delShortcut, &QShortcut::activated, &dialog(), [&] { deleteBlacklistItem(); });
+ QObject::connect(&m_filter, &MOBase::FilterWidget::changed, [&] { filterPluginList(); });
+
+ filterPluginList();
+}
+
+void PluginsSettingsTab::filterPluginList()
+{
+ QTreeWidgetItem* firstNotHidden = nullptr;
+
+ for (auto i = 0; i < ui->pluginsList->topLevelItemCount(); ++i) {
+ auto* topLevelItem = ui->pluginsList->topLevelItem(i);
+
+ bool found = false;
+ for (auto j = 0; j < topLevelItem->childCount(); ++j) {
+ auto* item = topLevelItem->child(j);
+ auto* plugin = this->plugin(item);
+
+ if (m_filter.matches([plugin](const QRegularExpression& regex) {
+ return regex.match(plugin->localizedName()).hasMatch();
+ })) {
+ found = true;
+ item->setHidden(false);
+
+ if (firstNotHidden == nullptr) {
+ firstNotHidden = item;
+ }
+ }
+ else {
+ item->setHidden(true);
+ }
+ }
+
+ topLevelItem->setHidden(!found);
+ }
+
+ // Unselect item if hidden:
+ auto selectedItems = ui->pluginsList->selectedItems();
+ if (!selectedItems.isEmpty() && selectedItems[0]->isHidden()) {
+ selectedItems[0]->setSelected(false);
+
+ if (firstNotHidden) {
+ firstNotHidden->setSelected(true);
+ }
+ }
+
+}
+
+IPlugin* PluginsSettingsTab::plugin(QTreeWidgetItem* pluginItem) const
+{
+ return static_cast<IPlugin*>(qvariant_cast<void*>(pluginItem->data(0, ROLE_PLUGIN)));
}
void PluginsSettingsTab::update()
{
// transfer plugin settings to in-memory structure
- for (int i = 0; i < ui->pluginsList->count(); ++i) {
- QListWidgetItem *item = ui->pluginsList->item(i);
- settings().plugins().setSettings(
- item->text(), item->data(Qt::UserRole + 1).toMap());
+ for (int i = 0; i < ui->pluginsList->topLevelItemCount(); ++i) {
+ auto *topLevelItem = ui->pluginsList->topLevelItem(i);
+ for (int j = 0; j < topLevelItem->childCount(); ++j) {
+ auto* item = topLevelItem->child(j);
+ settings().plugins().setSettings(
+ plugin(item)->name(), item->data(0, ROLE_SETTINGS).toMap());
+ }
}
// set plugin blacklist
@@ -62,18 +150,22 @@ void PluginsSettingsTab::closing()
storeSettings(ui->pluginsList->currentItem());
}
-void PluginsSettingsTab::on_pluginsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
+void PluginsSettingsTab::on_pluginsList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
storeSettings(previous);
+ if (!current->data(0, ROLE_PLUGIN).isValid()) {
+ return;
+ }
+
ui->pluginSettingsList->clear();
- IPlugin *plugin = static_cast<IPlugin*>(current->data(Qt::UserRole).value<void*>());
+ IPlugin* plugin = this->plugin(current);
ui->authorLabel->setText(plugin->author());
ui->versionLabel->setText(plugin->version().canonicalString());
ui->descriptionLabel->setText(plugin->description());
- QVariantMap settings = current->data(Qt::UserRole + 1).toMap();
- QVariantMap descriptions = current->data(Qt::UserRole + 2).toMap();
+ QVariantMap settings = current->data(0, ROLE_SETTINGS).toMap();
+ QVariantMap descriptions = current->data(0, ROLE_DESCRIPTIONS).toMap();
ui->pluginSettingsList->setEnabled(settings.count() != 0);
for (auto iter = settings.begin(); iter != settings.end(); ++iter) {
QTreeWidgetItem *newItem = new QTreeWidgetItem(QStringList(iter.key()));
@@ -104,16 +196,16 @@ void PluginsSettingsTab::deleteBlacklistItem()
ui->pluginBlacklist->takeItem(ui->pluginBlacklist->currentIndex().row());
}
-void PluginsSettingsTab::storeSettings(QListWidgetItem *pluginItem)
+void PluginsSettingsTab::storeSettings(QTreeWidgetItem *pluginItem)
{
- if (pluginItem != nullptr) {
- QVariantMap settings = pluginItem->data(Qt::UserRole + 1).toMap();
+ if (pluginItem != nullptr && pluginItem->data(0, ROLE_PLUGIN).isValid()) {
+ QVariantMap settings = pluginItem->data(0, ROLE_SETTINGS).toMap();
for (int i = 0; i < ui->pluginSettingsList->topLevelItemCount(); ++i) {
const QTreeWidgetItem *item = ui->pluginSettingsList->topLevelItem(i);
settings[item->text(0)] = item->data(1, Qt::DisplayRole);
}
- pluginItem->setData(Qt::UserRole + 1, settings);
+ pluginItem->setData(0, ROLE_SETTINGS, settings);
}
}