Sayonara Player
src
Utils
Settings
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>
47
class
SettingNotifier
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
{
99
SettingNotifier<KeyClassInstance>::instance
()->valueChanged();
100
}
101
}
102
103
104
#endif // SETTINGNOTIFIER_H
SettingNotifier
Definition:
SettingNotifier.h:48
AbstrSettingNotifier
Definition:
SettingNotifier.h:30
Generated on Wed Jan 6 2021 00:00:00 for Sayonara Player by
1.8.20