Files
wowlet/src/widgets/PluginWidget.cpp
T
2025-02-20 18:52:03 +01:00

158 lines
4.8 KiB
C++

// SPDX-License-Identifier: BSD-3-Clause
// SPDX-FileCopyrightText: The Monero Project
#include "PluginWidget.h"
#include "ui_PluginWidget.h"
#include <QTreeWidget>
#include "utils/config.h"
#include "utils/Icons.h"
#include "plugins/PluginRegistry.h"
PluginWidget::PluginWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::PluginWidget)
{
ui->setupUi(this);
ui->frameRestart->setVisible(conf()->get(Config::restartRequired).toBool());
ui->frameRestart->setInfo(icons()->icon("settings_disabled_32px.png"), "Restart required to enable/disable plugins.");
const QStringList enabledPlugins = conf()->get(Config::enabledPlugins).toStringList();
for (const auto plugin : PluginRegistry::getPlugins()) {
if (!plugin->parent().isEmpty()) {
continue;
}
auto* item = new QTreeWidgetItem(ui->plugins);
this->setupItem(item, plugin);
if (enabledPlugins.contains(plugin->id()) && !plugin->implicitEnable()) {
item->setCheckState(0, Qt::Checked);
}
m_topLevelPlugins[plugin->id()] = item;
}
for (const auto plugin : PluginRegistry::getPlugins()) {
QTreeWidgetItem *item;
if (plugin->parent().isEmpty()) {
continue;
}
if (m_topLevelPlugins.contains(plugin->parent())) {
item = new QTreeWidgetItem(m_topLevelPlugins[plugin->parent()]);
} else {
qWarning() << "Top level plugin not found: " << plugin->id();
continue;
}
this->setupItem(item, plugin);
if (enabledPlugins.contains(plugin->id())) {
item->setCheckState(0, Qt::Checked);
}
}
ui->plugins->expandAll();
ui->plugins->setHeaderHidden(true);
connect(ui->plugins, &QTreeWidget::itemClicked, this, &PluginWidget::pluginSelected);
connect(ui->plugins, &QTreeWidget::itemClicked, this, &PluginWidget::pluginToggled);
connect(ui->btn_deselectAll, &QPushButton::clicked, this, &PluginWidget::deselectAll);
connect(ui->btn_selectAll, &QPushButton::clicked, this, &PluginWidget::selectAll);
connect(ui->btn_configure, &QPushButton::clicked, this, &PluginWidget::configurePlugin);
}
void PluginWidget::pluginSelected(QTreeWidgetItem* item, int column) {
QString pluginID = item->data(0, Qt::UserRole).toString();
Plugin* plugin = PluginRegistry::getPlugin(pluginID);
bool enable = false;
if (plugin && plugin->configurable()) {
enable = true;
}
ui->btn_configure->setEnabled(enable);
m_selectedPlugin = plugin;
}
void PluginWidget::pluginToggled(QTreeWidgetItem* item, int column) {
QStringList enabledPlugins = conf()->get(Config::enabledPlugins).toStringList();
QString pluginID = item->data(0, Qt::UserRole).toString();
bool checked = (item->checkState(0) == Qt::Checked);
bool toggled = checked ^ enabledPlugins.contains(pluginID);
if (!toggled) {
return;
}
if (checked) {
enabledPlugins.append(pluginID);
} else {
enabledPlugins.removeAll(pluginID);
}
conf()->set(Config::enabledPlugins, enabledPlugins);
qDebug() << "Enabled plugins: " << enabledPlugins;
if (toggled) {
conf()->set(Config::restartRequired, true);
ui->frameRestart->show();
}
}
void PluginWidget::setupItem(QTreeWidgetItem *item, Plugin *plugin) {
item->setIcon(0, icons()->icon(plugin->icon()));
item->setText(0, plugin->displayName());
item->setData(0, Qt::UserRole, plugin->id());
if (!plugin->implicitEnable()) {
m_checkable.append(plugin->id());
item->setCheckState(0, Qt::Unchecked);
}
// if (plugin->requiresWebsocket() && conf()->get(Config::disableWebsocket).toBool()) {
// item->setDisabled(true);
// item->setToolTip(0, "This plugin requires the websocket connection to be enabled. Go to Network -> Websocket.");
//
// if (!plugin->implicitEnable()) {
// item->setCheckState(0, Qt::Unchecked);
// }
// }
}
void PluginWidget::deselectAll() {
this->selectTreeItems(ui->plugins->invisibleRootItem(), false);
}
void PluginWidget::selectAll() {
this->selectTreeItems(ui->plugins->invisibleRootItem(), true);
}
void PluginWidget::configurePlugin() {
if (!m_selectedPlugin) {
return;
}
m_selectedPlugin->configDialog(this)->exec();
emit pluginConfigured(m_selectedPlugin->id());
}
void PluginWidget::selectTreeItems(QTreeWidgetItem *item, bool select) {
if (!item) return;
// Truly demented Qt API
if (m_checkable.contains(item->data(0, Qt::UserRole).toString())) {
item->setCheckState(0, select ? Qt::Checked : Qt::Unchecked);
this->pluginToggled(item, 0);
}
for (int i = 0; i < item->childCount(); ++i)
{
selectTreeItems(item->child(i), select);
}
}
PluginWidget::~PluginWidget() = default;