7#include "button_delegate.hpp"
9#include "../observable.hpp"
24template<button_type ButtonType,
typename T>
27 static_assert(ButtonType == button_type::radio or ButtonType == button_type::toggle);
31 static constexpr bool can_make_defaults =
32 std::is_same_v<value_type, bool> or std::is_integral_v<value_type> or std::is_enum_v<value_type>;
40 template<
typename Value,
typename OnValue,
typename OffValue>
42 _value(std::forward<Value>(value)),
43 _on_value(std::forward<OnValue>(on_value)),
44 _off_value(std::forward<OnValue>(off_value))
53 template<
typename Value,
typename OnValue>
55 requires(can_make_defaults or
button_type == button_type::radio) :
64 template<
typename Value>
71 callback_ptr_type subscribe(
abstract_button_widget &sender, callback_ptr_type
const &callback_ptr)
noexcept override
73 _value.subscribe(callback_ptr);
74 _on_value.subscribe(callback_ptr);
75 _off_value.subscribe(callback_ptr);
79 void unsubscribe(abstract_button_widget &sender, callback_ptr_type
const &callback_ptr)
noexcept override
81 _value.unsubscribe(callback_ptr);
82 _on_value.unsubscribe(callback_ptr);
83 _off_value.unsubscribe(callback_ptr);
86 [[nodiscard]]
button_state state(abstract_button_widget
const &sender)
const noexcept override
88 if (_value == _on_value) {
89 return button_state::on;
90 }
else if (_value == _off_value) {
91 return button_state::off;
93 return button_state::other;
97 void activate(abstract_button_widget &sender)
noexcept override
100 if (_value == _off_value) {
103 _value = *_off_value;
105 }
else if constexpr (
button_type == button_type::radio) {
111 observable<value_type> _value;
112 observable<value_type> _on_value;
113 observable<value_type> _off_value;
116template<
button_type ButtonType,
typename Value,
typename... Args>
117default_button_delegate(Value &&, Args &&...)
118 -> default_button_delegate<ButtonType, observable_argument_t<std::remove_cvref_t<Value>>>;
120template<
button_type ButtonType,
typename Value,
typename... Args>
123 using value_type = observable_argument_t<std::remove_cvref_t<Value>>;
124 return std::make_unique<default_button_delegate<ButtonType, value_type>>(
125 std::forward<Value>(value), std::forward<Args>(args)...);
button_state
The state of a button.
Definition button_state.hpp:13
button_type
The type of button.
Definition button_type.hpp:13
Definition abstract_button_widget.hpp:23
Definition button_delegate.hpp:14
A default button delegate.
Definition default_button_delegate.hpp:25
default_button_delegate(Value &&value, OnValue &&on_value) noexcept
Construct a delegate.
Definition default_button_delegate.hpp:54
default_button_delegate(Value &&value, OnValue &&on_value, OffValue &&off_value) noexcept
Construct a delegate.
Definition default_button_delegate.hpp:41
default_button_delegate(Value &&value) noexcept
Construct a delegate.
Definition default_button_delegate.hpp:65