/
Binding.h
93 lines (76 loc) · 1.87 KB
/
Binding.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once
#include "ishaders.h"
#include <wx/checkbox.h>
namespace ui
{
template<typename Source>
class Binding
{
private:
Source _source;
public:
using Ptr = std::shared_ptr<Binding>;
virtual ~Binding()
{}
const Source& getSource() const
{
return _source;
}
void setSource(const Source& source)
{
_source = source;
onSourceChanged();
}
virtual void updateFromSource() = 0;
protected:
virtual void onSourceChanged()
{}
};
template<typename Source>
class CheckBoxBinding :
public Binding<Source>
{
private:
wxCheckBox* _checkbox;
std::function<bool(const Source&)> _loadFunc;
std::function<void(const Source&, bool)> _saveFunc;
public:
CheckBoxBinding(wxCheckBox* checkbox,
const std::function<bool(const Source&)>& loadFunc) :
CheckBoxBinding(checkbox, loadFunc, std::function<void(const Source&, bool)>())
{}
CheckBoxBinding(wxCheckBox* checkbox,
const std::function<bool(const Source&)>& loadFunc,
const std::function<void(const Source&, bool)>& saveFunc) :
_checkbox(checkbox),
_loadFunc(loadFunc),
_saveFunc(saveFunc)
{
if (_saveFunc)
{
_checkbox->Bind(wxEVT_CHECKBOX, &CheckBoxBinding::onCheckedChanged, this);
}
}
virtual ~CheckBoxBinding()
{
if (_saveFunc)
{
_checkbox->Unbind(wxEVT_CHECKBOX, &CheckBoxBinding::onCheckedChanged, this);
}
}
virtual void updateFromSource() override
{
if (!Binding<Source>::getSource())
{
_checkbox->SetValue(false);
return;
}
_checkbox->SetValue(_loadFunc(Binding<Source>::getSource()));
}
private:
void onCheckedChanged(wxCommandEvent& ev)
{
_saveFunc(Binding<Source>::getSource(), _checkbox->IsChecked());
}
};
}