FastLED 3.9.15
Loading...
Searching...
No Matches
button.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/stl/function.h"
4#include "fl/stl/shared_ptr.h"
5#include "fl/stl/string.h"
6#include "fl/stl/compiler_control.h" // IWYU pragma: keep
7#include "fl/stl/noexcept.h"
9#include "fl/ui/element.h"
10#include "platforms/ui_defs.h"
11
12#ifndef FASTLED_HAS_UI_BUTTON
13#define FASTLED_HAS_UI_BUTTON 0
14#endif
15
16namespace fl {
17
18#if !FASTLED_HAS_UI_BUTTON
19
21 public:
22 UIButtonImpl(const char *name) : mName(name ? name : "") {}
24 bool isPressed() const { return false; }
25 bool clicked() const { return false; }
26 int clickedCount() const { return 0; }
27 operator bool() const { return false; }
28 void click() {}
29 fl::string name() const { return mName; }
30
31 // Stub method for group setting (does nothing on non-WASM platforms)
32 void setGroup(const fl::string& groupName) { FASTLED_UNUSED(groupName); }
33
34 private:
36};
37
38#endif
39
40class UIButton : public UIElement {
41 public:
43 UIButton(const char *name) FL_NOEXCEPT;
45 bool isPressed() const FL_NOEXCEPT {
46 if (mImpl.isPressed()) {
47 return true;
48 }
49 if (mButtonInput) {
50 return mButtonInput->isPressed();
51 }
52 return false;
53 }
54 bool clicked() const FL_NOEXCEPT {
55 if (mImpl.clicked()) {
56 return true;
57 }
58 if (mButtonInput) {
59 return mButtonInput->clicked();
60 }
61 return false;
62 }
63 int clickedCount() const FL_NOEXCEPT;
64 operator bool() const FL_NOEXCEPT { return clicked(); }
65 bool value() const FL_NOEXCEPT { return clicked(); }
66
68
69 void click() FL_NOEXCEPT { mImpl.click(); }
70
71 // Override setGroup to also update the implementation
72 void setGroup(const fl::string& groupName) FL_NOEXCEPT override {
73 UIElement::setGroup(groupName);
74 // Update the implementation's group if it has the method (WASM platforms)
75 mImpl.setGroup(groupName);
76 }
77
78 int onChanged(function<void(UIButton &)> callback) FL_NOEXCEPT {
79 int id = mCallbacks.add(callback);
80 mListener.addToEngineEventsOnce();
81 return id;
82 }
83
84 int onClicked(function<void()> callback) FL_NOEXCEPT {
85 int id = mCallbacks.add([callback](UIButton &btn) {
86 if (btn.clicked()) {
87 callback();
88 }
89 });
90 mListener.addToEngineEventsOnce();
91 return id;
92 }
93
94 int onPressed(function<void()> callback) FL_NOEXCEPT {
95 int id = mPressCallbacks.add(callback);
96 mListener.addToEngineEventsOnce();
97 return id;
98 }
99
100 int onReleased(function<void()> callback) FL_NOEXCEPT {
101 int id = mReleaseCallbacks.add(callback);
102 mListener.addToEngineEventsOnce();
103 return id;
104 }
105
106 // Per-list removers. Each callback list maintains its own ID counter,
107 // so an id returned by onChanged()/onPressed()/onReleased() is only
108 // meaningful to its originating list — use the matching remover here.
109 // Note: onClicked() also registers into the changed-callbacks list, so
110 // ids returned by onClicked() are removed via removeClickedCallback
111 // (an alias for removeChangedCallback).
112 void removeChangedCallback(int id) FL_NOEXCEPT { mCallbacks.remove(id); }
113 void removeClickedCallback(int id) FL_NOEXCEPT { mCallbacks.remove(id); }
116
118 mCallbacks.clear();
119 mPressCallbacks.clear();
120 mReleaseCallbacks.clear();
121 }
122
123 protected:
125
128 }
130 if (added) {
132 }
133 }
135 if (added) {
136 return;
137 }
139 added = true;
140 }
141 void onBeginFrame() FL_NOEXCEPT override;
143
144 private:
146 bool added = false;
147 bool mClickedLastFrame = false;
148 bool mPressedLastFrame = false;
151 };
152
153 private:
154 function_list<void(UIButton &)> mCallbacks;
155 function_list<void()> mPressCallbacks;
156 function_list<void()> mReleaseCallbacks;
158 // Declared last so it is destroyed first and removes itself from
159 // EngineEvents before mButtonInput / callback lists are torn down.
161};
162
164
165} // namespace fl
static void removeListener(Listener *listener) FL_NOEXCEPT
static void addListener(Listener *listener, int priority=0) FL_NOEXCEPT
function_list< void(UIButton &)> mCallbacks
Definition button.h:154
fl::shared_ptr< IButtonInput > mButtonInput
Definition button.h:157
int onChanged(function< void(UIButton &)> callback) FL_NOEXCEPT
Definition button.h:78
~UIButton() FL_NOEXCEPT
bool value() const FL_NOEXCEPT
Definition button.h:65
function_list< void()> mReleaseCallbacks
Definition button.h:156
bool isPressed() const FL_NOEXCEPT
Definition button.h:45
int onReleased(function< void()> callback) FL_NOEXCEPT
Definition button.h:100
int onPressed(function< void()> callback) FL_NOEXCEPT
Definition button.h:94
void removeChangedCallback(int id) FL_NOEXCEPT
Definition button.h:112
bool clicked() const FL_NOEXCEPT
Definition button.h:54
int clickedCount() const FL_NOEXCEPT
void removeReleasedCallback(int id) FL_NOEXCEPT
Definition button.h:115
void click() FL_NOEXCEPT
Definition button.h:69
void removeClickedCallback(int id) FL_NOEXCEPT
Definition button.h:113
int onClicked(function< void()> callback) FL_NOEXCEPT
Definition button.h:84
FL_NO_COPY(UIButton) UIButton(const char *name) FL_NOEXCEPT
void clearCallbacks() FL_NOEXCEPT
Definition button.h:117
void removePressedCallback(int id) FL_NOEXCEPT
Definition button.h:114
Listener mListener
Definition button.h:160
UIButtonImpl mImpl
Definition button.h:124
function_list< void()> mPressCallbacks
Definition button.h:155
void setGroup(const fl::string &groupName) FL_NOEXCEPT override
Definition button.h:72
void addRealButton(fl::shared_ptr< IButtonInput > button) FL_NOEXCEPT
fl::string name() const
Definition button.h:29
bool isPressed() const
Definition button.h:24
~UIButtonImpl() FL_NOEXCEPT
Definition button.h:23
void click()
Definition button.h:28
bool clicked() const
Definition button.h:25
void setGroup(const fl::string &groupName)
Definition button.h:32
UIButtonImpl(const char *name)
Definition button.h:22
int clickedCount() const
Definition button.h:26
fl::string mName
Definition button.h:35
virtual void setGroup(const fl::string &groupName) FL_NOEXCEPT
Definition element.h:31
UIElement() FL_NOEXCEPT
#define FASTLED_UI_DEFINE_OPERATORS(UI_CLASS)
Definition element.h:40
Base definition for an LED controller.
Definition crgb.hpp:179
fl::UIButton button("Button")
#define FASTLED_UNUSED(x)
#define FL_NOEXCEPT
void addToEngineEventsOnce() FL_NOEXCEPT
Definition button.h:134
UIButton * mOwner
Definition button.h:145
~Listener() FL_NOEXCEPT
Definition button.h:129
int realButtonClickCount() const FL_NOEXCEPT
Definition button.h:142
bool mRealButtonClickedLastFrame
Definition button.h:149
Listener(UIButton *owner) FL_NOEXCEPT
Definition button.h:127
void onBeginFrame() FL_NOEXCEPT override