aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/ConfigurationEditor/CMakeLists.txt28
-rw-r--r--plugins/ConfigurationEditor/ConfigurationEditor.json5
-rw-r--r--plugins/ConfigurationEditor/configurationeditorplugin.cpp30
-rw-r--r--plugins/ConfigurationEditor/configurationeditorplugin.h26
-rw-r--r--plugins/ConfigurationEditor/forms/settingsdialog.cpp101
-rw-r--r--plugins/ConfigurationEditor/forms/settingsdialog.h35
-rw-r--r--plugins/interfaces.h18
7 files changed, 240 insertions, 3 deletions
diff --git a/plugins/ConfigurationEditor/CMakeLists.txt b/plugins/ConfigurationEditor/CMakeLists.txt
new file mode 100644
index 0000000..3687463
--- /dev/null
+++ b/plugins/ConfigurationEditor/CMakeLists.txt
@@ -0,0 +1,28 @@
+find_package(Qt5Core REQUIRED)
+find_package(Qt5Widgets REQUIRED)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTOUIC ON)
+
+add_library(ConfigurationEditorPlugin SHARED
+ configurationeditorplugin.cpp
+ configurationeditorplugin.h
+ forms/settingsdialog.cpp
+ forms/settingsdialog.h
+)
+
+target_include_directories(ConfigurationEditorPlugin
+ PRIVATE ..
+ PRIVATE ${CMAKE_SOURCE_DIR}/lib/configuration
+)
+
+target_link_libraries(ConfigurationEditorPlugin
+ PRIVATE Qt5::Widgets
+ PRIVATE configuration
+)
+
+if(WIN32)
+ install(TARGETS ConfigurationEditorPlugin RUNTIME DESTINATION lib/smolbote CONFIGURATIONS Release)
+else()
+ install(TARGETS ConfigurationEditorPlugin LIBRARY DESTINATION lib/smolbote CONFIGURATIONS Release)
+endif()
diff --git a/plugins/ConfigurationEditor/ConfigurationEditor.json b/plugins/ConfigurationEditor/ConfigurationEditor.json
new file mode 100644
index 0000000..5c9d504
--- /dev/null
+++ b/plugins/ConfigurationEditor/ConfigurationEditor.json
@@ -0,0 +1,5 @@
+{
+ "name": "Configuration Editor",
+ "author": "Aqua-sama",
+ "shortcut": "Ctrl+Shift+C"
+}
diff --git a/plugins/ConfigurationEditor/configurationeditorplugin.cpp b/plugins/ConfigurationEditor/configurationeditorplugin.cpp
new file mode 100644
index 0000000..a5ca0bd
--- /dev/null
+++ b/plugins/ConfigurationEditor/configurationeditorplugin.cpp
@@ -0,0 +1,30 @@
+#include "configurationeditorplugin.h"
+#include <QHash>
+#include <QDialog>
+#include "forms/settingsdialog.h"
+#include <configuration.h>
+
+CommandHash_t ConfigurationEditorPlugin::commands()
+{
+ QHash<QString, std::function<int()>> hash;
+
+ hash.insert("configure", [this]() -> int {
+ auto *dlg = createWidget(nullptr);
+ return dlg->exec();
+ });
+
+ return hash;
+}
+
+QDialog *ConfigurationEditorPlugin::createWidget(QWidget *parent)
+{
+ auto *dlg = new SettingsDialog(m_config, parent);
+ dlg->setAttribute(Qt::WA_DeleteOnClose, true);
+ return dlg;
+}
+
+void ConfigurationEditorPlugin::setConfiguration(Configuration *cfg)
+{
+ Q_CHECK_PTR(cfg);
+ m_config = cfg;
+}
diff --git a/plugins/ConfigurationEditor/configurationeditorplugin.h b/plugins/ConfigurationEditor/configurationeditorplugin.h
new file mode 100644
index 0000000..6054723
--- /dev/null
+++ b/plugins/ConfigurationEditor/configurationeditorplugin.h
@@ -0,0 +1,26 @@
+#ifndef CONFIGURATIONEDITOR_PLUGIN_H
+#define CONFIGURATIONEDITOR_PLUGIN_H
+
+#include <QVector>
+#include <interfaces.h>
+
+class QDialog;
+class ConfigurationEditorPlugin : public QObject, public PluginInterface, public ConfigurationInterface
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID ProfileInterfaceIid FILE "ConfigurationEditor.json")
+ Q_INTERFACES(PluginInterface ConfigurationInterface)
+
+public:
+ // PluginInterface
+ CommandHash_t commands() override;
+ QDialog *createWidget(QWidget *parent = nullptr) override;
+
+ // ConfigurationInterface
+ void setConfiguration(Configuration *cfg) override;
+
+private:
+ Configuration *m_config = nullptr;
+};
+
+#endif // CONFIGURATIONEDITOR_PLUGIN_H
diff --git a/plugins/ConfigurationEditor/forms/settingsdialog.cpp b/plugins/ConfigurationEditor/forms/settingsdialog.cpp
new file mode 100644
index 0000000..ebc054e
--- /dev/null
+++ b/plugins/ConfigurationEditor/forms/settingsdialog.cpp
@@ -0,0 +1,101 @@
+/*
+ * 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/smolbote.hg
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#include "settingsdialog.h"
+#include <QApplication>
+#include <QFile>
+#include <QMenuBar>
+#include <QStatusBar>
+#include <QToolButton>
+#include <QVBoxLayout>
+#include <QFileDialog>
+#include <configuration.h>
+
+SettingsDialog::SettingsDialog(Configuration *config, QWidget *parent)
+ : QDialog(parent)
+{
+ resize(800, 600);
+ Q_CHECK_PTR(config);
+
+ // main menu
+// settingsMenu.setTitle(tr("Settings"));
+
+// auto *saveAction = settingsMenu.addAction(tr("Save"));
+// saveAction->setShortcut(QKeySequence::Save);
+
+// auto *saveAsAction = settingsMenu.addAction(tr("Save As"));
+// saveAsAction->setShortcut(QKeySequence::SaveAs);
+
+// settingsMenu.addAction(tr("Quit"), qApp, &QApplication::quit, QKeySequence::Quit);
+
+// menuBar()->addMenu(&settingsMenu);
+
+ auto *layout = new QVBoxLayout(this);
+ layout->addWidget(&treeWidget);
+ treeWidget.setColumnCount(2);
+ treeWidget.setHeaderLabels({ tr("setting"), tr("value") });
+ treeWidget.setEditTriggers(QTreeWidget::NoEditTriggers);
+ //connect(&treeWidget, &QTreeWidget::itemDoubleClicked, this, &SettingsDialog::editItem);
+
+ for(const auto &option : config->options()) {
+ auto *item = new QTreeWidgetItem(&treeWidget);
+ item->setText(0, QString::fromStdString(option->long_name()));
+ item->setText(1, QString::fromStdString(config->value<std::string>(option->long_name().c_str()).value_or(std::string())));
+ item->setFlags(item->flags() | Qt::ItemIsEditable);
+ }
+
+ treeWidget.resizeColumnToContents(0);
+
+ // connect signals
+// connect(saveAction, &QAction::triggered, this, [this]() {
+// write(configPath);
+// statusBar()->showMessage(tr("Configuration saved to: ") + configPath, 3000);
+// });
+
+// connect(saveAsAction, &QAction::triggered, this, [this]() {
+// QString path = QFileDialog::getSaveFileName(this, tr("Save Configuration"), configPath, tr("smolbote config (smolbote.cfg)"));
+// if(!path.isEmpty()) {
+// write(path);
+// statusBar()->showMessage(tr("Configuration saved to: ") + path, 3000);
+// }
+// });
+}
+
+SettingsDialog::~SettingsDialog()
+{
+// if(unsavedChanges)
+// write(configPath);
+}
+
+//void SettingsDialog::editItem(QTreeWidgetItem *item, int column)
+//{
+// if(column == 1) {
+// treeWidget.editItem(item, column);
+// unsavedChanges = true;
+
+// if(!windowTitle().endsWith('*')) {
+// setWindowTitle(windowTitle() + '*');
+// }
+// }
+//}
+
+//void SettingsDialog::write(const QString &path)
+//{
+// QFile output(path);
+// output.open(QIODevice::WriteOnly);
+
+// for(int i = 0; i < treeWidget.topLevelItemCount(); ++i) {
+// auto *item = treeWidget.topLevelItem(i);
+// output.write(QString(item->text(0) + " = " + item->text(1) + "\n").toUtf8());
+// }
+
+// output.close();
+
+// unsavedChanges = false;
+// setWindowTitle(configPath);
+//}
diff --git a/plugins/ConfigurationEditor/forms/settingsdialog.h b/plugins/ConfigurationEditor/forms/settingsdialog.h
new file mode 100644
index 0000000..ed9e02d
--- /dev/null
+++ b/plugins/ConfigurationEditor/forms/settingsdialog.h
@@ -0,0 +1,35 @@
+/*
+ * 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/smolbote.hg
+ *
+ * SPDX-License-Identifier: GPL-3.0
+ */
+
+#ifndef SMOLBOTE_SETTINGSDIALOG_H
+#define SMOLBOTE_SETTINGSDIALOG_H
+
+#include <QDialog>
+#include <QTreeWidget>
+
+class Configuration;
+class SettingsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit SettingsDialog(Configuration *config, QWidget *parent = nullptr);
+ ~SettingsDialog() override;
+
+ QString configPath;
+
+public slots:
+// void editItem(QTreeWidgetItem *item, int column);
+// void write(const QString &path);
+
+private:
+ QTreeWidget treeWidget;
+ bool unsavedChanges = false;
+};
+
+#endif // SMOLBOTE_SETTINGSDIALOG_H
diff --git a/plugins/interfaces.h b/plugins/interfaces.h
index 1a12f02..aad43c1 100644
--- a/plugins/interfaces.h
+++ b/plugins/interfaces.h
@@ -18,6 +18,7 @@ class QString;
class QAction;
class QDialog;
class WebProfile;
+class Configuration;
struct Plugin
{
@@ -27,26 +28,37 @@ struct Plugin
QObject *instance;
};
+typedef QHash<QString, std::function<int()>> CommandHash_t;
+
class PluginInterface
{
public:
virtual ~PluginInterface() = default;
- virtual QHash<QString, std::function<int()>> commands() = 0;
+ virtual CommandHash_t commands() = 0;
+ virtual QDialog *createWidget(QWidget *parent = nullptr) = 0;
};
class ProfileInterface
{
public:
virtual ~ProfileInterface() = default;
- virtual QDialog *createWidget(QWidget *parent = nullptr) = 0;
-
virtual void registerProfile(WebProfile *profile) = 0;
};
+class ConfigurationInterface
+{
+public:
+ virtual ~ConfigurationInterface() = default;
+ virtual void setConfiguration(Configuration *cfg) = 0;
+};
+
#define PluginInterfaceIid "net.iserlohn-fortress.smolbote.PluginInterface"
Q_DECLARE_INTERFACE(PluginInterface, PluginInterfaceIid)
#define ProfileInterfaceIid "net.iserlohn-fortress.smolbote.ProfileInterface"
Q_DECLARE_INTERFACE(ProfileInterface, ProfileInterfaceIid)
+#define ConfigurationInterfaceIid "net.iserlohn-fortress.smolbote.ConfigurationInterface"
+Q_DECLARE_INTERFACE(ConfigurationInterface, ConfigurationInterfaceIid)
+
#endif // SMOLBOTE_PLUGIN_INTERFACES_H