aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2018-11-23 11:48:03 +0100
committerAqua-sama <aqua@iserlohn-fortress.net>2018-11-23 11:48:03 +0100
commit5e26d0efb42103457d813ea79830eebf6feeba9b (patch)
tree338cbfbc890eb1b8f4056bb89a6541217c1437ff
parentAdd About and Run actions to plugin submenu (diff)
downloadsmolbote-5e26d0efb42103457d813ea79830eebf6feeba9b.tar.xz
Loading and unloading of plugins at runtime
-rw-r--r--lib/about/aboutplugin.cpp28
-rw-r--r--lib/about/aboutplugin.h2
-rw-r--r--lib/about/aboutplugin.ui47
-rw-r--r--src/browser.cpp11
4 files changed, 65 insertions, 23 deletions
diff --git a/lib/about/aboutplugin.cpp b/lib/about/aboutplugin.cpp
index 7df75fa..b2fab51 100644
--- a/lib/about/aboutplugin.cpp
+++ b/lib/about/aboutplugin.cpp
@@ -54,19 +54,43 @@ QTreeWidgetItem *createItem(const QString &key, const QJsonValue &json, QTreeWid
return item;
}
-AboutPluginDialog::AboutPluginDialog(const QPluginLoader *loader, QWidget *parent)
+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->loaded->setChecked(loader->isLoaded());
+ 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[QLatin1Literal("name")].toString());
ui->author->setText(metaData[QLatin1Literal("author")].toString());
diff --git a/lib/about/aboutplugin.h b/lib/about/aboutplugin.h
index adab215..9651060 100644
--- a/lib/about/aboutplugin.h
+++ b/lib/about/aboutplugin.h
@@ -21,7 +21,7 @@ class AboutPluginDialog : public QDialog
Q_OBJECT
public:
- explicit AboutPluginDialog(const QPluginLoader *loader, QWidget *parent = nullptr);
+ explicit AboutPluginDialog(QPluginLoader *loader, QWidget *parent = nullptr);
~AboutPluginDialog() override;
private:
diff --git a/lib/about/aboutplugin.ui b/lib/about/aboutplugin.ui
index f2d4848..31e20c6 100644
--- a/lib/about/aboutplugin.ui
+++ b/lib/about/aboutplugin.ui
@@ -67,21 +67,7 @@
</widget>
</item>
<item row="4" column="1">
- <layout class="QHBoxLayout" name="controls_layout">
- <item>
- <widget class="QPushButton" name="loaded">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string>Load</string>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
+ <layout class="QHBoxLayout" name="controls_layout"/>
</item>
<item row="2" column="1">
<widget class="QLabel" name="license">
@@ -127,6 +113,37 @@
</item>
</layout>
</widget>
+ <widget class="QWidget" name="controls_tab">
+ <attribute name="title">
+ <string>Controls</string>
+ </attribute>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="1">
+ <widget class="QToolButton" name="load">
+ <property name="text">
+ <string>Load</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="error">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="error_label">
+ <property name="text">
+ <string>Status</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
</widget>
</item>
<item>
diff --git a/src/browser.cpp b/src/browser.cpp
index cc5d565..4547e08 100644
--- a/src/browser.cpp
+++ b/src/browser.cpp
@@ -243,9 +243,6 @@ MainWindow *Browser::createWindow()
});
for(QPluginLoader *loader : qAsConst(m_plugins)) {
- const auto *plugin = qobject_cast<PluginInterface *>(loader->instance());
- Q_CHECK_PTR(plugin);
-
auto *pluginMenu = window->ui->menuTools->addMenu(loader->metaData().value("MetaData").toObject().value("name").toString());
auto *aboutAction = pluginMenu->addAction(tr("About"));
@@ -257,8 +254,12 @@ MainWindow *Browser::createWindow()
auto *runAction = pluginMenu->addAction(tr("Run"));
runAction->setShortcut(QKeySequence::fromString(loader->metaData().value("MetaData").toObject().value("shortcut").toString()));
- connect(runAction, &QAction::triggered, window, [=]() {
- plugin->createWidget(window)->exec();
+ connect(runAction, &QAction::triggered, window, [loader, window]() {
+ if(loader->isLoaded()) {
+ const auto *interface = qobject_cast<PluginInterface *>(loader->instance());
+ Q_CHECK_PTR(interface);
+ interface->createWidget(window)->exec();
+ }
});
}