summaryrefslogtreecommitdiffhomepage
path: root/options/group.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'options/group.cpp')
-rw-r--r--options/group.cpp190
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