diff options
Diffstat (limited to 'options')
| -rw-r--r-- | options/bundle.cpp | 59 | ||||
| -rw-r--r-- | options/bundle.hpp | 20 | 
2 files changed, 64 insertions, 15 deletions
| diff --git a/options/bundle.cpp b/options/bundle.cpp index dc0f0fcf..a17b04fb 100644 --- a/options/bundle.cpp +++ b/options/bundle.cpp @@ -29,17 +29,21 @@ bundle::bundle(const QString& group_name) :  bundle::~bundle() = default; -void bundle::reload() +void bundle::reload_no_notify()  {      if (group_name.isEmpty())          return; -    { -        QMutexLocker l{&mtx}; +    QMutexLocker l{&mtx}; -        saved = group(group_name); -        transient = saved; +    saved = group(group_name); +    transient = saved; +} +void bundle::notify() +{ +    { +        QMutexLocker l(&mtx);          connector::notify_all_values();      } @@ -47,6 +51,17 @@ void bundle::reload()      emit changed();  } +void bundle::reload() +{ +    { +        QMutexLocker l{&mtx}; +        reload_no_notify(); +        connector::notify_all_values(); +    } +    emit reloading(); +    emit changed(); +} +  void bundle::set_all_to_default()  {      connector::set_all_to_default_(); @@ -96,7 +111,7 @@ void bundle::save()      emit saving();  } -void bundler::after_profile_changed_() +void bundler::reload_no_notify_()  {      QMutexLocker l(&implsgl_mtx); @@ -107,16 +122,38 @@ void bundler::after_profile_changed_()          if (bundle_)          {              //qDebug() << "bundle: reverting" << kv.first << "due to profile change"; -            bundle_->reload(); +            bundle_->reload_no_notify();          }      }  } -void bundler::refresh_all_bundles() +void bundler::notify_()  { -    bundler_singleton().after_profile_changed_(); +    QMutexLocker l(&implsgl_mtx); + +    for (auto& kv : implsgl_data) +    { +        weak bundle = kv.second; +        shared bundle_ = bundle.lock(); +        if (bundle_) +        { +            //qDebug() << "bundle: reverting" << kv.first << "due to profile change"; +            bundle_->notify(); +        } +    } +} + +void bundler::reload_() +{ +    QMutexLocker l(&implsgl_mtx); +    notify_(); +    reload_no_notify_();  } +void bundler::notify() { singleton().notify_(); } +void bundler::reload_no_notify() { singleton().reload_no_notify_(); } +void bundler::reload() { singleton().reload_(); } +  bundler::bundler() = default;  bundler::~bundler() = default; @@ -153,7 +190,7 @@ std::shared_ptr<bundler::v> bundler::make_bundle_(const k& key)      return shr;  } -bundler& bundler::bundler_singleton() +bundler& bundler::singleton()  {      static bundler ret;      return ret; @@ -166,7 +203,7 @@ namespace options {  std::shared_ptr<bundle_> make_bundle(const QString& name)  {      if (!name.isEmpty()) -        return detail::bundler::bundler_singleton().make_bundle_(name); +        return detail::bundler::singleton().make_bundle_(name);      else          return std::make_shared<bundle_>(QString());  } diff --git a/options/bundle.hpp b/options/bundle.hpp index 4c2b9781..c1bb716d 100644 --- a/options/bundle.hpp +++ b/options/bundle.hpp @@ -30,6 +30,7 @@  namespace options::detail {      class bundle; +    struct bundler;  } // ns options::detail  namespace options { @@ -44,11 +45,15 @@ class OTR_OPTIONS_EXPORT bundle final : public QObject, public connector  {      Q_OBJECT +    friend struct bundler; +      mutable QMutex mtx { QMutex::Recursive };      const QString group_name;      group saved;      group transient; +    void reload_no_notify(); +  signals:      void reloading();      void saving() const; @@ -68,6 +73,7 @@ public:      bool contains(const QString& name) const;      QVariant get_variant(const QString& name) const; +    void notify();  public slots:      void save(); @@ -82,19 +88,25 @@ struct OTR_OPTIONS_EXPORT bundler final      using weak = std::weak_ptr<v>;      using shared = std::shared_ptr<v>; -    static void refresh_all_bundles(); +    static void notify(); +    static void reload_no_notify(); + +    void reload();  private:      QMutex implsgl_mtx { QMutex::Recursive };      std::unordered_map<k, weak> implsgl_data {}; -    void after_profile_changed_(); +    void notify_(); +    void reload_no_notify_(); + +    void reload_(); -    friend OTR_OPTIONS_EXPORT +    friend      std::shared_ptr<v> options::make_bundle(const QString& name);      std::shared_ptr<v> make_bundle_(const k& key); -    static bundler& bundler_singleton(); +    static bundler& singleton();      bundler();      ~bundler(); | 
