diff options
| author | Stanislaw Halik <sthalik@misaki.pl> | 2016-08-12 18:00:49 +0200 | 
|---|---|---|
| committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-08-12 18:00:49 +0200 | 
| commit | 9040b187a1c4fa380f8a12207b9dd6d04b3a10ac (patch) | |
| tree | 115e1351571d690c1261a9d512e6d44e717f3051 /compat/options.cpp | |
| parent | 13a18b149764509a3f460be86590250cdcf690fb (diff) | |
all: rename modules s#^opentrack-##. and opentrack -> api
Adjust usages.
Diffstat (limited to 'compat/options.cpp')
| -rw-r--r-- | compat/options.cpp | 239 | 
1 files changed, 239 insertions, 0 deletions
| diff --git a/compat/options.cpp b/compat/options.cpp new file mode 100644 index 00000000..8c6e6c65 --- /dev/null +++ b/compat/options.cpp @@ -0,0 +1,239 @@ +#include "options.hpp" + +namespace options +{ + +group::group(const QString& name) : name(name) +{ +    auto conf = ini_file(); +    conf->beginGroup(name); +    for (auto& k_ : conf->childKeys()) +    { +        auto tmp = k_.toUtf8(); +        QString k(tmp); +        kvs[k] = conf->value(k_); +    } +    conf->endGroup(); +} + +void group::save() const +{ +    auto s = ini_file(); +    s->beginGroup(name); +    for (auto& i : kvs) +        s->setValue(i.first, i.second); +    s->endGroup(); +} + +void group::put(const QString &s, const QVariant &d) +{ +    kvs[s] = d; +} + +bool group::contains(const QString &s) const +{ +    return kvs.count(s) != 0; +} + +QString group::ini_directory() +{ +    const auto dirs = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation); +    if (dirs.size() == 0) +        return ""; +    if (QDir(dirs[0]).mkpath(OPENTRACK_ORG)) +        return dirs[0] + "/" OPENTRACK_ORG; +    return ""; +} + +QString group::ini_filename() +{ +    QSettings settings(OPENTRACK_ORG); +    return settings.value(OPENTRACK_CONFIG_FILENAME_KEY, OPENTRACK_DEFAULT_CONFIG).toString(); +} + +QString group::ini_pathname() +{ +    const auto dir = ini_directory(); +    if (dir == "") +        return ""; +    return dir + "/" + ini_filename(); +} + +const QStringList group::ini_list() +{ +    const auto dirname = ini_directory(); +    if (dirname == "") +        return QStringList(); +    QDir settings_dir(dirname); +    return settings_dir.entryList( QStringList { "*.ini" } , QDir::Files, QDir::Name ); +} + +const mem<QSettings> group::ini_file() +{ +    const auto pathname = ini_pathname(); +    if (pathname != "") +        return std::make_shared<QSettings>(ini_pathname(), QSettings::IniFormat); +    return std::make_shared<QSettings>(); +} + +bool group::operator==(const group& other) const +{ +    for (const auto& kv : kvs) +    { +        const QVariant val = other.get<QVariant>(kv.first); +        if (!other.contains(kv.first) || kv.second != val) +        { +            qDebug() << "bundle" << name << "modified" << "key" << kv.first << "-" << val << "<>" << kv.second; +            return false; +        } +    } + +    for (const auto& kv : other.kvs) +    { +        const QVariant val = get<QVariant>(kv.first); +        if (!contains(kv.first) || kv.second != val) +        { +            qDebug() << "bundle" << name << "modified" << "key" << kv.first << "-" << kv.second << "<>" << val; +            return false; +        } +    } +    return true; +} + +impl_bundle::impl_bundle(const QString& group_name) +    : +      mtx(QMutex::Recursive), +      group_name(group_name), +      saved(group_name), +      transient(saved) +{ +} + +void impl_bundle::reload() +{ +    { +        QMutexLocker l(&mtx); +        saved = group(group_name); +        transient = saved; +    } +    emit reloading(); +} + +void impl_bundle::store_kv(const QString& name, const QVariant& datum) +{ +    QMutexLocker l(&mtx); + +    transient.put(name, datum); +} + +bool impl_bundle::contains(const QString &name) const +{ +    QMutexLocker l(const_cast<QMutex*>(&mtx)); +    return transient.contains(name); +} + +void impl_bundle::save() +{ +    bool modified_ = false; + +    { +        QMutexLocker l(&mtx); +        if (saved != transient) +        { +            qDebug() << "bundle" << group_name << "changed, saving"; +            modified_ = true; +            saved = transient; +            saved.save(); +        } +    } + +    if (modified_) +        emit saving(); +} + +bool impl_bundle::modifiedp() const // XXX unused +{ +    QMutexLocker l(const_cast<QMutex*>(&mtx)); +    return transient != saved; +} + +base_value::base_value(pbundle b, const QString &name) : +    b(b), +    self_name(name) +{ +} + +opts::~opts() +{ +    b->reload(); +} + +opts::opts(const QString &name) : b(bundle(name)) +{ +} + +custom_type_initializer::custom_type_initializer() +{ +    qRegisterMetaTypeStreamOperators<slider_value>("slider_value"); +    QMetaType::registerDebugStreamOperator<slider_value>(); +} + +custom_type_initializer custom_type_initializer::singleton; + +namespace detail { + +opt_bundle::opt_bundle(const QString& group_name) +    : impl_bundle(group_name) +{ +} + +opt_bundle::~opt_bundle() +{ +    detail::singleton().bundle_decf(group_name); +} + +void opt_singleton::bundle_decf(const opt_singleton::k& key) +{ +    QMutexLocker l(&implsgl_mtx); + +    if (--std::get<0>(implsgl_data[key]) == 0) +    { +        qDebug() << "bundle -" << key; + +        implsgl_data.erase(key); +    } +} + +opt_singleton::opt_singleton() : implsgl_mtx(QMutex::Recursive) +{ +} + +pbundle opt_singleton::bundle(const opt_singleton::k &key) +{ +    QMutexLocker l(&implsgl_mtx); + +    if (implsgl_data.count(key) != 0) +    { +        auto shared = std::get<1>(implsgl_data[key]).lock(); +        if (shared != nullptr) +            return shared; +    } + +    qDebug() << "bundle +" << key; + +    auto shr = std::make_shared<v>(key); +    implsgl_data[key] = tt(1, shr); +    return shr; +} + +OPENTRACK_COMPAT_EXPORT opt_singleton& singleton() +{ +    static opt_singleton ret; +    return ret; +} + + +} // end options::detail + +} // end options + | 
