HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
text_delegate.hpp
Go to the documentation of this file.
1// Copyright Take Vos 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 "../i18n/translate.hpp"
12#include "../unicode/gstring.hpp"
13#include "../label.hpp"
14#include <string>
15#include <memory>
16#include <functional>
17
18namespace hi { inline namespace v1 {
19class text_widget;
20
26public:
27 using notifier_type = notifier<>;
28 using callback_token = notifier_type::callback_token;
29 using callback_proto = notifier_type::callback_proto;
30
31 virtual ~text_delegate() = default;
32
33 virtual void init(text_widget& sender) noexcept {}
34 virtual void deinit(text_widget& sender) noexcept {}
35
38 [[nodiscard]] virtual gstring read(text_widget& sender) noexcept = 0;
39
42 virtual void write(text_widget& sender, gstring const& text) noexcept = 0;
43
46 [[nodiscard]] callback_token
47 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
48 {
49 return _notifier.subscribe(hi_forward(callback), flags);
50 }
51
52protected:
53 notifier_type _notifier;
54};
55
61template<typename T>
63
68template<>
69class default_text_delegate<char const *> : public text_delegate {
70public:
71 using value_type = char const *;
72
73 observer<value_type> value;
74
79 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
80 {
81 _value_cbt = this->value.subscribe([&](auto...) {
82 this->_notifier();
83 });
84 }
85
86 [[nodiscard]] gstring read(text_widget& sender) noexcept override
87 {
88 return to_gstring(std::string{*value});
89 }
90
91 void write(text_widget& sender, gstring const& text) noexcept override
92 {
94 }
95
96private:
97 typename decltype(value)::callback_token _value_cbt;
98};
99
104template<>
105class default_text_delegate<std::string> : public text_delegate {
106public:
107 using value_type = std::string;
108
109 observer<value_type> value;
110
115 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
116 {
117 _value_cbt = this->value.subscribe([&](auto...) {
118 this->_notifier();
119 });
120 }
121
122 [[nodiscard]] gstring read(text_widget& sender) noexcept override
123 {
124 return to_gstring(*value);
125 }
126
127 void write(text_widget& sender, gstring const& text) noexcept override
128 {
129 *value.copy() = to_string(text);
130 }
131
132private:
133 typename decltype(value)::callback_token _value_cbt;
134};
135
140template<>
141class default_text_delegate<gstring> : public text_delegate {
142public:
143 using value_type = gstring;
144
145 observer<value_type> value;
146
151 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
152 {
153 _value_cbt = this->value.subscribe([&](auto...) {
154 this->_notifier();
155 });
156 }
157
158 [[nodiscard]] gstring read(text_widget& sender) noexcept override
159 {
160 return *value;
161 }
162
163 void write(text_widget& sender, gstring const& text) noexcept override
164 {
165 *value.copy() = text;
166 }
167
168private:
169 typename decltype(value)::callback_token _value_cbt;
170};
171
176template<>
177class default_text_delegate<translate> : public text_delegate {
178public:
179 using value_type = translate;
180
181 observer<value_type> value;
182
187 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
188 {
189 _value_cbt = this->value.subscribe([&](auto...) {
190 this->_notifier();
191 });
192 }
193
194 [[nodiscard]] gstring read(text_widget& sender) noexcept override
195 {
196 return to_gstring(value.read()());
197 }
198
199 void write(text_widget& sender, gstring const& text) noexcept override
200 {
202 }
203
204private:
205 typename decltype(value)::callback_token _value_cbt;
206};
207
212template<>
214public:
215 using value_type = text;
216
217 observer<value_type> value;
218
223 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
224 {
225 _value_cbt = this->value.subscribe([&](auto...) {
226 this->_notifier();
227 });
228 }
229
230 [[nodiscard]] gstring read(text_widget& sender) noexcept override
231 {
232 return to_gstring(*value.read());
233 }
234
235 void write(text_widget& sender, gstring const& text) noexcept override
236 {
237 auto proxy = value.copy();
238 auto *ptr = std::addressof(*proxy);
239
240 if (auto *string_ptr = get_if<std::string>(ptr)) {
241 *string_ptr = to_string(text);
242 } else if (auto *gstring_ptr = get_if<gstring>(ptr)) {
243 *gstring_ptr = text;
244 } else {
246 }
247 }
248
249private:
250 typename decltype(value)::callback_token _value_cbt;
251};
252
260std::shared_ptr<text_delegate> make_default_text_delegate(auto&& value) noexcept requires requires
261{
262 default_text_delegate<observer_decay_t<decltype(value)>>{hi_forward(value)};
263}
264{
265 return std::make_shared<default_text_delegate<observer_decay_t<decltype(value)>>>(hi_forward(value));
266}
267
268}} // namespace hi::v1
Functionality for labels, text and icons.
#define hi_no_default(...)
This part of the code should not be reachable, unless a programming bug.
Definition assert.hpp:264
#define hi_not_implemented(...)
This part of the code has not been implemented yet.
Definition assert.hpp:320
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
constexpr std::string to_string(std::u32string_view rhs) noexcept
Conversion from UTF-32 to UTF-8.
Definition to_string.hpp:215
std::shared_ptr< text_delegate > make_default_text_delegate(auto &&value) noexcept
Create a shared pointer to a default text delegate.
Definition text_delegate.hpp:260
STL namespace.
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
A delegate that controls the state of a text_widget.
Definition text_delegate.hpp:25
virtual gstring read(text_widget &sender) noexcept=0
Read text as a string of graphemes.
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 text_delegate.hpp:47
virtual void write(text_widget &sender, gstring const &text) noexcept=0
Write text from a string of graphemes.
A default text delegate.
Definition text_delegate.hpp:62
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:91
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:79
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:86
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:115
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:122
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:127
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:151
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:163
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:158
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:187
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:194
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:199
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:230
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:223
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:235
A text widget.
Definition text_widget.hpp:61
T addressof(T... args)
T make_shared(T... args)