aboutsummaryrefslogtreecommitdiff
path: root/src/about/aboutplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/about/aboutplugin.cpp')
-rw-r--r--src/about/aboutplugin.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/about/aboutplugin.cpp b/src/about/aboutplugin.cpp
new file mode 100644
index 0000000..99c04ec
--- /dev/null
+++ b/src/about/aboutplugin.cpp
@@ -0,0 +1,111 @@
+/*
+ * This file is part of smolbote. It's copyrighted by the contributors recorded
+ * in the version control history of the file, available from its original
+ * location: https://neueland.iserlohn-fortress.net/gitea/aqua/smolbote
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "aboutplugin.h"
+#include "ui_aboutplugin.h"
+#include <QJsonArray>
+#include <QPluginLoader>
+
+QTreeWidgetItem *createItem(const QString &key, const QJsonValue &json, QTreeWidgetItem *parent)
+{
+ auto *item = new QTreeWidgetItem(parent, { key, QLatin1String("---") });
+
+ switch(json.type()) {
+ case QJsonValue::Bool:
+ item->setText(1, json.toBool() ? QLatin1String("true") : QLatin1String("false"));
+ break;
+
+ case QJsonValue::Double:
+ item->setText(1, QString::number(json.toDouble()));
+ break;
+
+ case QJsonValue::String:
+ item->setText(1, json.toString());
+ break;
+
+ case QJsonValue::Array:
+ item->setText(1, QString());
+ for(const auto &v : json.toArray()) {
+ createItem(QString(), v, item);
+ }
+ break;
+
+ case QJsonValue::Object:
+ item->setText(1, QString());
+ for(const QString &k : json.toObject().keys()) {
+ createItem(k, json.toObject()[k], item);
+ }
+ break;
+
+ case QJsonValue::Null:
+ item->setText(1, QLatin1String("null"));
+ break;
+
+ case QJsonValue::Undefined:
+ item->setText(1, QLatin1String("undefined"));
+ break;
+ }
+
+ return item;
+}
+
+AboutPluginDialog::AboutPluginDialog(QPluginLoader *loader, QWidget *parent)
+ : QDialog(parent)
+ , ui(new Ui::AboutPluginDialog)
+{
+ setAttribute(Qt::WA_DeleteOnClose, true);
+ ui->setupUi(this);
+
+ // load button icon
+ {
+ QIcon load_icon;
+ load_icon.addPixmap(style()->standardPixmap(QStyle::SP_MediaPlay), QIcon::Normal, QIcon::On);
+ load_icon.addPixmap(style()->standardPixmap(QStyle::SP_MediaStop), QIcon::Normal, QIcon::Off);
+ ui->load->setIcon(load_icon);
+ }
+
+ auto metaData = loader->metaData()["MetaData"].toObject();
+
+ this->setWindowTitle(metaData["name"].toString());
+
+ ui->path->setText(loader->fileName());
+ ui->load->setChecked(loader->isLoaded());
+
+ connect(ui->load, &QToolButton::clicked, this, [this, loader](bool checked) {
+ if(checked) {
+ // load plugin
+ if(!loader->load()) {
+ ui->load->setChecked(false);
+ ui->error->setText(loader->errorString());
+ }
+ } else {
+ // unload plugin
+ if(!loader->unload()) {
+ ui->load->setChecked(true);
+ ui->error->setText(loader->errorString());
+ }
+ }
+ });
+
+ ui->name->setText(metaData[QLatin1String("name")].toString());
+ ui->author->setText(metaData[QLatin1String("author")].toString());
+ ui->license->setText(metaData[QLatin1String("license")].toString());
+ ui->shortcut->setText(metaData[QLatin1String("shortcut")].toString());
+
+ for(const QString &key : loader->metaData().keys()) {
+ auto *i = createItem(key, loader->metaData()[key], nullptr);
+
+ if(i != nullptr)
+ ui->details_treeWidget->insertTopLevelItem(0, i);
+ }
+}
+
+AboutPluginDialog::~AboutPluginDialog()
+{
+ delete ui;
+}