@@ -14,78 +14,128 @@ namespace cycfi::elements
14
14
// Basic Knob (You can use this as the subject of dial)
15
15
// //////////////////////////////////////////////////////////////////////////
16
16
template <std::size_t _size>
17
- class basic_knob_styler : public element , public receiver < double >
17
+ class basic_knob_styler : public element
18
18
{
19
19
public:
20
20
21
21
static std::size_t const size = _size;
22
22
23
- basic_knob_styler (color c = colors::black)
24
- : _color(c), _value(0 )
25
- {}
23
+ basic_knob_styler (color c = colors::black);
26
24
27
25
view_limits limits (basic_context const & ctx) const override ;
28
26
void draw (context const & ctx) override ;
29
27
30
- double value () const override { return _value; }
31
- void value (double val) override ;
32
-
33
28
private:
34
29
35
30
color _color;
36
- float _value;
37
31
};
38
32
33
+ template <std::size_t size>
34
+ inline basic_knob_styler<size> basic_knob (color c = colors::black);
35
+
36
+ // //////////////////////////////////////////////////////////////////////////
37
+ // Radial Element Base (common base class for radial elements)
38
+ // //////////////////////////////////////////////////////////////////////////
39
+ template <std::size_t _size, concepts::Element Subject>
40
+ class radial_styler_base : public proxy <Subject>
41
+ {
42
+ public:
43
+
44
+ static std::size_t const size = _size;
45
+
46
+ using base_type = proxy<Subject>;
47
+
48
+ radial_styler_base (Subject subject);
49
+
50
+ view_limits limits (basic_context const & ctx) const override ;
51
+ void prepare_subject (context& ctx) override ;
52
+ };
53
+
54
+ // //////////////////////////////////////////////////////////////////////////
55
+ // Radial Marks (You can use this to place dial tick marks around dials)
56
+ // //////////////////////////////////////////////////////////////////////////
57
+ template <std::size_t _size, concepts::Element Subject>
58
+ class radial_marks_styler : public radial_styler_base <_size, Subject>
59
+ {
60
+ public:
61
+
62
+ static std::size_t const size = _size;
63
+ using base_type = radial_styler_base<_size, Subject>;
64
+ using base_type::base_type;
65
+
66
+ void draw (context const & ctx) override ;
67
+ };
68
+
69
+ template <std::size_t size, concepts::Element Subject>
70
+ inline radial_marks_styler<size, remove_cvref_t <Subject>>
71
+ radial_marks (Subject&& subject);
72
+
73
+ // //////////////////////////////////////////////////////////////////////////
74
+ // Radial Labels (You can use this to place dial labels around dials)
75
+ // //////////////////////////////////////////////////////////////////////////
76
+ template <std::size_t _size, concepts::Element Subject, std::size_t num_labels>
77
+ class radial_labels_styler : public radial_styler_base <_size, Subject>
78
+ {
79
+ public:
80
+
81
+ static std::size_t const size = _size;
82
+ using base_type = radial_styler_base<_size, Subject>;
83
+ using string_array = std::array<std::string, num_labels>;
84
+
85
+ radial_labels_styler (Subject subject, float font_size);
86
+
87
+ void draw (context const & ctx) override ;
88
+
89
+ string_array _labels;
90
+ float _font_size;
91
+ };
92
+
93
+ template <std::size_t size, concepts::Element Subject, typename ... S>
94
+ inline radial_labels_styler<size, remove_cvref_t <Subject>, sizeof ...(S)>
95
+ radial_labels (Subject&& subject, float font_size, S&&... s);
96
+
97
+ // --------------------------------------------------------------------------
98
+ // Inlines
99
+ // --------------------------------------------------------------------------
100
+
101
+ template <std::size_t size>
102
+ inline basic_knob_styler<size>::basic_knob_styler(color c)
103
+ : _color(c)
104
+ {}
105
+
39
106
template <std::size_t size>
40
107
inline view_limits basic_knob_styler<size>::limits(basic_context const & /* ctx*/ ) const
41
108
{
42
- auto pt = point{float (size), float (size)};
109
+ auto pt = point{float (size), float (size)};
43
110
return view_limits{pt, pt};
44
111
}
45
112
46
113
template <std::size_t size>
47
114
inline void basic_knob_styler<size>::draw(context const & ctx)
48
115
{
116
+ auto dial = find_parent<basic_dial*>(ctx);
117
+ if (!dial)
118
+ return ;
119
+
49
120
auto & thm = get_theme ();
50
121
auto & cnv = ctx.canvas ;
51
122
auto indicator_color = thm.indicator_color .level (1.5 );
52
123
auto cp = circle{center_point (ctx.bounds ), ctx.bounds .width ()/2 };
53
124
54
125
draw_knob (cnv, cp, _color);
55
- draw_radial_indicator (cnv, cp, _value , indicator_color);
126
+ draw_radial_indicator (cnv, cp, dial-> value () , indicator_color);
56
127
}
57
128
58
129
template <std::size_t size>
59
- inline void basic_knob_styler<size>::value(double val)
60
- {
61
- _value = val;
62
- }
63
-
64
- template <std::size_t size>
65
- inline basic_knob_styler<size> basic_knob (color c = colors::black)
130
+ inline basic_knob_styler<size> basic_knob (color c)
66
131
{
67
132
return {c};
68
133
}
69
134
70
- // //////////////////////////////////////////////////////////////////////////
71
- // Radial Element Base (common base class for radial elements)
72
- // //////////////////////////////////////////////////////////////////////////
73
135
template <std::size_t _size, concepts::Element Subject>
74
- class radial_styler_base : public proxy <Subject>
75
- {
76
- public:
77
-
78
- static std::size_t const size = _size;
79
-
80
- using base_type = proxy<Subject>;
81
-
82
- radial_styler_base (Subject subject)
83
- : base_type(std::move(subject))
84
- {}
85
-
86
- view_limits limits (basic_context const & ctx) const override ;
87
- void prepare_subject (context& ctx) override ;
88
- };
136
+ inline radial_styler_base<_size, Subject>::radial_styler_base(Subject subject)
137
+ : base_type(std::move(subject))
138
+ {}
89
139
90
140
template <std::size_t size, concepts::Element Subject>
91
141
inline view_limits
@@ -114,21 +164,6 @@ namespace cycfi::elements
114
164
ctx.bounds .right -= size_div2;
115
165
}
116
166
117
- // //////////////////////////////////////////////////////////////////////////
118
- // Radial Marks (You can use this to place dial tick marks around dials)
119
- // //////////////////////////////////////////////////////////////////////////
120
- template <std::size_t _size, concepts::Element Subject>
121
- class radial_marks_styler : public radial_styler_base <_size, Subject>
122
- {
123
- public:
124
-
125
- static std::size_t const size = _size;
126
- using base_type = radial_styler_base<_size, Subject>;
127
- using base_type::base_type;
128
-
129
- void draw (context const & ctx) override ;
130
- };
131
-
132
167
template <std::size_t size, concepts::Element Subject>
133
168
inline void
134
169
radial_marks_styler<size, Subject>::draw(context const & ctx)
@@ -148,28 +183,12 @@ namespace cycfi::elements
148
183
return {std::forward<Subject>(subject)};
149
184
}
150
185
151
- // //////////////////////////////////////////////////////////////////////////
152
- // Radial Labels (You can use this to place dial labels around dials)
153
- // //////////////////////////////////////////////////////////////////////////
154
186
template <std::size_t _size, concepts::Element Subject, std::size_t num_labels>
155
- class radial_labels_styler : public radial_styler_base <_size, Subject>
156
- {
157
- public:
158
-
159
- static std::size_t const size = _size;
160
- using base_type = radial_styler_base<_size, Subject>;
161
- using string_array = std::array<std::string, num_labels>;
162
-
163
- radial_labels_styler (Subject subject, float font_size)
164
- : base_type(std::move(subject))
165
- , _font_size(font_size)
166
- {}
167
-
168
- void draw (context const & ctx) override ;
169
-
170
- string_array _labels;
171
- float _font_size;
172
- };
187
+ inline radial_labels_styler<_size, Subject, num_labels>
188
+ ::radial_labels_styler (Subject subject, float font_size)
189
+ : base_type(std::move(subject))
190
+ , _font_size(font_size)
191
+ {}
173
192
174
193
template <std::size_t size, concepts::Element Subject, std::size_t num_labels>
175
194
inline void
0 commit comments