Sayonara Player
SettingNotifier.h
1 /* SettingNotifier.h */
2 
3 /* Copyright (C) 2011-2020 Michael Lugmair (Lucio Carreras)
4  *
5  * This file is part of sayonara player
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef SETTINGNOTIFIER_H
22 #define SETTINGNOTIFIER_H
23 
24 #include <functional>
25 #include <QObject>
26 
27 #pragma once
28 
29 class AbstrSettingNotifier : public QObject
30 {
31  Q_OBJECT
32 
33 signals:
34  void sigValueChanged();
35 
36 public:
37  template<typename T>
38  void addListener(T* c, void (T::*fn)())
39  {
40  connect(this, &AbstrSettingNotifier::sigValueChanged, c, fn);
41  }
42 
43  void emit_value_changed();
44 };
45 
46 template<typename KeyClass>
48 {
49 private:
50  AbstrSettingNotifier* m=nullptr;
51 
52  SettingNotifier() :
53  m(new AbstrSettingNotifier())
54  {}
55 
56  SettingNotifier(const SettingNotifier& other) = delete;
57 
58 public:
59  ~SettingNotifier() = default;
60 
61  static SettingNotifier<KeyClass>* instance()
62  {
63  static SettingNotifier<KeyClass> inst;
64  return &inst;
65  }
66 
67  void valueChanged()
68  {
69  m->emit_value_changed();
70  }
71 
72  template<typename T>
73  void addListener(T* c, void (T::*fn)())
74  {
75  m->addListener(c, fn);
76  }
77 };
78 
79 
80 namespace Set
81 {
82  template<typename KeyClassInstance, typename T>
83  //typename std::enable_if<std::is_base_of<SayonaraClass, T>::value, void>::type
84  void
85  listen(T* t, void (T::*fn)(), bool run=true)
86  {
87  SettingNotifier<KeyClassInstance>::instance()->addListener(t, fn);
88 
89  if(run)
90  {
91  auto callable = std::bind(fn, t);
92  callable();
93  }
94  }
95 
96  template<typename KeyClassInstance>
97  void shout()
98  {
100  }
101 }
102 
103 
104 #endif // SETTINGNOTIFIER_H
SettingNotifier
Definition: SettingNotifier.h:48
AbstrSettingNotifier
Definition: SettingNotifier.h:30