diff options
Diffstat (limited to 'options/bundle.cpp')
| -rw-r--r-- | options/bundle.cpp | 140 | 
1 files changed, 140 insertions, 0 deletions
diff --git a/options/bundle.cpp b/options/bundle.cpp new file mode 100644 index 00000000..a60810c5 --- /dev/null +++ b/options/bundle.cpp @@ -0,0 +1,140 @@ +#include "bundle.hpp" + +namespace options +{ + +namespace detail { + +bundle::bundle(const QString& group_name) +    : +      mtx(QMutex::Recursive), +      group_name(group_name), +      saved(group_name), +      transient(saved) +{ +} + +void bundle::reload() +{ +    { +        QMutexLocker l(&mtx); +        saved = group(group_name); +        transient = saved; +    } +    emit reloading(); +} + +void bundle::store_kv(const QString& name, const QVariant& datum) +{ +    QMutexLocker l(&mtx); + +    transient.put(name, datum); +} + +bool bundle::contains(const QString &name) const +{ +    QMutexLocker l(const_cast<QMutex*>(&mtx)); +    return transient.contains(name); +} + +void bundle::save() +{ +    if (group_name == "") +        return; + +    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 bundle::modifiedp() const // XXX unused +{ +    QMutexLocker l(const_cast<QMutex*>(&mtx)); +    return transient != saved; +} + +void bundler::bundle_decf(const bundler::k& key) +{ +    QMutexLocker l(&implsgl_mtx); + +    if (--std::get<0>(implsgl_data[key]) == 0) +    { +        qDebug() << "bundle -" << key; + +        implsgl_data.erase(key); +    } +} + +void bundler::after_profile_changed_() +{ +    QMutexLocker l(&implsgl_mtx); + +    for (auto& kv : implsgl_data) +    { +        tt& tuple = kv.second; +        std::weak_ptr<v>& bundle = std::get<1>(tuple); + +        mem<v> bundle_ = bundle.lock(); +        if (bundle_) +        { +            qDebug() << "bundle: reverting" << kv.first << "due to profile change"; +            bundle_->reload(); +        } +    } +} + +void bundler::refresh_all_bundles() +{ +    singleton().after_profile_changed_(); +} + +bundler::bundler() : implsgl_mtx(QMutex::Recursive) +{ +} + +bundler::~bundler() +{ +    qDebug() << "exit: bundle singleton"; +} + +std::shared_ptr<bundler::v> bundler::make_bundle(const bundler::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; + +    std::shared_ptr<v> shr(new v(key), [this](v* val) { bundle_decf(val->name()); }); + +    implsgl_data[key] = tt(1, shr); +    return shr; +} + +OPENTRACK_OPTIONS_EXPORT bundler& singleton() +{ +    static bundler ret; +    return ret; +} + +} // end options::detail + +} // end options +  | 
