diff options
author | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-12-11 21:57:25 +0100 |
---|---|---|
committer | Aqua-sama <aqua@iserlohn-fortress.net> | 2017-12-11 21:57:25 +0100 |
commit | 6cf244277a5ba8434b85d2b9a861ceed1c6dfb88 (patch) | |
tree | 4bc3804b36d0d3e85139501bd2fb0bae97a71cc0 | |
parent | Simple filterlist (diff) | |
download | smolbote-6cf244277a5ba8434b85d2b9a861ceed1c6dfb88.tar.xz |
Autogenerating settings dialog
-rw-r--r-- | lib/settings/configuration.cpp | 21 | ||||
-rw-r--r-- | lib/settings/configuration.h | 3 | ||||
-rw-r--r-- | lib/settings/settings.qbs | 20 | ||||
-rw-r--r-- | lib/settings/settingsdialog.cpp | 92 | ||||
-rw-r--r-- | lib/settings/settingsdialog.h | 46 | ||||
-rw-r--r-- | lib/settings/settingsdialog.ui | 67 | ||||
-rw-r--r-- | smolbote.qbs | 17 | ||||
-rw-r--r-- | src/mainwindow.cpp | 7 | ||||
-rw-r--r-- | src/mainwindow.h | 1 | ||||
-rw-r--r-- | src/widgets/mainwindowmenubar.cpp | 1 |
10 files changed, 259 insertions, 16 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> 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 <downloads/downloadswidget.h> #include "browser.h" +#include <settings/settingsdialog.h> MainWindow::MainWindow(std::shared_ptr<Configuration> 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<Configuration> config, Main newTabAction->setShortcut(QKeySequence(config->value<std::string>("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<std::string>("browser.shortcuts.about").value().c_str())); browserMenu->addAction(tr("About Qt"), qApp, &QApplication::aboutQt); browserMenu->addSeparator(); |