diff options
Diffstat (limited to 'options/group.cpp')
-rw-r--r-- | options/group.cpp | 190 |
1 files changed, 30 insertions, 160 deletions
diff --git a/options/group.cpp b/options/group.cpp index 69378d51..d5829008 100644 --- a/options/group.cpp +++ b/options/group.cpp @@ -8,205 +8,75 @@ #include "group.hpp" #include "defs.hpp" +#include "globals.hpp" -#include "compat/timer.hpp" -#include "compat/library-path.hpp" - -#include <cmath> +#include <utility> +#include <algorithm> #include <QFile> -#include <QStandardPaths> #include <QDir> -#include <QDebug> -namespace options { +namespace options::detail { + +using namespace options::globals; group::group(const QString& name) : name(name) { - if (name == "") + constexpr unsigned reserved_buckets = 64; + kvs.reserve(reserved_buckets); + kvs.max_load_factor(0.4375); + + if (name.isEmpty()) return; with_settings_object([&](QSettings& conf) { conf.beginGroup(name); - for (auto& k_ : conf.childKeys()) - { - auto tmp = k_.toUtf8(); - QString k(tmp); - QVariant val = conf.value(k_); - if (val.type() != QVariant::Invalid) - kvs[k] = std::move(val); - } + for (auto const& k : conf.childKeys()) + kvs[k] = conf.value(k); conf.endGroup(); }); } void group::save() const { - if (name == "") + if (name.isEmpty()) return; with_settings_object([&](QSettings& s) { s.beginGroup(name); - for (auto& i : kvs) + for (auto const& i : kvs) s.setValue(i.first, i.second); s.endGroup(); - - mark_ini_modified(); }); } -void group::put(const QString &s, const QVariant &d) -{ - kvs[s] = d; -} - -bool group::contains(const QString &s) const -{ - const auto it = kvs.find(s); - return it != kvs.cend() && it->second != QVariant::Invalid; -} - -bool group::is_portable_installation() +void group::put(const QString& s, QVariant&& d) { -#if defined _WIN32 - if (QFile::exists(OPENTRACK_BASE_PATH + "/portable.txt")) - return true; -#endif - return false; -} - -QString group::ini_directory() -{ - - QString dir; - - if (is_portable_installation()) - { - dir = OPENTRACK_BASE_PATH; - - static const QString subdir = "ini"; - - if (!QDir(dir).mkpath(subdir)) - return QString(); - - return dir + '/' + subdir; - } + if (d.isNull()) + kvs.erase(s); else - { - dir = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).value(0, QString()); - if (dir.isEmpty()) - return QString(); - if (!QDir(dir).mkpath(OPENTRACK_ORG)) - return QString(); - - dir += '/'; - dir += OPENTRACK_ORG; - } - - return dir; -} - -QString group::ini_filename() -{ - return with_global_settings_object([&](QSettings& settings) { - const QString ret = settings.value(OPENTRACK_CONFIG_FILENAME_KEY, OPENTRACK_DEFAULT_CONFIG).toString(); - if (ret.size() == 0) - return QStringLiteral(OPENTRACK_DEFAULT_CONFIG); - return ret; - }); + kvs[s] = d; } -QString group::ini_pathname() +void group::put(const QString& s, const QVariant& d) { - const auto dir = ini_directory(); - if (dir == "") - return ""; - return dir + "/" + ini_filename(); + put(s, QVariant{d}); } -QString group::ini_combine(const QString& filename) +bool group::contains(const QString& s) const { - return ini_directory() + QStringLiteral("/") + filename; -} - -QStringList group::ini_list() -{ - const auto dirname = ini_directory(); - if (dirname == "") - return QStringList(); - QDir settings_dir(dirname); - QStringList list = settings_dir.entryList( QStringList { "*.ini" } , QDir::Files, QDir::Name ); - std::sort(list.begin(), list.end()); - return list; -} - -void group::mark_ini_modified() -{ - QMutexLocker l(&cur_ini_mtx); - ini_modifiedp = true; -} - -QString group::cur_ini_pathname; - -std::shared_ptr<QSettings> group::cur_ini; -QMutex group::cur_ini_mtx(QMutex::Recursive); -int group::ini_refcount = 0; -bool group::ini_modifiedp = false; - -std::shared_ptr<QSettings> group::cur_global_ini; -QMutex group::global_ini_mtx(QMutex::Recursive); -int group::global_ini_refcount = 0; -bool group::global_ini_modifiedp = false; - -std::shared_ptr<QSettings> group::cur_settings_object() -{ - const QString pathname = ini_pathname(); - - if (pathname.isEmpty()) - return std::make_shared<QSettings>(); - - if (pathname != cur_ini_pathname) - { - cur_ini = std::make_shared<QSettings>(pathname, QSettings::IniFormat); - cur_ini_pathname = pathname; - } - - return cur_ini; + const auto it = kvs.find(s); + return it != kvs.cend(); } -std::shared_ptr<QSettings> group::cur_global_settings_object() +QVariant group::get_variant(const QString& name) const { - if (cur_global_ini) - return cur_global_ini; - - if (!is_portable_installation()) - cur_global_ini = std::make_shared<QSettings>(OPENTRACK_ORG); - else - { - static const QString pathname = OPENTRACK_BASE_PATH + QStringLiteral("/globals.ini"); - cur_global_ini = std::make_shared<QSettings>(pathname, QSettings::IniFormat); - } + auto it = kvs.find(name); + if (it != kvs.cend()) + return it->second; - return cur_global_ini; + return {}; } -never_inline -group::saver_::~saver_() -{ - if (--refcount == 0 && modifiedp) - { - modifiedp = false; - s.sync(); - if (s.status() != QSettings::NoError) - qDebug() << "error with .ini file" << s.fileName() << s.status(); - } -} - -never_inline -group::saver_::saver_(QSettings& s, int& refcount, bool& modifiedp) : - s(s), refcount(refcount), modifiedp(modifiedp) -{ - refcount++; -} +} // ns options::detail -} // ns options |