From 6cf244277a5ba8434b85d2b9a861ceed1c6dfb88 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Mon, 11 Dec 2017 21:57:25 +0100 Subject: Autogenerating settings dialog --- lib/settings/configuration.cpp | 21 ++++++++-- lib/settings/configuration.h | 3 +- lib/settings/settings.qbs | 20 +++++++++ lib/settings/settingsdialog.cpp | 92 +++++++++++++++++++++++++++++++++++++++++ lib/settings/settingsdialog.h | 46 +++++++++++++++++++++ lib/settings/settingsdialog.ui | 67 ++++++++++++++++++++++++++++++ 6 files changed, 245 insertions(+), 4 deletions(-) create mode 100644 lib/settings/settingsdialog.cpp create mode 100644 lib/settings/settingsdialog.h create mode 100644 lib/settings/settingsdialog.ui (limited to 'lib') 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 Configuration::children(const char* name) +std::vector Configuration::childrenSettings(const char* name) { std::vector 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 Configuration::childrenGroups(const char* name) +{ + std::vector 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 std::optional 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 children(const char *name = ""); + std::vector childrenSettings(const char *name = ""); + std::vector childrenGroups(const char *name = ""); template std::optional 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 . + ** + ******************************************************************************/ + +#include "settingsdialog.h" +#include "ui_settingsdialog.h" +#include "configuration.h" +#include +#include +#include +#include +#include + +inline QHBoxLayout *createEntry(const QString &value, QWidget *widget); + +SettingsDialog::SettingsDialog(std::shared_ptr &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 &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((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((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 . + ** + ******************************************************************************/ + +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +#include +#include + +namespace Ui { +class SettingsDialog; +} + +class Configuration; +class SettingsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit SettingsDialog(std::shared_ptr &settings, QWidget *parent = nullptr); + ~SettingsDialog(); + +private: + Ui::SettingsDialog *ui; +}; + +[[nodiscard]] QWidget *widgetForGroup(std::shared_ptr &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 @@ + + + SettingsDialog + + + + 0 + 0 + 640 + 480 + + + + Settings + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Save + + + + + + + + + buttonBox + accepted() + SettingsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SettingsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + -- cgit v1.2.1