HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
toggle_delegate.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2023.
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
13namespace hi { inline namespace v1 {
14
19public:
20 using notifier_type = notifier<>;
21 using callback_token = notifier_type::callback_token;
22 using callback_proto = notifier_type::callback_proto;
23
24 virtual ~toggle_delegate() = default;
25
26 virtual void init(widget& sender) noexcept {}
27
28 virtual void deinit(widget& sender) noexcept {}
29
32 virtual void activate(widget& sender) noexcept = 0;
33
36 [[nodiscard]] virtual widget_state state(widget const& sender) const noexcept
37 {
38 return widget_state::off;
39 }
40
43 [[nodiscard]] callback_token
44 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
45 {
46 return _notifier.subscribe(hi_forward(callback), flags);
47 }
48
49protected:
50 notifier_type _notifier;
51};
52
61template<typename T>
63public:
64 using value_type = T;
65
66 observer<value_type> value;
67 observer<value_type> on_value;
68 observer<value_type> off_value;
69
76 forward_of<observer<value_type>> auto&& value,
77 forward_of<observer<value_type>> auto&& on_value,
78 forward_of<observer<value_type>> auto&& off_value) noexcept :
79 value(hi_forward(value)), on_value(hi_forward(on_value)), off_value(hi_forward(off_value))
80 {
81 // clang-format off
82 _value_cbt = this->value.subscribe([&](auto...){ this->_notifier(); });
83 _on_value_cbt = this->on_value.subscribe([&](auto...){ this->_notifier(); });
84 _off_value_cbt = this->off_value.subscribe([&](auto...){ this->_notifier(); });
85 // clang-format on
86 }
87
94 forward_of<observer<value_type>> auto&& value,
95 forward_of<observer<value_type>> auto&& on_value) noexcept
96 requires default_values_v<value_type>
97 : default_toggle_delegate(hi_forward(value), hi_forward(on_value), default_values<value_type>::off)
98 {
99 }
100
105 default_toggle_delegate(forward_of<observer<value_type>> auto&& value) noexcept
106 requires default_values_v<value_type>
107 : default_toggle_delegate(hi_forward(value), default_values<value_type>::on, default_values<value_type>::off)
108 {
109 }
110
112 [[nodiscard]] widget_state state(widget const& sender) const noexcept override
113 {
114 if (*value == *on_value) {
115 return widget_state::on;
116 } else {
117 return widget_state::off;
118 }
119 }
120
121 void activate(widget& sender) noexcept override
122 {
123 if (*value == *on_value) {
124 value = *off_value;
125 } else {
126 value = *on_value;
127 }
128 }
130private:
131 typename decltype(value)::callback_token _value_cbt;
132 typename decltype(on_value)::callback_token _on_value_cbt;
133 typename decltype(off_value)::callback_token _off_value_cbt;
134};
135
144[[nodiscard]] std::shared_ptr<toggle_delegate> make_default_toggle_delegate(auto&& value, auto&&...args) noexcept
145 requires requires {
146 default_toggle_delegate<observer_decay_t<decltype(value)>>{hi_forward(value), hi_forward(args)...};
147 }
148{
149 return std::make_shared<default_toggle_delegate<observer_decay_t<decltype(value)>>>(
150 hi_forward(value), hi_forward(args)...);
151}
152
153}} // namespace hi::v1
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
std::shared_ptr< toggle_delegate > make_default_toggle_delegate(auto &&value, auto &&...args) noexcept
Make a shared pointer to a toggle-button delegate.
Definition toggle_delegate.hpp:144
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.
@ on
The widget is in the on-state.
Definition widget.hpp:26
A toggle delegate controls the state of a toggle widget.
Definition toggle_delegate.hpp:18
virtual widget_state state(widget const &sender) const noexcept
Used by the widget to check the state of the button.
Definition toggle_delegate.hpp:36
virtual void activate(widget &sender) noexcept=0
Called when the button is pressed by the user.
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 toggle_delegate.hpp:44
A default toggle delegate.
Definition toggle_delegate.hpp:62
default_toggle_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 toggle_delegate.hpp:75
default_toggle_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition toggle_delegate.hpp:105
default_toggle_delegate(forward_of< observer< value_type > > auto &&value, forward_of< observer< value_type > > auto &&on_value) noexcept
Construct a delegate.
Definition toggle_delegate.hpp:93
T make_shared(T... args)