From fcf3870b7c0f30a5991e518ad8a404a9d38c3a45 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 26 Jan 2018 23:09:31 +0100 Subject: Using boost::program_options instead of libconfig --- src/configuration.cpp | 228 ++++++++++++++++++-------------------------------- 1 file changed, 82 insertions(+), 146 deletions(-) (limited to 'src/configuration.cpp') diff --git a/src/configuration.cpp b/src/configuration.cpp index b281b70..4e72d18 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -7,163 +7,99 @@ */ #include "configuration.h" -#include -#include -#include +#include +#include -using namespace libconfig; +namespace po = boost::program_options; -Configuration::Configuration(const std::string &path, const std::string &home) +Configuration::Configuration(const QStringList &options) { - m_userCfg = new Config(); - // prettier output - m_userCfg->setOption(Config::OptionSemicolonSeparators, true); - m_userCfg->setOption(Config::OptionColonAssignmentForGroups, false); - m_userCfg->setOption(Config::OptionColonAssignmentForNonGroups, false); - m_userCfg->setOption(Config::OptionOpenBraceOnSeparateLine, false); - m_userCfg->setOption(Config::OptionFsync, true); - - m_userCfgPath = path; - m_homePath = home; -} - -Configuration::~Configuration() -{ - delete m_userCfg; -} - -bool Configuration::read(const QString &path) -{ - QFile conf(path); - - if(!conf.open(QIODevice::ReadOnly)) { - return false; - } - - try { - m_userCfg->readString(conf.readAll().toStdString()); - conf.close(); - } catch(const ParseException &e) { - return false; - } - - return true; -} - -bool Configuration::writeIfNeeded(const std::string &path) -{ - if(!path.empty()) - m_userCfgPath = path; - - if(!changed) - return true; - - try { - m_userCfg->writeFile(m_userCfgPath.c_str()); - } catch(const FileIOException &e) { - return false; - } - - changed = false; - return true; -} - -std::vector Configuration::childrenSettings(const char *name) -{ - std::vector groupNames; - const Setting &root = m_userCfg->lookup(name); - - for(const Setting &setting : root) { - if(setting.getType() != Setting::TypeGroup) { - groupNames.emplace_back(setting.getName()); - //groupNames.push_back(setting.getName()); + 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()->default_value("")) + + // default window size + ("browser.window.height", po::value()->default_value(720)) + ("browser.window.width", po::value()->default_value(1280)) + ("browser.window.maximized", po::value()->default_value(true)) + ("browser.window.title", po::value()->default_value("title — smolbote [profile]")) + + // window ui + ("browser.ui.navtoolbarMovable", po::value()->default_value(false)) + ("browser.ui.tabtoolbarMovable", po::value()->default_value(false)) + + // browser shortcuts + + // browser menu + ("browser.shortcuts.newWindow", po::value()->default_value("Ctrl+N")) + ("browser.shortcuts.newTab", po::value()->default_value("Ctrl+T")) + ("browser.shortcuts.about", po::value()->default_value("F1")) + ("browser.shortcuts.quit", po::value()->default_value("Ctrl+Q")) + + // navigation + ("browser.shortcuts.back", po::value()->default_value("Ctrl+Left")) + ("browser.shortcuts.forward", po::value()->default_value("Ctrl+Right")) + ("browser.shortcuts.refresh", po::value()->default_value("F5")) + ("browser.shortcuts.reload", po::value()->default_value("Ctrl+F5")) + ("browser.shortcuts.home", po::value()->default_value("Ctrl+Home")) + + // tabs + ("browser.shortcuts.tabClose", po::value()->default_value("Ctrl+X")) + ("browser.shortcuts.tabLeft", po::value()->default_value("Ctrl+O")) + ("browser.shortcuts.tabRight", po::value()->default_value("Ctrl+P")) + + // page + ("browser.shortcuts.toggleSearchBox", po::value()->default_value("F3")) + ("browser.shortcuts.focusAddress", po::value()->default_value("F4")) + ("browser.shortcuts.fullscreen", po::value()->default_value("F11")) + + // Filter settings + ("filter.path", po::value()->default_value("~/.config/smolbote/hosts.d")) + + // Plugin settings + ("plugins.path", po::value()->default_value("~/.config/smolbote/plugins.d")) + + // Profile settings + ("profile.path", po::value()->default_value("~/.config/smolbote/profiles.d")) + ("profile.search", po::value()->default_value("https://duckduckgo.com/?q=$term&ia=web")) + ("profile.homepage", po::value()->default_value("about:blank")) + ("profile.newtab", po::value()->default_value("about:blank")) + + // Bookmark settings + ("bookmarks.path", po::value()->default_value("~/.config/smolbote/bookmarks.xbel")) + ("bookmarks.shortcut", po::value()->default_value("Ctrl+B")) + + // Downloads settings + ("downloads.path", po::value()->default_value("~/Downloads")) + ("downloads.shortcut", po::value()->default_value("Ctrl+D")) + ; + + // store the defaults into the vm + { + int argc = options.length(); + const char* argv[argc]; + for(int i = 0; i < argc; ++i) { + argv[i] = qUtf8Printable(options.at(i)); } + + po::store(po::parse_command_line(argc, argv, desc), vm); } - return groupNames; } -std::vector Configuration::childrenGroups(const char *name) +Configuration::~Configuration() { - std::vector groupNames; - const Setting &root = m_userCfg->lookup(name); - - for(const Setting &setting : root) { - if(setting.getType() == Setting::TypeGroup) { - groupNames.emplace_back(setting.getName()); - //groupNames.push_back(setting.getName()); - } - } - return groupNames; } -std::string castToString(const libconfig::Setting &v) +bool Configuration::read(const QString &path) { - // cast depending on type - // type checks are done during compile time - switch(v.getType()) { - case Setting::TypeNone: - return std::string(); - - case Setting::TypeInt: - // int, unsigned int, long, unsigned long - return std::to_string(static_cast(v)); - - case Setting::TypeInt64: - // int, unsigned int; long long, unsigned long long - return std::to_string(static_cast(v)); - - case Setting::TypeFloat: - // float, double - return std::to_string(static_cast(v)); - - case Setting::TypeString: - // const char*, std::string - return std::string(static_cast(v)); - - case Setting::TypeBoolean: - // bool - return std::string(static_cast(v) ? "true" : "false"); - - case Setting::TypeGroup: - case Setting::TypeArray: - case Setting::TypeList: - return std::string(); - } + std::ifstream f(path.toStdString(), std::ifstream::in); + po::store(po::parse_config_file(f, desc, false), vm); + return true; } -void setFromString(libconfig::Setting &setting, const std::string &value) -{ - switch(setting.getType()) { - case libconfig::Setting::TypeNone: - break; - - case libconfig::Setting::TypeInt: - case libconfig::Setting::TypeInt64: - setting = std::stoi(value); - break; - - case libconfig::Setting::TypeFloat: - setting = std::stod(value); - break; - - case libconfig::Setting::TypeString: - setting = value.c_str(); - break; - - case libconfig::Setting::TypeBoolean: - if(value == "true") { - setting = true; - } else if(value == "false") { - setting = false; - } - break; - - case libconfig::Setting::TypeGroup: - break; - case libconfig::Setting::TypeArray: - break; - case libconfig::Setting::TypeList: - break; - } -} -- cgit v1.2.1