diff options
Diffstat (limited to 'lib/configuration')
-rw-r--r-- | lib/configuration/CMakeLists.txt | 8 | ||||
-rw-r--r-- | lib/configuration/configuration.cpp | 108 | ||||
-rw-r--r-- | lib/configuration/configuration.h | 76 |
3 files changed, 192 insertions, 0 deletions
diff --git a/lib/configuration/CMakeLists.txt b/lib/configuration/CMakeLists.txt new file mode 100644 index 0000000..f68a5b1 --- /dev/null +++ b/lib/configuration/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(configuration + configuration.cpp + configuration.h) + +target_link_libraries(configuration + Qt5::Core + ${Boost_LIBRARIES} +) diff --git a/lib/configuration/configuration.cpp b/lib/configuration/configuration.cpp new file mode 100644 index 0000000..c114155 --- /dev/null +++ b/lib/configuration/configuration.cpp @@ -0,0 +1,108 @@ +/* + * 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/smolbote.hg + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#include "configuration.h" +#include <QStandardPaths> +#include <fstream> + +namespace po = boost::program_options; + +Configuration::Configuration() +{ + m_homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation).toStdString(); + + // create description + desc.add_options() + + // Browser default settings + // default profile name the browser should use; "" is off-the-record + ("browser.profile", po::value<std::string>()->default_value("")) + + // default window size + ("browser.window.height", po::value<int>()->default_value(720)) + ("browser.window.width", po::value<int>()->default_value(1280)) + ("browser.window.maximized", po::value<bool>()->default_value(true)) + ("browser.window.title", po::value<std::string>()->default_value("title — smolbote [profile]")) + + // window ui + ("browser.ui.navtoolbarMovable", po::value<bool>()->default_value(false)) + ("browser.ui.tabtoolbarMovable", po::value<bool>()->default_value(false)) + + // browser shortcuts + + // browser menu + ("browser.shortcuts.newWindow", po::value<std::string>()->default_value("Ctrl+N")) + ("browser.shortcuts.newTab", po::value<std::string>()->default_value("Ctrl+T")) + ("browser.shortcuts.about", po::value<std::string>()->default_value("F1")) + ("browser.shortcuts.quit", po::value<std::string>()->default_value("Ctrl+Q")) + + // navigation + ("browser.shortcuts.back", po::value<std::string>()->default_value("Ctrl+Left")) + ("browser.shortcuts.forward", po::value<std::string>()->default_value("Ctrl+Right")) + ("browser.shortcuts.refresh", po::value<std::string>()->default_value("F5")) + ("browser.shortcuts.reload", po::value<std::string>()->default_value("Ctrl+F5")) + ("browser.shortcuts.home", po::value<std::string>()->default_value("Ctrl+Home")) + + // tabs + ("browser.shortcuts.tabClose", po::value<std::string>()->default_value("Ctrl+X")) + ("browser.shortcuts.tabLeft", po::value<std::string>()->default_value("Ctrl+O")) + ("browser.shortcuts.tabRight", po::value<std::string>()->default_value("Ctrl+P")) + + // page + ("browser.shortcuts.toggleSearchBox", po::value<std::string>()->default_value("F3")) + ("browser.shortcuts.focusAddress", po::value<std::string>()->default_value("F4")) + ("browser.shortcuts.fullscreen", po::value<std::string>()->default_value("F11")) + + // Filter settings + ("filter.path", po::value<std::string>()->default_value("~/.config/smolbote/hosts.d")) + + // Plugin settings + ("plugins.path", po::value<std::string>()->default_value("~/.config/smolbote/plugins.d")) + + // Profile settings + ("profile.path", po::value<std::string>()->default_value("~/.config/smolbote/profiles.d")) + ("profile.search", po::value<std::string>()->default_value("https://duckduckgo.com/?q=$term&ia=web")) + ("profile.homepage", po::value<std::string>()->default_value("about:blank")) + ("profile.newtab", po::value<std::string>()->default_value("about:blank")) + + // Bookmark settings + ("bookmarks.path", po::value<std::string>()->default_value("~/.config/smolbote/bookmarks.xbel")) + ("bookmarks.shortcut", po::value<std::string>()->default_value("Ctrl+B")) + + // Downloads settings + ("downloads.path", po::value<std::string>()->default_value("~/Downloads")) + ("downloads.shortcut", po::value<std::string>()->default_value("Ctrl+D")) + ; + + // store the defaults into the vm + { + const char* argv[0]; + po::store(po::parse_command_line(0, argv, desc), vm); + } + +} + +Configuration::~Configuration() = default; + +bool Configuration::read(const QString &path) +{ + std::ifstream f(path.toStdString(), std::ifstream::in); + po::store(po::parse_config_file(f, desc, false), vm); + return true; +} + +bool Configuration::parse(int argc, const char **argv) +{ + try { + po::store(po::parse_command_line(argc, argv, desc), vm); + } catch (const po::error &e) { + return false; + } + + return true; +} diff --git a/lib/configuration/configuration.h b/lib/configuration/configuration.h new file mode 100644 index 0000000..4d58a90 --- /dev/null +++ b/lib/configuration/configuration.h @@ -0,0 +1,76 @@ +/* + * 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/smolbote.hg + * + * SPDX-License-Identifier: GPL-3.0 + */ + +#ifndef SMOLBOTE_CONFIGURATION_H +#define SMOLBOTE_CONFIGURATION_H + +#include <optional> +#include <string> +#include <vector> +#include <QString> +#include <boost/program_options.hpp> +#include <QStringList> + +class Configuration +{ +public: + explicit Configuration(); + ~Configuration(); + + bool read(const QString &path); + bool parse(int argc, const char **argv); + + template <typename T> + std::optional<T> value(const char *path) const + { + // if setting doesn't exist, we crash + // in debug builds, check if setting exists +#ifdef QT_DEBUG + if(vm.count(path) == 0) { + qWarning("value(%s) does not exist, probably crashing now", path); + } +#endif + + if constexpr(std::is_same_v<T, std::string>) { + std::string r; + try { + r = vm[path].as<std::string>(); + } catch (boost::bad_any_cast &) { + // try int + try { + r = std::to_string(vm[path].as<int>()); + } catch (boost::bad_any_cast &) { + + // try bool, and crash if not that either + r = vm[path].as<bool>() ? "true" : "false"; + } + + } + + // check if it's a path + if(r.front() == '~') { + r.replace(0, 1, m_homePath); + } + + return std::optional<std::string>(r); + } else + return std::optional<T>(vm[path].as<T>()); + } + + const std::vector<boost::shared_ptr<boost::program_options::option_description>> & options() { + return desc.options(); + } + +private: + boost::program_options::options_description desc; + boost::program_options::variables_map vm; + + std::string m_homePath; +}; + +#endif // SMOLBOTE_CONFIGURATION_H |