diff options
Diffstat (limited to 'src/settingsdialogplugins.cpp')
| -rw-r--r-- | src/settingsdialogplugins.cpp | 138 |
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); } } |
