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 ++++++++++++++++++++++++++++ smolbote.qbs | 17 +++----- src/mainwindow.cpp | 7 +++ src/mainwindow.h | 1 + src/widgets/mainwindowmenubar.cpp | 1 + 10 files changed, 259 insertions(+), 16 deletions(-) create mode 100644 lib/settings/settingsdialog.cpp create mode 100644 lib/settings/settingsdialog.h create mode 100644 lib/settings/settingsdialog.ui 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 + + + + + diff --git a/smolbote.qbs b/smolbote.qbs index a6044c3..f00b930 100644 --- a/smolbote.qbs +++ b/smolbote.qbs @@ -40,18 +40,11 @@ Project { submodules: ["core", "widgets", "webengine", "webenginewidgets"] } - Depends { - name: "navigation" - } - Depends { - name: "bookmarks" - } - Depends { - name: "downloads" - } - Depends { - name: "settings" - } + Depends { name: "navigation" } + Depends { name: "bookmarks" } + Depends { name: "downloads" } + Depends { name: "settings" } + Depends { name: "settingsDialog" } Probe { id: git diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3a2d71d..f48de70 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -39,6 +39,7 @@ #include #include "browser.h" +#include MainWindow::MainWindow(std::shared_ptr config, QWidget *parent) : QMainWindow(parent), @@ -218,6 +219,12 @@ void MainWindow::about() dlg->exec(); } +void MainWindow::showSettingsDialog() +{ + SettingsDialog *dlg = new SettingsDialog(m_config, this); + dlg->exec(); +} + void MainWindow::setProfile(WebEngineProfile *profile) { Q_ASSERT(profile != nullptr); diff --git a/src/mainwindow.h b/src/mainwindow.h index 07c6b2f..cc3dfd6 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -56,6 +56,7 @@ public: public slots: void about(); + void showSettingsDialog(); void newTab(const QUrl &url = QUrl("")); void newWindow(const QUrl &url = QUrl("")); diff --git a/src/widgets/mainwindowmenubar.cpp b/src/widgets/mainwindowmenubar.cpp index 992163e..2f6c1af 100644 --- a/src/widgets/mainwindowmenubar.cpp +++ b/src/widgets/mainwindowmenubar.cpp @@ -49,6 +49,7 @@ MainWindowMenuBar::MainWindowMenuBar(std::shared_ptr config, Main newTabAction->setShortcut(QKeySequence(config->value("browser.shortcuts.newTab").value().c_str())); browserMenu->addSeparator(); + browserMenu->addAction(tr("Settings"), parent, &MainWindow::showSettingsDialog); browserMenu->addAction(tr("About"), parent, &MainWindow::about, QKeySequence(config->value("browser.shortcuts.about").value().c_str())); browserMenu->addAction(tr("About Qt"), qApp, &QApplication::aboutQt); browserMenu->addSeparator(); -- cgit v1.2.1