FastLED 3.9.15
Loading...
Searching...
No Matches
ui.h
Go to the documentation of this file.
1
2#pragma once
3
4#include <stdint.h>
5
6#include "fl/audio.h"
7#include "fl/engine_events.h"
8#include "fl/function_list.h"
9#include "fl/math_macros.h"
10#include "fl/namespace.h"
11#include "fl/template_magic.h"
12#include "fl/ui_impl.h"
13#include "fl/unused.h"
14#include "platforms/ui_defs.h"
15
16#define FL_NO_COPY(CLASS) \
17 CLASS(const CLASS &) = delete; \
18 CLASS &operator=(const CLASS &) = delete;
19
20namespace fl {
21
22// If the platform is missing ui components, provide stubs.
23
24class UISlider : public UISliderImpl {
25 public:
27 using Super = UISliderImpl;
28 // If step is -1, it will be calculated as (max - min) / 100
29 UISlider(const char *name, float value = 128.0f, float min = 1,
30 float max = 255, float step = -1.f)
31 : UISliderImpl(name, value, min, max, step), mListener(this) {}
32 float value() const { return Super::value(); }
33 float value_normalized() const {
34 float min = Super::getMin();
35 float max = Super::getMax();
36 if (ALMOST_EQUAL(max, min, 0.0001f)) {
37 return 0;
38 }
39 return (value() - min) / (max - min);
40 }
41 float getMax() const { return Super::getMax(); }
42 void setValue(float value);
43 operator float() const { return Super::value(); }
44 operator uint8_t() const { return static_cast<uint8_t>(Super::value()); }
45 operator uint16_t() const { return static_cast<uint16_t>(Super::value()); }
46 operator int() const { return static_cast<int>(Super::value()); }
47 template <typename T> T as() const {
48 return static_cast<T>(Super::value());
49 }
50
51 int as_int() const { return static_cast<int>(Super::value()); }
52
54 Super::setValue(value);
55 return *this;
56 }
58 Super::setValue(static_cast<float>(value));
59 return *this;
60 }
61
62 int onChanged(function<void(float)> callback) {
63 function<void(UISlider &, float)> wrapped_cb =
64 [callback](UISlider &slider, float value) {
66 callback(value);
67 };
68 int out = mCallbacks.add(wrapped_cb);
69 mListener.addToEngineEventsOnce();
70 return out;
71 }
72
73 int onChangedEx(function<void(UISlider &, float)> callback) {
74 int out = mCallbacks.add(callback);
75 mListener.addToEngineEventsOnce();
76 return out;
77 }
78 void clearCallbacks() { mCallbacks.clear(); }
79
80 protected:
82 Listener(UISlider *owner) : mOwner(owner) {
84 }
86 if (added) {
88 }
89 }
91 if (added) {
92 return;
93 }
95 added = true;
96 }
97 void onBeginFrame() override;
98
99 private:
101 bool added = false;
102 };
103
104 private:
109};
110
111// template operator for >= against a jsSliderImpl
112
113class UIButton : public UIButtonImpl {
114 public:
116 using Super = UIButtonImpl;
117 UIButton(const char *name) : UIButtonImpl(name), mListener(this) {}
119 bool isPressed() const { return Super::isPressed(); }
120 bool clicked() const { return Super::clicked(); }
121 int clickedCount() const { return Super::clickedCount(); }
122 operator bool() const { return clicked(); }
123
124 void click() { Super::click(); }
125
126 int onChanged(function<void()> callback) {
127 function<void(UIButton &)> wrapped_cb = [callback](UIButton &button) {
129 callback();
130 };
131 int id = mCallbacks.add(wrapped_cb);
132 mListener.addToEngineEventsOnce();
133 return id;
134 }
135
136 int onChangedEx(function<void(UIButton &)> callback) {
137 int id = mCallbacks.add(callback);
138 mListener.addToEngineEventsOnce();
139 return id;
140 }
141
142 void removeCallback(int id) { mCallbacks.remove(id); }
143 void clearCallbacks() { mCallbacks.clear(); }
144
145 protected:
147 Listener(UIButton *owner) : mOwner(owner) {
149 }
151 if (added) {
153 }
154 }
156 if (added) {
157 return;
158 }
160 added = true;
161 }
162 void onBeginFrame() override;
163
164 private:
166 bool added = false;
167 bool mClickedLastFrame = false;
168 };
169
170 private:
173};
174
176 public:
179 UICheckbox(const char *name, bool value = false)
180 : UICheckboxImpl(name, value), mListener(this) {}
182
183 operator bool() const { return value(); }
184 explicit operator int() const { return static_cast<int>(value()); }
186 impl() = value;
187 return *this;
188 }
189
190 void onChanged(function<void(bool)> callback) {
191 function<void(UICheckbox &, bool)> wrapped_cb =
192 [callback](UICheckbox &checkbox, bool value) {
193 FASTLED_UNUSED(checkbox);
194 callback(value);
195 };
196 mCallbacks.add(wrapped_cb);
197 mListener.addToEngineEventsOnce();
198 }
199
200 void onChangedEx(function<void(UICheckbox &, bool)> callback) {
201 mCallbacks.add(callback);
202 mListener.addToEngineEventsOnce();
203 }
204 void clearCallbacks() { mCallbacks.clear(); }
205
206 protected:
208 Listener(UICheckbox *owner) : mOwner(owner) {
210 }
212 if (added) {
214 }
215 }
217 if (added) {
218 return;
219 }
221 added = true;
222 }
223 void onBeginFrame() override;
224
225 private:
227 bool added = false;
228 };
229
230 private:
231 Super &impl() { return *this; }
233 bool mLastFrameValue = false;
236};
237
239 public:
242 UINumberField(const char *name, double value, double min = 0,
243 double max = 100)
244 : UINumberFieldImpl(name, value, min, max), mListener(this) {}
246 double value() const { return Super::value(); }
248 operator double() const { return Super::value(); }
249 operator int() const { return static_cast<int>(Super::value()); }
252 return *this;
253 }
255 setValue(static_cast<double>(value));
256 return *this;
257 }
258
259 void onChanged(function<void(double)> callback) {
260 function<void(UINumberField &, double)> wrapped_cb =
261 [callback](UINumberField &checkbox, bool value) {
262 FASTLED_UNUSED(checkbox);
263 callback(value);
264 };
265 mCallbacks.add(wrapped_cb);
266 mListener.addToEngineEventsOnce();
267 }
268
269 void onChangedEx(function<void(UINumberField &, double)> callback) {
270 mCallbacks.add(callback);
271 mListener.addToEngineEventsOnce();
272 }
273 void clearCallbacks() { mCallbacks.clear(); }
274
275 private:
277 Listener(UINumberField *owner) : mOwner(owner) {
279 }
281 if (added) {
283 }
284 }
286 if (added) {
287 return;
288 }
290 added = true;
291 }
292 void onBeginFrame() override;
293
294 private:
296 bool added = false;
297 };
298
300 double mLastFrameValue = 0;
303
304 Super &impl() { return *this; }
305};
306
307class UITitle : public UITitleImpl {
308 public:
310 UITitle(const char *name) : UITitleImpl(name) {}
312};
313
315 public:
317 UIDescription(const char *name) : UIDescriptionImpl(name) {}
319};
320
321class UIAudio : public UIAudioImpl {
322 public:
324 using Super = UIAudioImpl;
325 UIAudio(const char *name) : UIAudioImpl(name) {}
327 AudioSample next() { return Super::next(); }
328 bool hasNext() { return Super::hasNext(); }
329};
330
331#define FASTLED_UI_DEFINE_OPERATORS(UI_CLASS) \
332 FASTLED_DEFINE_POD_COMPARISON_OPERATOR(UI_CLASS, >=) \
333 FASTLED_DEFINE_POD_COMPARISON_OPERATOR(UI_CLASS, <=) \
334 FASTLED_DEFINE_POD_COMPARISON_OPERATOR(UI_CLASS, >) \
335 FASTLED_DEFINE_POD_COMPARISON_OPERATOR(UI_CLASS, <) \
336 FASTLED_DEFINE_POD_COMPARISON_OPERATOR(UI_CLASS, ==) \
337 FASTLED_DEFINE_POD_COMPARISON_OPERATOR(UI_CLASS, !=)
338
343
344} // end namespace fl
UIButton button("Trigger")
UISlider slider("Speed", 0.18f, 0.0f, 1.0f)
static void addListener(Listener *listener, int priority=0)
static void removeListener(Listener *listener)
~UIAudio()
Definition ui.h:326
AudioSample next()
Definition ui.h:327
UIAudio(const char *name)
Definition ui.h:325
FL_NO_COPY(UIAudio) using Super
bool hasNext()
Definition ui.h:328
UIAudioImpl(const char *name)
Definition ui_impl.h:195
FunctionList< UIButton & > mCallbacks
Definition ui.h:171
void removeCallback(int id)
Definition ui.h:142
int onChangedEx(function< void(UIButton &)> callback)
Definition ui.h:136
bool clicked() const
Definition ui.h:120
bool isPressed() const
Definition ui.h:119
int onChanged(function< void()> callback)
Definition ui.h:126
void clearCallbacks()
Definition ui.h:143
FL_NO_COPY(UIButton) using Super
Listener mListener
Definition ui.h:172
UIButton(const char *name)
Definition ui.h:117
int clickedCount() const
Definition ui.h:121
~UIButton()
Definition ui.h:118
void click()
Definition ui.h:124
fl::Str name() const
Definition ui_impl.h:106
UIButtonImpl(const char *name)
Definition ui_impl.h:99
UICheckbox & operator=(bool value)
Definition ui.h:185
Listener mListener
Definition ui.h:235
FunctionList< UICheckbox &, bool > mCallbacks
Definition ui.h:232
void onChanged(function< void(bool)> callback)
Definition ui.h:190
Super & impl()
Definition ui.h:231
void clearCallbacks()
Definition ui.h:204
FL_NO_COPY(UICheckbox)
UICheckboxImpl Super
Definition ui.h:178
bool mLastFrameValue
Definition ui.h:233
void onChangedEx(function< void(UICheckbox &, bool)> callback)
Definition ui.h:200
~UICheckbox()
Definition ui.h:181
bool mLastFrameValueValid
Definition ui.h:234
UICheckbox(const char *name, bool value=false)
Definition ui.h:179
bool value() const
Definition ui_impl.h:132
UICheckboxImpl(const char *name, bool value=false)
Definition ui_impl.h:118
FL_NO_COPY(UIDescription)
UIDescription(const char *name)
Definition ui.h:317
UIDescriptionImpl(const char *name)
Definition ui_impl.h:186
double value() const
Definition ui.h:246
UINumberField & operator=(double value)
Definition ui.h:250
FunctionList< UINumberField &, double > mCallbacks
Definition ui.h:302
UINumberFieldImpl Super
Definition ui.h:241
Listener mListener
Definition ui.h:299
UINumberField & operator=(int value)
Definition ui.h:254
FL_NO_COPY(UINumberField)
UINumberField(const char *name, double value, double min=0, double max=100)
Definition ui.h:242
bool mLastFrameValueValid
Definition ui.h:301
double mLastFrameValue
Definition ui.h:300
Super & impl()
Definition ui.h:304
void onChanged(function< void(double)> callback)
Definition ui.h:259
void setValue(double value)
Definition ui.h:247
void clearCallbacks()
Definition ui.h:273
void onChangedEx(function< void(UINumberField &, double)> callback)
Definition ui.h:269
UINumberFieldImpl(const char *name, double value, double min=0, double max=100)
Definition ui_impl.h:145
double value() const
Definition ui_impl.h:151
void setValue(double value)
Definition ui_impl.h:152
Listener mListener
Definition ui.h:108
bool mLastFramevalueValid
Definition ui.h:107
FunctionList< UISlider &, float > mCallbacks
Definition ui.h:105
UISlider & operator=(int value)
Definition ui.h:57
UISlider(const char *name, float value=128.0f, float min=1, float max=255, float step=-1.f)
Definition ui.h:29
T as() const
Definition ui.h:47
void clearCallbacks()
Definition ui.h:78
float getMax() const
Definition ui.h:41
FL_NO_COPY(UISlider) using Super
int onChanged(function< void(float)> callback)
Definition ui.h:62
float mLastFrameValue
Definition ui.h:106
void setValue(float value)
Definition ui.cpp:11
int onChangedEx(function< void(UISlider &, float)> callback)
Definition ui.h:73
int as_int() const
Definition ui.h:51
UISlider & operator=(float value)
Definition ui.h:53
float value_normalized() const
Definition ui.h:33
float value() const
Definition ui.h:32
UISliderImpl(const char *name, float value=128.0f, float min=1, float max=255, float step=-1.f)
Definition ui_impl.h:51
~UITitle()
Definition ui.h:311
UITitle(const char *name)
Definition ui.h:310
FL_NO_COPY(UITitle)
UITitleImpl(const char *name)
Definition ui_impl.h:176
#define ALMOST_EQUAL(a, b, small)
Definition math_macros.h:33
Implements the FastLED namespace macros.
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
Listener(UIButton *owner)
Definition ui.h:147
bool mClickedLastFrame
Definition ui.h:167
void addToEngineEventsOnce()
Definition ui.h:155
UIButton * mOwner
Definition ui.h:165
void onBeginFrame() override
Definition ui.cpp:32
UICheckbox * mOwner
Definition ui.h:226
void onBeginFrame() override
Definition ui.cpp:44
Listener(UICheckbox *owner)
Definition ui.h:208
void addToEngineEventsOnce()
Definition ui.h:216
Listener(UINumberField *owner)
Definition ui.h:277
void addToEngineEventsOnce()
Definition ui.h:285
UINumberField * mOwner
Definition ui.h:295
void onBeginFrame() override
Definition ui.cpp:58
void addToEngineEventsOnce()
Definition ui.h:90
void onBeginFrame() override
Definition ui.cpp:18
UISlider * mOwner
Definition ui.h:100
Listener(UISlider *owner)
Definition ui.h:82
#define FASTLED_UI_DEFINE_OPERATORS(UI_CLASS)
Definition ui.h:331
#define FASTLED_UNUSED(x)
Definition unused.h:3