HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
text_field_delegate.hpp
Go to the documentation of this file.
1// Copyright Take Vos 2021-2022.
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 "../label.hpp"
12#include "../observer.hpp"
13#include <string>
14#include <string_view>
15#include <optional>
16#include <concepts>
17
18namespace hi { inline namespace v1 {
19
25public:
26 using notifier_type = notifier<>;
27 using callback_token = notifier_type::callback_token;
28 using callback_proto = notifier_type::callback_proto;
29
30 virtual ~text_field_delegate() = default;
31 virtual void init(widget const& sender) noexcept {}
32 virtual void deinit(widget const& sender) noexcept {}
33
40 virtual std::optional<label> validate(widget& sender, hi::text_view text) noexcept
41 {
42 return std::nullopt;
43 }
44
52 virtual hi::text text(widget& sender) noexcept
53 {
54 return {};
55 }
56
67 virtual void set_text(widget& sender, hi::text_view text) noexcept {}
68
69 callback_token
70 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
71 {
72 return _notifier.subscribe(hi_forward(callback), flags);
73 }
74
75protected:
76 notifier_type _notifier;
77};
78
84template<typename T>
86
94template<std::integral T>
96public:
97 using value_type = T;
98
99 observer<value_type> value;
100
101 default_text_field_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
102 {
103 _value_cbt = this->value.subscribe([&](auto...) {
104 this->_notifier();
105 });
106 }
107
108 std::optional<label> validate(widget& sender, hi::text_view text) noexcept override
109 {
110 try {
111 [[maybe_unused]] auto dummy = from_text<value_type>(text, 10);
112 } catch (parse_error const&) {
113 return label{tr{"Invalid integer"}};
114 }
115
116 return std::nullopt;
117 }
118
119 hi::text text(widget& sender) noexcept override
120 {
121 return to_text(*value);
122 }
123
124 void set_text(widget& sender, hi::text_view text) noexcept override
125 {
126 try {
127 value = from_text<value_type>(text, 10);
128 } catch (std::exception const&) {
129 // Ignore the error, don't modify the value.
130 return;
131 }
132 }
133
134private:
135 typename decltype(value)::callback_token _value_cbt;
136};
137
145template<std::floating_point T>
147public:
148 using value_type = T;
149
150 observer<value_type> value;
151
152 default_text_field_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
153 {
154 _value_cbt = this->value.subscribe([&](auto...) {
155 this->_notifier();
156 });
157 }
158
159 std::optional<label> validate(widget& sender, text_view text) noexcept override
160 {
161 try {
162 [[maybe_unused]] auto dummy = from_text<value_type>(text);
163 } catch (parse_error const&) {
164 return label{elusive_icon::WarningSign, tr{"[E]Invalid floating point number."}};
165 }
166
167 return std::nullopt;
168 }
169
170 hi::text text(widget& sender) noexcept override
171 {
172 return to_text(*value);
173 }
174
175 void set_text(widget& sender, hi::text_view text) noexcept override
176 {
177 try {
178 value = from_text<value_type>(text);
179 } catch (std::exception const&) {
180 // Ignore the error, don't modify the value.
181 return;
182 }
183 }
184
185private:
186 typename decltype(value)::callback_token _value_cbt;
187};
188
196[[nodiscard]] std::shared_ptr<text_field_delegate> make_default_text_field_delegate(auto&& value) noexcept requires requires
197{
198 default_text_field_delegate<observer_decay_t<decltype(value)>>{hi_forward(value)};
199}
200{
201 using value_type = observer_decay_t<decltype(value)>;
202 return std::make_shared<default_text_field_delegate<value_type>>(hi_forward(value));
203}
204
205}} // namespace hi::v1
Functionality for labels, text and icons.
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
std::shared_ptr< text_field_delegate > make_default_text_field_delegate(auto &&value) noexcept
Create a shared pointer to a default text delegate.
Definition text_field_delegate.hpp:196
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
Definition widget.hpp:26
Exception thrown during parsing on an error.
Definition exception.hpp:50
A delegate that controls the state of a text_field_widget.
Definition text_field_delegate.hpp:24
virtual std::optional< label > validate(widget &sender, hi::text_view text) noexcept
Validate the text field.
Definition text_field_delegate.hpp:40
virtual hi::text text(widget &sender) noexcept
Get the text to show in the text field.
Definition text_field_delegate.hpp:52
virtual void set_text(widget &sender, hi::text_view text) noexcept
Set the text as entered by the user.
Definition text_field_delegate.hpp:67
A default text delegate.
Definition text_field_delegate.hpp:85
void set_text(widget &sender, hi::text_view text) noexcept override
Set the text as entered by the user.
Definition text_field_delegate.hpp:124
std::optional< label > validate(widget &sender, hi::text_view text) noexcept override
Validate the text field.
Definition text_field_delegate.hpp:108
std::optional< label > validate(widget &sender, text_view text) noexcept override
Validate the text field.
Definition text_field_delegate.hpp:159
hi::text text(widget &sender) noexcept override
Get the text to show in the text field.
Definition text_field_delegate.hpp:119