From 41329fae5f819eee8c394571125f11f0a0b67cd9 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sat, 23 Jun 2018 12:50:10 +0200 Subject: Add ConfigurationEditor plugin Removed poi-config --- plugins/ConfigurationEditor/CMakeLists.txt | 28 ++++++ .../ConfigurationEditor/ConfigurationEditor.json | 5 + .../configurationeditorplugin.cpp | 30 ++++++ .../configurationeditorplugin.h | 26 ++++++ .../ConfigurationEditor/forms/settingsdialog.cpp | 101 +++++++++++++++++++++ plugins/ConfigurationEditor/forms/settingsdialog.h | 35 +++++++ plugins/interfaces.h | 18 +++- 7 files changed, 240 insertions(+), 3 deletions(-) create mode 100644 plugins/ConfigurationEditor/CMakeLists.txt create mode 100644 plugins/ConfigurationEditor/ConfigurationEditor.json create mode 100644 plugins/ConfigurationEditor/configurationeditorplugin.cpp create mode 100644 plugins/ConfigurationEditor/configurationeditorplugin.h create mode 100644 plugins/ConfigurationEditor/forms/settingsdialog.cpp create mode 100644 plugins/ConfigurationEditor/forms/settingsdialog.h (limited to 'plugins') 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 +#include +#include "forms/settingsdialog.h" +#include + +CommandHash_t ConfigurationEditorPlugin::commands() +{ + QHash> 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 +#include + +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 +#include +#include +#include +#include +#include +#include +#include + +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(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 +#include + +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> CommandHash_t; + class PluginInterface { public: virtual ~PluginInterface() = default; - virtual QHash> 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 -- cgit v1.2.1