HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
button_delegate.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
9#pragma once
10
11#include "../notifier.hpp"
12#include "../observer.hpp"
13#include "../GUI/module.hpp"
14#include <type_traits>
15#include <memory>
16
17namespace hi { inline namespace v1 {
18class widget;
19
24public:
25 using notifier_type = notifier<>;
26 using callback_token = notifier_type::callback_token;
27 using callback_proto = notifier_type::callback_proto;
28
29 virtual ~button_delegate() = default;
30
31 virtual void init(widget& sender) noexcept {}
32
33 virtual void deinit(widget& sender) noexcept {}
34
37 virtual void activate(widget& sender) noexcept {};
38
41 [[nodiscard]] virtual widget_state state(widget const& sender) const noexcept
42 {
43 return widget_state::off;
44 }
45
48 [[nodiscard]] callback_token
49 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
50 {
51 return _notifier.subscribe(hi_forward(callback), flags);
52 }
53
54protected:
55 notifier_type _notifier;
56};
57
66template<typename T>
68public:
69 using value_type = T;
70
71 observer<value_type> value;
72 observer<value_type> on_value;
73
80 forward_of<observer<value_type>> auto&& value,
81 forward_of<observer<value_type>> auto&& on_value) noexcept :
82 value(hi_forward(value)), on_value(hi_forward(on_value))
83 {
84 // clang-format off
85 _value_cbt = this->value.subscribe([&](auto...){ this->_notifier(); });
86 _on_value_cbt = this->on_value.subscribe([&](auto...){ this->_notifier(); });
87 // clang-format on
88 }
89
91 [[nodiscard]] widget_state state(widget const& sender) const noexcept override
92 {
93 if (*value == *on_value) {
94 return widget_state::on;
95 } else {
96 return widget_state::off;
97 }
98 }
99
100 void activate(widget& sender) noexcept override
101 {
102 value = *on_value;
103 }
105private:
106 typename decltype(value)::callback_token _value_cbt;
107 typename decltype(on_value)::callback_token _on_value_cbt;
108};
109
118template<typename T>
120public:
121 using value_type = T;
122 static constexpr bool can_make_defaults =
123 std::is_same_v<value_type, bool> or std::is_integral_v<value_type> or std::is_enum_v<value_type>;
124
125 observer<value_type> value;
126 observer<value_type> on_value;
127 observer<value_type> off_value;
128
136 forward_of<observer<value_type>> auto&& value,
137 forward_of<observer<value_type>> auto&& on_value,
138 forward_of<observer<value_type>> auto&& off_value) noexcept :
139 value(hi_forward(value)), on_value(hi_forward(on_value)), off_value(hi_forward(off_value))
140 {
141 // clang-format off
142 _value_cbt = this->value.subscribe([&](auto...){ this->_notifier(); });
143 _on_value_cbt = this->on_value.subscribe([&](auto...){ this->_notifier(); });
144 _off_value_cbt = this->off_value.subscribe([&](auto...){ this->_notifier(); });
145 // clang-format on
146 }
147
154 forward_of<observer<value_type>> auto&& value,
155 forward_of<observer<value_type>> auto&& on_value) noexcept requires can_make_defaults :
156 default_toggle_button_delegate(hi_forward(value), hi_forward(on_value), value_type{})
157 {
158 }
159
164 default_toggle_button_delegate(forward_of<observer<value_type>> auto&& value) noexcept requires can_make_defaults :
165 default_toggle_button_delegate(hi_forward(value), value_type{1}, value_type{})
166 {
167 }
168
170 [[nodiscard]] widget_state state(widget const& sender) const noexcept override
171 {
172 if (*value == *on_value) {
173 return widget_state::on;
174 } else if (*value == *off_value) {
175 return widget_state::off;
176 } else {
177 return widget_state::other;
178 }
179 }
180
181 void activate(widget& sender) noexcept override
182 {
183 if (*value == *off_value) {
184 value = *on_value;
185 } else {
186 value = *off_value;
187 }
188 }
190private:
191 typename decltype(value)::callback_token _value_cbt;
192 typename decltype(on_value)::callback_token _on_value_cbt;
193 typename decltype(off_value)::callback_token _off_value_cbt;
194};
195
205make_default_radio_button_delegate(auto&& value, auto&& on_value) noexcept requires requires
206{
207 default_radio_button_delegate<observer_decay_t<decltype(value)>>{hi_forward(value), hi_forward(on_value)};
208}
209{
210 return std::make_shared<default_radio_button_delegate<observer_decay_t<decltype(value)>>>(
211 hi_forward(value), hi_forward(on_value));
212}
213
223make_default_toggle_button_delegate(auto&& value, auto&&...args) noexcept requires requires
224{
225 default_toggle_button_delegate<observer_decay_t<decltype(value)>>{hi_forward(value), hi_forward(args)...};
226}
227{
228 return std::make_shared<default_toggle_button_delegate<observer_decay_t<decltype(value)>>>(
229 hi_forward(value), hi_forward(args)...);
230}
231
232}} // namespace hi::v1
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
std::shared_ptr< button_delegate > make_default_toggle_button_delegate(auto &&value, auto &&...args) noexcept
Make a shared pointer to a toggle-button delegate.
Definition button_delegate.hpp:223
std::shared_ptr< button_delegate > make_default_radio_button_delegate(auto &&value, auto &&on_value) noexcept
Make a shared pointer to a radio-button delegate.
Definition button_delegate.hpp:205
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
widget_state
Definition widget_state.hpp:14
@ off
The widget in the off-state.
@ other
The widget is in the other-state.
@ on
The widget is in the on-state.
Definition widget.hpp:26
A button delegate controls the state of a button widget.
Definition button_delegate.hpp:23
callback_token subscribe(forward_of< callback_proto > auto &&callback, callback_flags flags=callback_flags::synchronous) noexcept
Subscribe a callback for notifying the widget of a data change.
Definition button_delegate.hpp:49
virtual widget_state state(widget const &sender) const noexcept
Used by the widget to check the state of the button.
Definition button_delegate.hpp:41
virtual void activate(widget &sender) noexcept
Called when the button is pressed by the user.
Definition button_delegate.hpp:37
A default radio button delegate.
Definition button_delegate.hpp:67
default_radio_button_delegate(forward_of< observer< value_type > > auto &&value, forward_of< observer< value_type > > auto &&on_value) noexcept
Construct a delegate.
Definition button_delegate.hpp:79
A default toggle button delegate.
Definition button_delegate.hpp:119
default_toggle_button_delegate(forward_of< observer< value_type > > auto &&value, forward_of< observer< value_type > > auto &&on_value, forward_of< observer< value_type > > auto &&off_value) noexcept
Construct a delegate.
Definition button_delegate.hpp:135
default_toggle_button_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition button_delegate.hpp:164
default_toggle_button_delegate(forward_of< observer< value_type > > auto &&value, forward_of< observer< value_type > > auto &&on_value) noexcept
Construct a delegate.
Definition button_delegate.hpp:153
T make_shared(T... args)