19#include "ui_pluginslist.h"
29#include <QInputDialog>
35 , ui(new
Ui::PluginsList)
39 ui->list->setLayoutDirection(Qt::LeftToRight);
41 ui->butRemove->setIcon(QIcon::fromTheme(
QSL(
"edit-delete")));
46 bool appPluginsEnabled = settings.
value(
QSL(
"EnablePlugins"),
true).toBool();
49 ui->list->setEnabled(appPluginsEnabled);
51 connect(ui->butSettings, &QAbstractButton::clicked,
this, &PluginsManager::settingsClicked);
52 connect(ui->butRemove, &QAbstractButton::clicked,
this, &PluginsManager::removeClicked);
53 connect(ui->list, &QListWidget::currentItemChanged,
this, &PluginsManager::currentChanged);
54 connect(ui->list, &QListWidget::itemChanged,
this, &PluginsManager::itemChanged);
55 connect(ui->search, &QLineEdit::textChanged,
this, &PluginsManager::addFilter);
75 QStringList allowedPlugins;
76 for (
int i = 0;
i < ui->list->count();
i++) {
77 QListWidgetItem* item = ui->list->item(
i);
79 if (item->checkState() == Qt::Checked) {
81 allowedPlugins.append(plugin.
pluginId);
87 settings.
setValue(
QSL(
"AllowedPlugins"), allowedPlugins);
91void PluginsManager::refresh()
97 const int oldCurrentRow = ui->list->currentRow();
100 ui->butSettings->setEnabled(
false);
101 disconnect(ui->list, &QListWidget::itemChanged,
this, &PluginsManager::itemChanged);
103 const QList<Plugins::Plugin> &allPlugins =
mApp->plugins()->availablePlugins();
108 auto* item =
new QListWidgetItem(ui->list);
109 QIcon icon = QIcon(spec.
icon);
111 icon = QIcon(
QSL(
":/icons/preferences/extensions.svg"));
115 const QString pluginInfo = QStringLiteral(
"<b>%1</b> %2<br/><i>%3</i><br/>").arg(spec.
name, spec.
version, spec.
author.toHtmlEscaped());
116 item->setToolTip(pluginInfo);
118 item->setText(spec.
name);
119 item->setData(Qt::UserRole, spec.
version);
120 item->setData(Qt::UserRole + 1, spec.
author);
123 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
124 item->setCheckState(plugin.isLoaded() ? Qt::Checked : Qt::Unchecked);
125 item->setData(Qt::UserRole + 10, QVariant::fromValue(plugin));
127 ui->list->addItem(item);
132 if (oldCurrentRow >= 0) {
133 ui->list->setCurrentRow(qMax(0, oldCurrentRow - 1));
134 ui->list->setFocus();
137 connect(ui->list, &QListWidget::itemChanged,
this, &PluginsManager::itemChanged);
140void PluginsManager::sortItems()
142 ui->list->sortItems();
147 for (
int i = 0;
i < ui->list->count(); ++
i) {
148 QListWidgetItem* topItem = ui->list->item(
i);
149 QListWidgetItem* bottomItem = ui->list->item(
i + 1);
150 if (!topItem || !bottomItem) {
154 if (topItem->checkState() == Qt::Unchecked && bottomItem->checkState() == Qt::Checked) {
155 QListWidgetItem* item = ui->list->takeItem(
i + 1);
156 ui->list->insertItem(
i, item);
164void PluginsManager::currentChanged(QListWidgetItem* item)
175void PluginsManager::itemChanged(QListWidgetItem* item)
183 m_blockRefresh =
true;
185 if (item->checkState() == Qt::Checked) {
186 mApp->plugins()->loadPlugin(&plugin);
189 mApp->plugins()->unloadPlugin(&plugin);
192 m_blockRefresh =
false;
194 disconnect(ui->list, &QListWidget::itemChanged,
this, &PluginsManager::itemChanged);
196 if (item->checkState() == Qt::Checked && !plugin.
isLoaded()) {
197 item->setCheckState(Qt::Unchecked);
198 QMessageBox::critical(
this, tr(
"Error!"), tr(
"Cannot load extension!"));
201 item->setData(Qt::UserRole + 10, QVariant::fromValue(plugin));
203 connect(ui->list, &QListWidget::itemChanged,
this, &PluginsManager::itemChanged);
205 currentChanged(ui->list->currentItem());
208void PluginsManager::settingsClicked()
210 QListWidgetItem* item = ui->list->currentItem();
211 if (!item || item->checkState() == Qt::Unchecked) {
218 mApp->plugins()->loadPlugin(&plugin);
220 item->setData(Qt::UserRole + 10, QVariant::fromValue(plugin));
228void PluginsManager::removeClicked()
230 QListWidgetItem* item = ui->list->currentItem();
237 const auto button = QMessageBox::warning(
this, tr(
"Confirmation"),
238 tr(
"Are you sure you want to remove '%1'?").arg(plugin.
pluginSpec.
name),
239 QMessageBox::Yes | QMessageBox::No);
240 if (button != QMessageBox::Yes) {
244 mApp->plugins()->removePlugin(&plugin);
247void PluginsManager::addFilter(
const QString& filter) {
248 for (
int i = 0;
i < ui->list->count(); ++
i) {
249 const QString& pluginName = ui->list->item(
i)->text();
251 if (pluginName.contains(filter,Qt::CaseInsensitive) || !filter.size()) {
252 ui->list->item(
i)->setHidden(
false);
255 ui->list->item(
i)->setHidden(
true);
static QIcon settingsIcon()
virtual void showSettings(QWidget *parent=nullptr)
void availablePluginsChanged()
PluginsManager(QWidget *parent=nullptr)
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
PluginInterface * instance