HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
default_button_delegate.hpp
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
5#pragma once
6
7#include "button_delegate.hpp"
8#include "button_type.hpp"
9#include "../observable.hpp"
10#include <type_traits>
11#include <memory>
12
13namespace tt {
14
24template<button_type ButtonType, typename T>
26public:
27 static_assert(ButtonType == button_type::radio or ButtonType == button_type::toggle);
28
29 using value_type = T;
30 static constexpr button_type button_type = ButtonType;
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>;
33
40 template<typename Value, typename OnValue, typename OffValue>
41 default_button_delegate(Value &&value, OnValue &&on_value, OffValue &&off_value) noexcept :
42 _value(std::forward<Value>(value)),
43 _on_value(std::forward<OnValue>(on_value)),
44 _off_value(std::forward<OnValue>(off_value))
45 {
46 }
47
53 template<typename Value, typename OnValue>
54 default_button_delegate(Value &&value, OnValue &&on_value) noexcept
55 requires(can_make_defaults or button_type == button_type::radio) :
56 default_button_delegate(std::forward<Value>(value), std::forward<OnValue>(on_value), value_type{})
57 {
58 }
59
64 template<typename Value>
65 default_button_delegate(Value &&value) noexcept requires(can_make_defaults) :
66 default_button_delegate(std::forward<Value>(value), static_cast<value_type>(1), value_type{})
67 {
68 }
69
71 callback_ptr_type subscribe(abstract_button_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
72 {
73 _value.subscribe(callback_ptr);
74 _on_value.subscribe(callback_ptr);
75 _off_value.subscribe(callback_ptr);
76 return callback_ptr;
77 }
78
79 void unsubscribe(abstract_button_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
80 {
81 _value.unsubscribe(callback_ptr);
82 _on_value.unsubscribe(callback_ptr);
83 _off_value.unsubscribe(callback_ptr);
84 }
85
86 [[nodiscard]] button_state state(abstract_button_widget const &sender) const noexcept override
87 {
88 if (_value == _on_value) {
89 return button_state::on;
90 } else if (_value == _off_value) {
91 return button_state::off;
92 } else {
93 return button_state::other;
94 }
95 }
96
97 void activate(abstract_button_widget &sender) noexcept override
98 {
99 if constexpr (button_type == button_type::toggle) {
100 if (_value == _off_value) {
101 _value = *_on_value;
102 } else {
103 _value = *_off_value;
104 }
105 } else if constexpr (button_type == button_type::radio) {
106 _value = *_on_value;
107 }
108 }
110private:
111 observable<value_type> _value;
112 observable<value_type> _on_value;
113 observable<value_type> _off_value;
114};
115
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>>>;
119
120template<button_type ButtonType, typename Value, typename... Args>
121std::unique_ptr<button_delegate> make_unique_default_button_delegate(Value &&value, Args &&...args) noexcept
122{
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)...);
126}
127
128} // namespace tt
button_state
The state of a button.
Definition button_state.hpp:13
button_type
The type of button.
Definition button_type.hpp:13
STL namespace.
void unsubscribe(callback_ptr_type const &callback_ptr) noexcept
Unsubscribe a callback function.
Definition observable.hpp:468
callback_ptr_type subscribe(Callback &&callback) noexcept
Subscribe a callback function.
Definition observable.hpp:442
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