aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2017-12-11 21:57:25 +0100
committerAqua-sama <aqua@iserlohn-fortress.net>2017-12-11 21:57:25 +0100
commit6cf244277a5ba8434b85d2b9a861ceed1c6dfb88 (patch)
tree4bc3804b36d0d3e85139501bd2fb0bae97a71cc0 /lib
parentSimple filterlist (diff)
downloadsmolbote-6cf244277a5ba8434b85d2b9a861ceed1c6dfb88.tar.xz
Autogenerating settings dialog
Diffstat (limited to 'lib')
-rw-r--r--lib/settings/configuration.cpp21
-rw-r--r--lib/settings/configuration.h3
-rw-r--r--lib/settings/settings.qbs20
-rw-r--r--lib/settings/settingsdialog.cpp92
-rw-r--r--lib/settings/settingsdialog.h46
-rw-r--r--lib/settings/settingsdialog.ui67
6 files changed, 245 insertions, 4 deletions
diff --git a/lib/settings/configuration.cpp b/lib/settings/configuration.cpp
index 9d53581..8af421f 100644
--- a/lib/settings/configuration.cpp
+++ b/lib/settings/configuration.cpp
@@ -80,18 +80,33 @@ bool Configuration::readDefaultConfiguration(const std::string &data)
return true;
}
-std::vector<std::string> Configuration::children(const char* name)
+std::vector<std::string> Configuration::childrenSettings(const char* name)
{
std::vector<std::string> groupNames;
const Setting &root = m_defaultCfg->lookup(name);
- for(auto i = root.begin(); i != root.end(); ++i) {
- groupNames.push_back(std::string(i->getName()));
+ for(const Setting &setting : root) {
+ if(setting.getType() != Setting::TypeGroup) {
+ groupNames.push_back(setting.getName());
+ }
}
return groupNames;
}
+std::vector<std::string> Configuration::childrenGroups(const char* name)
+{
+ std::vector<std::string> groupNames;
+ const Setting &root = m_defaultCfg->lookup(name);
+
+ for(const Setting &setting : root) {
+ if(setting.getType() == Setting::TypeGroup) {
+ groupNames.push_back(setting.getName());
+ }
+ }
+ return groupNames;
+}
+
template<typename T>
std::optional<T> Configuration::value(const char* path) const
{
diff --git a/lib/settings/configuration.h b/lib/settings/configuration.h
index 548b816..94c39da 100644
--- a/lib/settings/configuration.h
+++ b/lib/settings/configuration.h
@@ -40,7 +40,8 @@ public:
bool readDefaultConfiguration(const std::string &data);
- std::vector<std::string> children(const char *name = "");
+ std::vector<std::string> childrenSettings(const char *name = "");
+ std::vector<std::string> childrenGroups(const char *name = "");
template<typename T>
std::optional<T> value(const char* path) const;
diff --git a/lib/settings/settings.qbs b/lib/settings/settings.qbs
index 77e97fb..aeb502d 100644
--- a/lib/settings/settings.qbs
+++ b/lib/settings/settings.qbs
@@ -16,4 +16,24 @@ Project {
"configuration.h"
]
}
+
+ StaticLibrary {
+ name: "settingsDialog"
+
+ Depends { name: "cpp" }
+
+ Depends {
+ name: "Qt"
+ versionAtLeast: "5.9.0"
+ submodules: ["core", "widgets"]
+ }
+
+ cpp.cxxLanguageVersion: "c++17"
+
+ files: [
+ "settingsdialog.cpp",
+ "settingsdialog.h",
+ "settingsdialog.ui",
+ ]
+ }
}
diff --git a/lib/settings/settingsdialog.cpp b/lib/settings/settingsdialog.cpp
new file mode 100644
index 0000000..18e8dd2
--- /dev/null
+++ b/lib/settings/settingsdialog.cpp
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ **
+ ** nyamp: yet another media player
+ ** Copyright (C) 2017 Aqua-sama
+ **
+ ** This program is free software: you can redistribute it and/or modify
+ ** it under the terms of the GNU General Public License as published by
+ ** the Free Software Foundation, either version 3 of the License, or
+ ** (at your option) any later version.
+ **
+ ** This program is distributed in the hope that it will be useful,
+ ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ** GNU General Public License for more details.
+ **
+ ** You should have received a copy of the GNU General Public License
+ ** along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **
+ ******************************************************************************/
+
+#include "settingsdialog.h"
+#include "ui_settingsdialog.h"
+#include "configuration.h"
+#include <QFormLayout>
+#include <QHBoxLayout>
+#include <QLineEdit>
+#include <QToolButton>
+#include <QGroupBox>
+
+inline QHBoxLayout *createEntry(const QString &value, QWidget *widget);
+
+SettingsDialog::SettingsDialog(std::shared_ptr<Configuration> &settings, QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::SettingsDialog)
+{
+ ui->setupUi(this);
+
+ for(const std::string &group : settings->childrenGroups("")) {
+ QWidget *widget = widgetForGroup(settings, group, this);
+ ui->tabWidget->addTab(widget, QString::fromStdString(group));
+ }
+}
+
+SettingsDialog::~SettingsDialog()
+{
+ delete ui;
+}
+
+QWidget *widgetForGroup(std::shared_ptr<Configuration> &settings, const std::string &group, QWidget *parent)
+{
+ QWidget *widget = new QWidget(parent);
+ QVBoxLayout *layout = new QVBoxLayout(widget);
+ widget->setLayout(layout);
+
+ // add entry for every key
+ QFormLayout *form = new QFormLayout(widget);
+ for(const std::string &key : settings->childrenSettings(group.c_str())) {
+ QHBoxLayout *hBox = createEntry(QString::fromStdString(settings->value<std::string>((group + '.' + key).c_str()).value()), widget);
+ form->addRow(parent->tr(key.c_str()), hBox);
+ }
+ layout->addLayout(form);
+
+ // TODO: iterate through groups
+ for(const std::string &childGroup : settings->childrenGroups(group.c_str())) {
+ QGroupBox *groupBox = new QGroupBox(QString::fromStdString(childGroup), widget);
+ layout->addWidget(groupBox);
+ QFormLayout *boxForm = new QFormLayout(groupBox);
+ groupBox->setLayout(boxForm);
+
+ const std::string groupPath = group + '.' + childGroup;
+ for(const std::string &key : settings->childrenSettings(groupPath.c_str())) {
+ QHBoxLayout *hBox = createEntry(QString::fromStdString(settings->value<std::string>((groupPath + '.' + key).c_str()).value()), groupBox);
+ boxForm->addRow(parent->tr(key.c_str()), hBox);
+ }
+ }
+
+ return widget;
+}
+
+inline QHBoxLayout *createEntry(const QString &value, QWidget *widget)
+{
+ QLineEdit *lineEdit = new QLineEdit(widget);
+ lineEdit->setText(value);
+ QToolButton *resetButton = new QToolButton(widget);
+ resetButton->setIcon(widget->style()->standardIcon(QStyle::SP_DialogResetButton));
+
+ QHBoxLayout *hBox = new QHBoxLayout();
+ hBox->addWidget(lineEdit);
+ hBox->addWidget(resetButton);
+
+ return hBox;
+}
diff --git a/lib/settings/settingsdialog.h b/lib/settings/settingsdialog.h
new file mode 100644
index 0000000..72b704c
--- /dev/null
+++ b/lib/settings/settingsdialog.h
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ **
+ ** nyamp: yet another media player
+ ** Copyright (C) 2017 Aqua-sama
+ **
+ ** This program is free software: you can redistribute it and/or modify
+ ** it under the terms of the GNU General Public License as published by
+ ** the Free Software Foundation, either version 3 of the License, or
+ ** (at your option) any later version.
+ **
+ ** This program is distributed in the hope that it will be useful,
+ ** but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ** GNU General Public License for more details.
+ **
+ ** You should have received a copy of the GNU General Public License
+ ** along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **
+ ******************************************************************************/
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include <QDialog>
+#include <memory>
+
+namespace Ui {
+class SettingsDialog;
+}
+
+class Configuration;
+class SettingsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit SettingsDialog(std::shared_ptr<Configuration> &settings, QWidget *parent = nullptr);
+ ~SettingsDialog();
+
+private:
+ Ui::SettingsDialog *ui;
+};
+
+[[nodiscard]] QWidget *widgetForGroup(std::shared_ptr<Configuration> &settings, const std::string &group, QWidget *parent);
+
+#endif // SETTINGSDIALOG_H
diff --git a/lib/settings/settingsdialog.ui b/lib/settings/settingsdialog.ui
new file mode 100644
index 0000000..522754d
--- /dev/null
+++ b/lib/settings/settingsdialog.ui
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SettingsDialog</class>
+ <widget class="QDialog" name="SettingsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>640</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTabWidget" name="tabWidget"/>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>