diff options
author | aqua <aqua@iserlohn-fortress.net> | 2024-05-01 11:17:07 +0300 |
---|---|---|
committer | aqua <aqua@iserlohn-fortress.net> | 2024-05-01 11:17:07 +0300 |
commit | 7feefe9d5c922481081d31b12e02f42d9e028ef9 (patch) | |
tree | 6aee14710adeef4bcc0a86dd800df927f86342fd | |
parent | Added libConfiguration unit test (diff) | |
download | smolbote-7feefe9d5c922481081d31b12e02f42d9e028ef9.tar.xz |
-rw-r--r-- | Kconfig | 226 | ||||
-rw-r--r-- | lib/configuration/CMakeLists.txt | 14 | ||||
-rw-r--r-- | lib/configuration/configuration.h | 18 | ||||
-rwxr-xr-x | lib/configuration/gen-default-cfg.py | 43 | ||||
-rw-r--r-- | lib/configuration/init_global.cpp.in | 25 | ||||
-rw-r--r-- | lib/configuration/qt_specialization.cpp | 16 | ||||
-rw-r--r-- | lib/configuration/qt_specialization.h | 8 | ||||
-rw-r--r-- | linux/config.yaml | 63 | ||||
-rw-r--r-- | linux/makepkg/PKGBUILD | 7 | ||||
-rwxr-xr-x | scripts/gen-default-cfg.py | 51 | ||||
-rw-r--r-- | src/CMakeLists.txt | 12 | ||||
-rw-r--r-- | src/applicationmenu.cpp | 12 | ||||
-rw-r--r-- | src/bookmarks/bookmarkstoolbar.cpp | 6 | ||||
-rw-r--r-- | src/browser.cpp | 26 | ||||
-rw-r--r-- | src/main.cpp | 5 | ||||
-rw-r--r-- | src/mainwindow/addressbar.cpp | 4 | ||||
-rw-r--r-- | src/mainwindow/mainwindow.cpp | 8 | ||||
-rw-r--r-- | src/mainwindow/menubar.cpp | 24 | ||||
-rw-r--r-- | src/mainwindow/widgets/navigationbar.cpp | 14 | ||||
-rw-r--r-- | src/settings.h.in | 32 |
20 files changed, 219 insertions, 395 deletions
diff --git a/Kconfig b/Kconfig deleted file mode 100644 index 37d3d9c..0000000 --- a/Kconfig +++ /dev/null @@ -1,226 +0,0 @@ -menu "Application" - config POI_NAME - string "Application name" - default "smolbote" - config POI_ICON - string "Path to icon" - default ":/icons/poi.svg" - config POI_CFG_PATH - string "Configuration location" - default "~/.config/smolbote/smolbote.cfg" -endmenu - -menu "Keyboard shortcuts" - comment "Main Window shortcuts" - config shortcuts.session.save - string "Save Session shortcut" - default "Ctrl+S,S" - config shortcuts.session.open - string "Load Session shortcut" - default "Ctrl+S,O" - config shortcuts.window.newgroup - string "New Group shortcut" - default "Ctrl+G" - config shortcuts.window.newwindow - string "New Window shortcut" - default "Ctrl+N" - config shortcuts.window.about - string "Show About Dialog" - default "F1" - config shortcuts.window.quit - string "Quit shortcut" - default "Ctrl+Q" - config shortcuts.window.search - string "Show or hide search box" - default "F3" - config shortcuts.window.downloads.show - string "Show downloads dialog in this window" - default "Ctrl+D" - - comment "Navigation Bar shortcuts" - config navigationbar.show - string "Toggle navigation bar" - default "Ctrl+Shift+N" - config shortcuts.navigation.back - string "Go back in history" - default "Ctrl+Left" - config shortcuts.navigation.backmenu - string "Show Back history menu" - default "Ctrl+Down" - config shortcuts.navigation.forward - string "Go forward in history" - default "Ctrl+Right" - config shortcuts.navigation.forwardmenu - string "Show Forward history menu" - default "Ctrl+Up" - config shortcuts.navigation.refresh - string "Refresh the page" - default "F5" - config shortcuts.navigation.reload - string "Reload the page" - default "Ctrl+F5" - config shortcuts.navigation.home - string "Load homepage" - default "Ctrl+Home" - - comment "Address Bar shortcuts" - config shortcuts.address.focus - string "Focus the Address Bar" - default "F4" - config shortcuts.address.menu - string "Show Address Bar menu" - default "F2" - - comment "Subwindow shortcuts" - config shortcuts.subwindow.close - string "Close Subwindow shortcut" - default "Ctrl+Shift+W" - config shortcuts.subwindow.fullscreen - string "Make current subwindow fullscreen" - default "F11" - config shortcuts.subwindow.newtab - string "Create new tab" - default "Ctrl+T" - config shortcuts.subwindow.closetab - string "Close current tab" - default "Ctrl+W" - config shortcuts.subwindow.restoretab - string "Restore last closed tab" - default "Ctrl+Shift+T" - config shortcuts.subwindow.tableft - string "Switch to the tab on the left" - default "Ctrl+O" - config shortcuts.subwindow.movetableft - string "Move tab to the left" - default "Ctrl+Shift+O" - config shortcuts.subwindow.tabright - string "Switch to the tab on the right" - default "Ctrl+P" - config shortcuts.subwindow.movetabright - string "Move tab to the right" - default "Ctrl+Shift+P" - -endmenu - -menu "Main Window" - config mainwindow.title - string "Main window title" - default "smolbote" - config mainwindow.width - int "Main window width" - default 1280 - config mainwindow.height - int "Main window height" - default 720 -endmenu - -menu "Bookmarks" - config bookmarks.path - string "Bookmarks location" - default "~/.config/smolbote/bookmarks.xbel" - config shortcuts.window.bookmarks.show - string "Show bookmarks dialog in this window" - default "Ctrl+B" - config bookmarks.toolbar.show - string "Toggle bookmarks toolbar visibility" - default "Ctrl+Shift+B" - config bookmarks.toolbar.movable - bool "Default bookmarks toolbar movable" - default n - config bookmarks.toolbar.visible - bool "Default bookmarks toolbar visibility" - default n -endmenu - -menu "Profile Settings" - config profile.path - string "Profile load location" - default "~/.config/smolbote/profiles.d" - config profile.default - string "Default profile" - default "" - config profile.search - string "Search engine" - default "https://duckduckgo.com/?q=%1&ia=web" - config profile.homepage - string "Homepage" - default "about:blank" - config profile.newtab - string "New tab page" - default "about:blank" -endmenu - -config USEPLUGINS - bool "Enable plugins" - default y - -menu "Plugin Settings" - depends on USEPLUGINS - config PLUGINS_PATH - string "Plugin load location" - default "~/.config/smolbote/plugins.d" - choice PLUGINS_SIGNATURE_CHECK - bool "Plugin Signature enforcement" - default PLUGINS_SIGNATURE_CHECKED - config PLUGINS_SIGNATURE_IGNORED - bool "Don't check plugin signatures" - config PLUGINS_SIGNATURE_CHECKED - bool "Don't load plugins with invalid signatures" - config PLUGINS_SIGNATURE_ENFORCED - bool "Only load plugins with valid signatures" - endchoice - config PLUGINS_SIGNATURE_HASH - string "Hashing algorithm used by the signature" - default "SHA256" -endmenu - -comment "Default paths" -config filter.path - string "Host filter path" - default "~/.config/smolbote/hosts.d" -config downloads.path - string "Downloads location" - default "~/Downloads" -config session.path - string "Session location" - default "~/.config/smolbote/session.d" - -config USEPLASMA - bool "Enable KDE Frameworks integration" - default n - -menu "KDE Integration" - depends on USEPLASMA - - config PLASMA_BLUR - bool "Enable translucent background and blur behind window" - default n - - config WALLET_FOLDER - string "KDE Wallet folder name" - default "smolbote" -endmenu - -config USEBREAKPAD - bool "Enable Breakpad integration" - default n - -menu "Breakpad Integration" - depends on USEBREAKPAD - - config PATH_CRASHDUMP - string "Crash dump location" - default "~/.config/smolbote/crash.d" - - config PATH_CRASHHANDLER - string "Crash handler location" - default "poi-crash" -endmenu - -menu "Workarounds" - config QTBUG_65223 - bool "Manually emit loadFinished" - default y - help - See QTBUG-65223: loadStarted is emitted twice when loading link with anchor -endmenu diff --git a/lib/configuration/CMakeLists.txt b/lib/configuration/CMakeLists.txt index 7952eba..2e77782 100644 --- a/lib/configuration/CMakeLists.txt +++ b/lib/configuration/CMakeLists.txt @@ -1,8 +1,20 @@ +# generate init_global.cpp +add_custom_command( + OUTPUT init_global.cpp + COMMAND ${CMAKE_CURRENT_LIST_DIR}/gen-default-cfg.py + --config ${PROJECT_SOURCE_DIR}/linux/config.yaml + --template ${CMAKE_CURRENT_LIST_DIR}/init_global.cpp.in + --output init_global.cpp + DEPENDS + ${CMAKE_CURRENT_LIST_DIR}/gen-default-cfg.py + ${PROJECT_SOURCE_DIR}/linux/config.yaml +) add_library(configuration STATIC configuration.cpp configuration.h + init_global.cpp qt_specialization.cpp qt_specialization.h ) -target_link_libraries(configuration PUBLIC Qt6::Gui) +target_link_libraries(configuration PUBLIC Qt6::Gui spdlog::spdlog) target_include_directories(configuration PUBLIC ${CMAKE_CURRENT_LIST_DIR}) add_executable(test_configuration test/configuration.cpp) diff --git a/lib/configuration/configuration.h b/lib/configuration/configuration.h index 30f258c..f2de92f 100644 --- a/lib/configuration/configuration.h +++ b/lib/configuration/configuration.h @@ -12,6 +12,8 @@ #include <initializer_list> #include <memory> #include <optional> +#include <source_location> +#include <spdlog/spdlog.h> #include <string> #include <type_traits> #include <unordered_map> @@ -44,10 +46,10 @@ public: void read(std::basic_istream<char> &input); template <typename T> - [[nodiscard]] std::optional<T> value(const char *path) const + [[nodiscard]] std::optional<T> value(const char *path, const std::source_location location = std::source_location::current()) const { if(use_global) { - return instance()->value<T>(path); + return instance()->value<T>(path, location); } if(count(path) == 0) { @@ -58,13 +60,14 @@ public: } template <concept_value_t T> - [[nodiscard]] std::optional<T> value(const char *p_path) const + [[nodiscard]] std::optional<T> value(const char *p_path, const std::source_location location = std::source_location::current()) const { if(use_global) { - return instance()->value<T>(p_path); + return instance()->value<T>(p_path, location); } if(this->count(p_path) == 0) { + spdlog::warn("requested non-existent configuration value {} at {}:{}", p_path, location.file_name(), location.line()); return std::nullopt; } @@ -79,11 +82,11 @@ public: } } else if(std::holds_alternative<bool>(value)) { - if constexpr(std::is_constructible<T, bool>::value) { + if constexpr(std::is_constructible_v<T, bool> || std::is_same_v<T, bool>) { return std::get<bool>(value); } else if constexpr(std::is_arithmetic_v<T>) { return static_cast<T>(std::get<bool>(value)); - } else if constexpr(std::is_constructible<T, const char *>::value) { + } else if constexpr(std::is_constructible_v<T, const char *>) { return std::get<bool>(value) ? T{ "true" } : T{ "false" }; } @@ -115,11 +118,12 @@ public: } template <typename T> - T &shortcut(T & /* unused */, const char * /* unused */) const + T &shortcut(T & /* unused */, const char * /* unused */, const std::source_location location = std::source_location::current()) const { return T{}; } + static std::string init_global(const std::string &p_path); static void move_global(std::unique_ptr<Configuration> && conf); protected: diff --git a/lib/configuration/gen-default-cfg.py b/lib/configuration/gen-default-cfg.py new file mode 100755 index 0000000..5d9f8da --- /dev/null +++ b/lib/configuration/gen-default-cfg.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import sys +import argparse +import yaml + +def v_to_str(value): + if type(value) is str: + return f"std::string(\"{value}\")" + if type(value) is int: + return value + if type(value) is bool: + return "true" if True else "false" + +def kv_pairs_to_str(section, pairs): + pairs_str = "\n".join([f" {{ \"{section}/{key}\", {v_to_str(pairs[key])} }}," for key in pairs]) + return pairs_str + +def writeConfigInitList(config, file): + for node in config: + for section, pairs in node.items(): + print(kv_pairs_to_str(section, pairs), file=file) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--config", type=argparse.FileType('r'), required=True, help="configuration yaml") + parser.add_argument("--template", type=argparse.FileType('r'), required=True, help="settings.h.in") + parser.add_argument("--output", type=argparse.FileType('w'), default=sys.stdout, help="Output location") + args = parser.parse_args() + + config = yaml.safe_load(args.config) + print("config: ", config) + + print("/* Autogenerated file", file=args.output) + print(" * config: {}".format(args.config), file=args.output) + print(" */", file=args.output) + + for line in args.template: + if "@__DEFAULT_CFG__" in line: + writeConfigInitList(config, args.output) + else: + print(line, end='', file=args.output) diff --git a/lib/configuration/init_global.cpp.in b/lib/configuration/init_global.cpp.in new file mode 100644 index 0000000..9179130 --- /dev/null +++ b/lib/configuration/init_global.cpp.in @@ -0,0 +1,25 @@ +/* + * This is a generated file. + * + * 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/cgit/smolbote.git + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "configuration.h" + +std::string Configuration::init_global(const std::string &p_path) +{ + auto value_map = std::make_unique<Configuration, std::initializer_list<std::pair<std::string, conf_value_t>>>({ + /* @__DEFAULT_CFG__ */ + }); + + // load the actual configuration file + const auto cfgpath = p_path.empty() ? value_map->value<std::string>("poi/config").value() : p_path; + value_map->read_file(cfgpath); + + move_global(std::move(value_map)); + return cfgpath; +} diff --git a/lib/configuration/qt_specialization.cpp b/lib/configuration/qt_specialization.cpp index a97ed2b..cd7a99a 100644 --- a/lib/configuration/qt_specialization.cpp +++ b/lib/configuration/qt_specialization.cpp @@ -1,23 +1,23 @@ #include "configuration.h" template <> -[[nodiscard]] std::optional<QString> Configuration::value(const char *path) const +[[nodiscard]] std::optional<QString> Configuration::value(const char *path, std::source_location location) const { - const auto result = value<std::string>(path); + const auto result = value<std::string>(path, location); return result ? std::make_optional(QString::fromStdString(result.value())) : std::nullopt; } template <> -[[nodiscard]] std::optional<QStringList> Configuration::value(const char *path) const +[[nodiscard]] std::optional<QStringList> Configuration::value(const char *path, std::source_location location) const { - const auto result = value<std::string>(path); + const auto result = value<std::string>(path, location); return result ? std::make_optional(QString::fromStdString(result.value()).split(';')) : std::nullopt; } template <> -QAction &Configuration::shortcut(QAction &action, const char *name) const +QAction &Configuration::shortcut(QAction &action, const char *name, const std::source_location location) const { - if(const auto result = value<QString>(name)) { + if(const auto result = value<QString>(name, location)) { const QString old_tooltip = action.toolTip(); const auto &result_value = result.value(); @@ -28,9 +28,9 @@ QAction &Configuration::shortcut(QAction &action, const char *name) const } template <> -QKeySequence &Configuration::shortcut(QKeySequence &sequence, const char *name) const +QKeySequence &Configuration::shortcut(QKeySequence &sequence, const char *name, const std::source_location location) const { - if(const auto result = value<QString>(name)) { + if(const auto result = value<QString>(name, location)) { const auto &result_value = result.value(); sequence = QKeySequence::fromString(result_value); diff --git a/lib/configuration/qt_specialization.h b/lib/configuration/qt_specialization.h index af8466e..26f9593 100644 --- a/lib/configuration/qt_specialization.h +++ b/lib/configuration/qt_specialization.h @@ -5,11 +5,11 @@ #include <QStringList> template <> -[[nodiscard]] std::optional<QString> Configuration::value(const char *path) const; +[[nodiscard]] std::optional<QString> Configuration::value(const char *path, std::source_location location) const; template <> -[[nodiscard]] std::optional<QStringList> Configuration::value(const char *path) const; +[[nodiscard]] std::optional<QStringList> Configuration::value(const char *path, std::source_location location) const; template <> -QAction &Configuration::shortcut(QAction &, const char *) const; +QAction &Configuration::shortcut(QAction &, const char *, const std::source_location) const; template <> -QKeySequence &Configuration::shortcut(QKeySequence &, const char *) const; +QKeySequence &Configuration::shortcut(QKeySequence &, const char *, const std::source_location) const; diff --git a/linux/config.yaml b/linux/config.yaml new file mode 100644 index 0000000..38e6e6e --- /dev/null +++ b/linux/config.yaml @@ -0,0 +1,63 @@ +--- +- poi: + name: smolbote + icon: :/icons/poi.svg + config: ~/.config/smolbote/smolbote.cfg + +- shortcuts: + session.save: Ctrl+S,S + session.open: Ctrl+S,O + + window.newgroup: Ctrl+G + window.newwindow: Ctrl+N + window.about: F1 + window.quit: Ctrl+Q + window.search: F3 + window.bookmarks.show: Ctrl+B + window.downloads.show: Ctrl+D + + navigationbar.show: Ctrl+Shift+N + navigation.back: Ctrl+Left + navigation.backmenu: Ctrl+Down + navigation.forward: Ctrl+Right + navigation.forwardmenu: Ctrl+Up + navigation.refresh: F5 + navigation.reload: Ctrl+F5 + navigation.home: Ctrl+Home + + address.focus: F4 + address.menu: F2 + + subwindow.close: Ctrl+Shift+W + subwindow.fullscreen: F11 + subwindow.newtab: Ctrl+T + subwindow.closetab: Ctrl+W + subwindow.restoretab: Ctrl+Shift+T + subwindow.tableft: Ctrl+O + subwindow.movetableft: Ctrl+Shift+O + subwindow.tabright: Ctrl+P + subwindow.movetabright: Ctrl+Shift+P + +- mainwindow: + title: smolbote + width: 1280 + height: 720 + +- bookmarks: + path: ~/.config/smolbote/bookmarks.xbel + toolbar.show: Ctrl+Shift+B + toolbar.movable: false + toolbar.visible: true + +- downloads: + path: ~/Downloads + +- profile: + path: ~/.config/smolbote/profiles.d + default: default + search: https://duckduckgo.com/?q=%1&ia=web + homepage: about:blank + newtab: about:blank + +- session: + path: ~/.config/smolbote/session.d diff --git a/linux/makepkg/PKGBUILD b/linux/makepkg/PKGBUILD index 749da87..efdea15 100644 --- a/linux/makepkg/PKGBUILD +++ b/linux/makepkg/PKGBUILD @@ -16,7 +16,7 @@ arch=('x86_64' 'aarch64') license=('GPL3') depends=('qt6-svg' 'qt6-webengine' 'spdlog' 'fmt') -makedepends=('git' 'cmake' 'python-kconfiglib' 'openssl' 'qt6-tools' 'scdoc') +makedepends=('git' 'cmake' 'openssl' 'qt6-tools' 'scdoc') optdepends=('firejail: launch a sandboxed instance') # use git+file:///path/to/your/repo to build from a local repo @@ -29,12 +29,11 @@ b2sums=('SKIP' validpgpkeys=(BB1C090188E3E32B375C13FD095DE26BC16D2E98) # Aqua-sama <aqua@iserlohn-fortress.net> prepare() { + msg2 "Populate third_party packages..." mkdir "$srcdir/smolbote/third_party" ln -s "$srcdir/SingleApplication-3.4.1" "$srcdir/smolbote/third_party/SingleApplication" - cd $srcdir/smolbote - KCONFIG_CONFIG=linux/.config alldefconfig - + msg2 "Configure..." cmake -S $srcdir/smolbote -B $srcdir/build \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr \ diff --git a/scripts/gen-default-cfg.py b/scripts/gen-default-cfg.py deleted file mode 100755 index dc88ceb..0000000 --- a/scripts/gen-default-cfg.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import argparse -import kconfiglib - -def node_to_str(node): - if(node.item.type == kconfiglib.STRING): - return "std::string(\"" + node.item.str_value + "\")" - elif(node.item.type == kconfiglib.INT): - return "int(" + node.item.str_value + ")" - elif(node.item.type == kconfiglib.BOOL): - tri_val_str = ("false", "unknown", "true")[node.item.tri_value] - return "bool(" + tri_val_str + ")" - - return None - -def writeItem(node, file): - while node: - if isinstance(node.item, kconfiglib.Symbol): - name = node.item.name.lower().replace('_', '.') - print("\t{ \"" + name + "\", " + node_to_str(node) + " },", file=file) - - if node.list: - writeItem(node.list, file) - - node = node.next - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--kconfig", nargs="?", default="Kconfig", help="Top-level Kconfig") - parser.add_argument("--dotconfig", nargs="?", help=".config") - parser.add_argument("--input", type=argparse.FileType('r'), help="settings.h.in") - parser.add_argument("--output", type=argparse.FileType('w'), default=sys.stdout, help="Output location") - args = parser.parse_args() - - kconf = kconfiglib.Kconfig(args.kconfig) - if args.dotconfig is not None: - kconf.load_config(args.dotconfig) - - print("/* Autogenerated file", file=args.output) - print(" * kconfig: {}".format(args.kconfig), file=args.output) - print(" * dotconfig: {}".format(args.dotconfig), file=args.output) - print(" */", file=args.output) - - for line in args.input: - if "@__DEFAULT_CFG__" in line: - writeItem(kconf.top_node.list, file=args.output) - else: - print(line, end='', file=args.output) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9afb862..f80dbc7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,14 +1,3 @@ -# settings.h -add_custom_command( - OUTPUT settings.h - COMMAND ${PROJECT_SOURCE_DIR}/scripts/gen-default-cfg.py - --kconfig ${PROJECT_SOURCE_DIR}/Kconfig - --dotconfig ${PROJECT_SOURCE_DIR}/linux/.config - --input ${CMAKE_CURRENT_LIST_DIR}/settings.h.in - --output settings.h - DEPENDS ${PROJECT_SOURCE_DIR}/linux/.config -) - # version.h configure_file(version.h.in version.h) @@ -70,7 +59,6 @@ add_executable(poi # resources ${PROJECT_SOURCE_DIR}/data/resources.qrc ) -target_sources(poi PRIVATE settings.h) target_include_directories(poi PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_BINARY_DIR}) target_enable_warnings(poi) target_link_libraries(poi diff --git a/src/applicationmenu.cpp b/src/applicationmenu.cpp index dc888e7..aff5576 100644 --- a/src/applicationmenu.cpp +++ b/src/applicationmenu.cpp @@ -22,31 +22,31 @@ ApplicationMenu::ApplicationMenu(Browser *app, QWidget *parent) setTitle(qApp->applicationName()); Configuration conf; - const auto sessionPath = conf.value<QString>("session.path").value(); + const auto sessionPath = conf.value<QString>("session/path").value(); auto *actionSaveSession = addAction(tr("Save Session"), this, [sessionPath]() { auto *sessionDialog = new SaveSessionDialog(nullptr); if(sessionDialog->exec() == QDialog::Accepted) { sessionDialog->save(sessionPath); } }); - conf.shortcut<QAction>(*actionSaveSession, "shortcuts.session.save"); + conf.shortcut<QAction>(*actionSaveSession, "shortcuts/session.save"); auto *actionOpenSession = addAction(tr("Open Session"), this, []() { auto *sessionDialog = new SessionDialog(nullptr); sessionDialog->exec(); }); - conf.shortcut<QAction>(*actionOpenSession, "shortcuts.session.open"); + conf.shortcut<QAction>(*actionOpenSession, "shortcuts/session.open"); bottom_pluginSeparator = addSeparator(); auto *actionAbout = addAction(tr("About"), app, &Browser::about); - conf.shortcut<QAction>(*actionAbout, "shortcuts.window.about"); + conf.shortcut<QAction>(*actionAbout, "shortcuts/window.about"); auto *action_aboutPlugins = addAction(tr("About Plugins"), app, &Browser::aboutPlugins); - conf.shortcut(*action_aboutPlugins, "app.shortcuts.about.plugins"); + conf.shortcut(*action_aboutPlugins, "shortcuts/about.plugins"); auto *actionQuit = addAction(tr("Quit"), app, &Browser::quit); - conf.shortcut<QAction>(*actionQuit, "shortcuts.window.quit"); + conf.shortcut<QAction>(*actionQuit, "shortcuts/window.quit"); } void ApplicationMenu::addPlugin(QPluginLoader *plugin) diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp index 52dcae2..3174874 100644 --- a/src/bookmarks/bookmarkstoolbar.cpp +++ b/src/bookmarks/bookmarkstoolbar.cpp @@ -18,10 +18,10 @@ BookmarksToolbar::BookmarksToolbar(const BookmarkModel *model, MainWindow *paren m_window = parent; Configuration conf; - setObjectName("bookmarks.toolbar"); + setObjectName("bookmarks/toolbar"); setWindowTitle(tr("Bookmarks Toolbar")); - setMovable(conf.value<bool>("bookmarks.toolbar.movable").value()); - setVisible(conf.value<bool>("bookmarks.toolbar.visible").value()); + setMovable(conf.value<bool>("bookmarks/toolbar.movable").value()); + setVisible(conf.value<bool>("bookmarks/toolbar.visible").value()); setToolButtonStyle(Qt::ToolButtonTextBesideIcon); const auto *root = model->root(); diff --git a/src/browser.cpp b/src/browser.cpp index a2ae8c9..74da540 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -40,11 +40,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) { Configuration conf; - setApplicationName(conf.value<QString>("poi.name").value()); - setWindowIcon(QIcon(conf.value<QString>("poi.icon").value())); + setApplicationName(conf.value<QString>("poi/name").value()); + setWindowIcon(QIcon(conf.value<QString>("poi/icon").value())); setApplicationVersion(QVersionNumber::fromString(QLatin1String(poi_Version)).toString()); - if(const auto _translation = conf.value<QString>("browser.translation")) { + if(const auto _translation = conf.value<QString>("browser/translation")) { auto *translator = new QTranslator(this); if(translator->load(_translation.value())) installTranslator(translator); @@ -52,7 +52,7 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) delete translator; } - if(const auto _locale = conf.value<QString>("browser.locale")) { + if(const auto _locale = conf.value<QString>("browser/locale")) { auto *locale = new QTranslator(this); if(locale->load("qt_" + _locale.value(), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) installTranslator(locale); @@ -60,11 +60,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) delete locale; } - if(auto iconTheme = conf.value<QString>("browser.iconTheme")) { + if(auto iconTheme = conf.value<QString>("browser/iconTheme")) { QIcon::setThemeName(iconTheme.value()); } - if(auto stylesheet = conf.value<QString>("browser.stylesheet")) { + if(auto stylesheet = conf.value<QString>("browser/stylesheet")) { QFile f(stylesheet.value()); if(f.open(QIODevice::ReadOnly)) { setStyleSheet(f.readAll()); @@ -74,11 +74,11 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) // load profiles { - const auto profiles = Util::files(conf.value<QString>("profile.path").value(), { "*.profile" }); - const auto search = conf.value<QString>("profile.search").value(); - const auto homepage = QUrl::fromUserInput(conf.value<QString>("profile.homepage").value()); - const auto newtab = QUrl::fromUserInput(conf.value<QString>("profile.newtab").value()); - const auto default_id = conf.value<QString>("profile.default").value(); + const auto profiles = Util::files(conf.value<QString>("profile/path").value(), { "*.profile" }); + const auto search = conf.value<QString>("profile/search").value(); + const auto homepage = QUrl::fromUserInput(conf.value<QString>("profile/homepage").value()); + const auto newtab = QUrl::fromUserInput(conf.value<QString>("profile/newtab").value()); + const auto default_id = conf.value<QString>("profile/default").value(); m_profileManager = std::make_unique<WebProfileManager<false>>(profiles, default_id, search, homepage, newtab); m_profileManager->make_global(); @@ -92,13 +92,13 @@ Browser::Browser(int &argc, char *argv[], bool allowSecondary) } // downloads - m_downloads = std::make_unique<DownloadsWidget>(conf.value<QString>("downloads.path").value()); + m_downloads = std::make_unique<DownloadsWidget>(conf.value<QString>("downloads/path").value()); m_profileManager->walk([this](const QString &, WebProfile *profile, QSettings *) { connect(profile, &QWebEngineProfile::downloadRequested, m_downloads.get(), &DownloadsWidget::addDownload); }); // bookmarks - m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(conf.value<std::string>("bookmarks.path").value())); + m_bookmarks = std::make_shared<BookmarksWidget>(QString::fromStdString(conf.value<std::string>("bookmarks/path").value())); connect(m_bookmarks.get(), &BookmarksWidget::openUrl, this, [this](const QUrl &url) { m_windows.last()->createTab(url); }); diff --git a/src/main.cpp b/src/main.cpp index 42acf5c..8cd1d34 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,7 +10,6 @@ #include "configuration.h" #include "session/sessiondialog.h" #include "session_json.hpp" -#include "settings.h" #include <QCommandLineParser> #include <QFile> #include <QPluginLoader> @@ -72,14 +71,14 @@ int main(int argc, char **argv) // set this, otherwise the webview becomes black when using a stylesheet QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); - init_conf(parser.value(cmd_config).toStdString()); + spdlog::info("Loaded configuration: {}", Configuration::init_global(parser.value(cmd_config).toStdString())); Browser app(argc, argv); parser.process(app); const auto profile = []() { Configuration conf; - return conf.value<QString>("profile.default").value(); + return conf.value<QString>("profile/default").value(); }(); QStringList urls = parser.positionalArguments(); diff --git a/src/mainwindow/addressbar.cpp b/src/mainwindow/addressbar.cpp index d37a6a7..ed1cb3e 100644 --- a/src/mainwindow/addressbar.cpp +++ b/src/mainwindow/addressbar.cpp @@ -19,9 +19,9 @@ AddressBar::AddressBar(QWidget *parent) ui->setupUi(this); Configuration conf; - ui->urlBar->menuAction->setShortcut(QKeySequence(conf.value<QString>("shortcuts.address.menu").value())); + ui->urlBar->menuAction->setShortcut(QKeySequence(conf.value<QString>("shortcuts/address.menu").value())); - auto *focusShortcut = new QShortcut(QKeySequence(conf.value<QString>("shortcuts.address.focus").value()), parent); + auto *focusShortcut = new QShortcut(QKeySequence(conf.value<QString>("shortcuts/address.focus").value()), parent); connect(focusShortcut, &QShortcut::activated, ui->urlBar, [this]() { ui->urlBar->setFocus(); ui->urlBar->selectAll(); diff --git a/src/mainwindow/mainwindow.cpp b/src/mainwindow/mainwindow.cpp index 64c149c..bd5d0c2 100644 --- a/src/mainwindow/mainwindow.cpp +++ b/src/mainwindow/mainwindow.cpp @@ -30,16 +30,16 @@ MainWindow::MainWindow(const Session::MainWindow &mainwindow_data, QMenu *appMen Configuration config; // create UI - defaultWindowTitle = config.value<QString>("mainwindow.title").value(); + defaultWindowTitle = config.value<QString>("mainwindow/title").value(); setWindowTitle(defaultWindowTitle); - resize(config.value<int>("mainwindow.width").value(), config.value<int>("mainwindow.height").value()); - if(config.value<bool>("mainwindow.maximized").value_or(false)) { + resize(config.value<int>("mainwindow/width").value(), config.value<int>("mainwindow/height").value()); + if(config.value<bool>("mainwindow/maximized").value_or(false)) { setWindowState(Qt::WindowMaximized); } show(); navigationToolBar = new NavigationBar(this); - navigationToolBar->setMovable(config.value<bool>("navigation.movable").value_or(false)); + navigationToolBar->setMovable(config.value<bool>("navigation/movable").value_or(false)); addToolBar(Qt::TopToolBarArea, navigationToolBar); navigationToolBar->connectWebView(nullptr); diff --git a/src/mainwindow/menubar.cpp b/src/mainwindow/menubar.cpp index e557d50..e479e8d 100644 --- a/src/mainwindow/menubar.cpp +++ b/src/mainwindow/menubar.cpp @@ -79,30 +79,30 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) auto *actionBookmarks = window->addAction(tr("Bookmarks"), browser, [browser, parent]() { browser->showWidget(browser->bookmarks(), parent); }); - conf.shortcut<QAction>(*actionBookmarks, "shortcuts.window.bookmarks.show"); + conf.shortcut<QAction>(*actionBookmarks, "shortcuts/window.bookmarks.show"); auto *actionDownloads = window->addAction(tr("Downloads"), browser, [browser, parent]() { browser->showWidget(browser->downloads(), parent); }); - conf.shortcut<QAction>(*actionDownloads, "shortcuts.window.downloads.show"); + conf.shortcut<QAction>(*actionDownloads, "shortcuts/window.downloads.show"); window->addSeparator(); auto *actionNewWindow = window->addAction(tr("New Window"), browser, [browser]() { const Session::MainWindow window_data; browser->open({ window_data }, false); }); - conf.shortcut<QAction>(*actionNewWindow, "shortcuts.window.newwindow"); + conf.shortcut<QAction>(*actionNewWindow, "shortcuts/window.newwindow"); auto *actionNewSubwindow = window->addAction(tr("New Subwindow"), parent, [parent]() { const Session::SubWindow session; parent->createSubWindow(session); }); - conf.shortcut<QAction>(*actionNewSubwindow, "shortcuts.window.newgroup"); + conf.shortcut<QAction>(*actionNewSubwindow, "shortcuts/window.newgroup"); auto *actionCloseSubwindow = window->addAction(tr("Close Subwindow"), parent, [parent]() { parent->currentSubWindow()->close(); }); - conf.shortcut<QAction>(*actionCloseSubwindow, "shortcuts.subwindow.close"); + conf.shortcut<QAction>(*actionCloseSubwindow, "shortcuts/subwindow.close"); window->addSeparator()->setText(tr("Toolbars")); @@ -140,7 +140,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->setCurrentTab(index); }); }); - conf.shortcut<QAction>(*actionNewTab, "shortcuts.subwindow.newtab"); + conf.shortcut<QAction>(*actionNewTab, "shortcuts/subwindow.newtab"); subwindow->addSeparator(); @@ -150,7 +150,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->setCurrentTab(index); }); }); - conf.shortcut<QAction>(*actionRestoreTab, "shortcuts.subwindow.restoretab"); + conf.shortcut<QAction>(*actionRestoreTab, "shortcuts/subwindow.restoretab"); auto *restoreTabsMenu = subwindow->addMenu(tr("Restore previous tab")); connect(restoreTabsMenu, &QMenu::aboutToShow, parent, [parent, restoreTabsMenu]() { @@ -200,28 +200,28 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->setCurrentTab(qMax(0, currentIdx - 1)); }); }); - conf.shortcut<QAction>(*leftTab, "shortcuts.subwindow.tableft"); + conf.shortcut<QAction>(*leftTab, "shortcuts/subwindow.tableft"); auto *moveTabLeft = subwindow->addAction(tr("Move tab left"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { _subwindow->moveTab(currentIdx, currentIdx - 1); }); }); - conf.shortcut<QAction>(*moveTabLeft, "shortcuts.subwindow.movetableft"); + conf.shortcut<QAction>(*moveTabLeft, "shortcuts/subwindow.movetableft"); auto *rightTab = subwindow->addAction(tr("Switch to tab on the right"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { _subwindow->setCurrentTab(qMin(currentIdx + 1, _subwindow->tabCount() - 1)); }); }); - conf.shortcut<QAction>(*rightTab, "shortcuts.subwindow.tabright"); + conf.shortcut<QAction>(*rightTab, "shortcuts/subwindow.tabright"); auto *moveTabRight = subwindow->addAction(tr("Move tab right"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { _subwindow->moveTab(currentIdx, currentIdx + 1); }); }); - conf.shortcut<QAction>(*moveTabRight, "shortcuts.subwindow.movetabright"); + conf.shortcut<QAction>(*moveTabRight, "shortcuts/subwindow.movetabright"); subwindow->addSeparator(); @@ -230,7 +230,7 @@ MenuBar::MenuBar(QMenu *appMenu, MainWindow *parent) _subwindow->closeTab(currentIdx); }); }); - conf.shortcut<QAction>(*closeTab, "shortcuts.subwindow.closetab"); + conf.shortcut<QAction>(*closeTab, "shortcuts/subwindow.closetab"); subwindow->addAction(tr("Close tabs to the left"), parent, [parent]() { run_if(parent->currentSubWindow(), [](SubWindow *_subwindow, int currentIdx) { diff --git a/src/mainwindow/widgets/navigationbar.cpp b/src/mainwindow/widgets/navigationbar.cpp index 799ebec..6da6f6c 100644 --- a/src/mainwindow/widgets/navigationbar.cpp +++ b/src/mainwindow/widgets/navigationbar.cpp @@ -29,7 +29,7 @@ NavigationBar::NavigationBar(QWidget *parent) // Back button backAction = addAction(Util::icon(QStyle::SP_ArrowBack), tr("Back")); - config.shortcut<QAction>(*backAction, "shortcuts.navigation.back"); + config.shortcut<QAction>(*backAction, "shortcuts/navigation.back"); connect(backAction, &QAction::triggered, this, [this]() { m_view->history()->back(); }); @@ -47,7 +47,7 @@ NavigationBar::NavigationBar(QWidget *parent) }); backAction->setMenu(backMenu); - auto *backMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.backmenu").value()), this); + auto *backMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.backmenu").value()), this); connect(backMenuShortcut, &QShortcut::activated, backMenu, [this, backMenu]() { if(backAction->isEnabled()) { auto *widget = this->widgetForAction(backAction); @@ -57,7 +57,7 @@ NavigationBar::NavigationBar(QWidget *parent) // Forward button forwardAction = addAction(Util::icon(QStyle::SP_ArrowForward), tr("Forward")); - config.shortcut<QAction>(*forwardAction, "shortcuts.navigation.forward"); + config.shortcut<QAction>(*forwardAction, "shortcuts/navigation.forward"); connect(forwardAction, &QAction::triggered, this, [this]() { m_view->history()->forward(); }); @@ -75,7 +75,7 @@ NavigationBar::NavigationBar(QWidget *parent) }); forwardAction->setMenu(forwardMenu); - auto *forwardMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.forwardmenu").value()), this); + auto *forwardMenuShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.forwardmenu").value()), this); connect(forwardMenuShortcut, &QShortcut::activated, forwardMenu, [this, forwardMenu]() { if(forwardAction->isEnabled()) { auto *widget = this->widgetForAction(forwardAction); @@ -85,7 +85,7 @@ NavigationBar::NavigationBar(QWidget *parent) // Stop/Refresh button stopReloadAction = addAction(Util::icon(QStyle::SP_BrowserReload), tr("Refresh")); - config.shortcut<QAction>(*stopReloadAction, "shortcuts.navigation.refresh"); + config.shortcut<QAction>(*stopReloadAction, "shortcuts/navigation.refresh"); connect(stopReloadAction, &QAction::triggered, this, [this]() { if(m_view->isLoaded()) m_view->reload(); @@ -93,14 +93,14 @@ NavigationBar::NavigationBar(QWidget *parent) m_view->stop(); }); - auto *reloadShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts.navigation.reload").value()), this); + auto *reloadShortcut = new QShortcut(QKeySequence(config.value<QString>("shortcuts/navigation.reload").value()), this); connect(reloadShortcut, &QShortcut::activated, this, [this]() { m_view->triggerPageAction(QWebEnginePage::ReloadAndBypassCache); }); // Home button homeAction = addAction(Util::icon(QStyle::SP_DirHomeIcon), tr("Home")); - config.shortcut<QAction>(*homeAction, "shortcuts.navigation.home"); + config.shortcut<QAction>(*homeAction, "shortcuts/navigation.home"); connect(homeAction, &QAction::triggered, this, [this]() { m_view->load(m_view->profile()->homepage()); }); diff --git a/src/settings.h.in b/src/settings.h.in deleted file mode 100644 index 88fbcf5..0000000 --- a/src/settings.h.in +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include <QStandardPaths> -#include <configuration.h> -#include <fstream> - -inline const std::string init_conf(const std::string &path) -{ - auto value_map = std::make_unique<Configuration, std::initializer_list<std::pair<std::string, conf_value_t>>>({ - @__DEFAULT_CFG__ - }); - - const std::string cfgpath = [&]() { - if(path.empty()) - return value_map->value<std::string>("poi.cfg.path").value(); - - auto p = path; - if(p.front() == '~') - p.replace(0, 1, QStandardPaths::writableLocation(QStandardPaths::HomeLocation).toStdString()); - return p; - }(); - - std::fstream fs; - fs.open(cfgpath, std::fstream::in); - if(fs.is_open()) { - value_map->read(fs); - fs.close(); - } - - Configuration::move_global(std::move(value_map)); - return cfgpath; -} |