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