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 "../l10n/l10n.hpp"
12#include "../unicode/unicode.hpp"
13#include "../l10n/l10n.hpp"
14#include "../macros.hpp"
15#include <string>
16#include <memory>
17#include <functional>
18
19namespace hi { inline namespace v1 {
20class text_widget;
21
27public:
28 using notifier_type = notifier<>;
29 using callback_token = notifier_type::callback_token;
30 using callback_proto = notifier_type::callback_proto;
31
32 virtual ~text_delegate() = default;
33
34 virtual void init(text_widget& sender) noexcept {}
35 virtual void deinit(text_widget& sender) noexcept {}
36
39 [[nodiscard]] virtual gstring read(text_widget& sender) noexcept = 0;
40
43 virtual void write(text_widget& sender, gstring const& text) noexcept = 0;
44
47 [[nodiscard]] callback_token
48 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
49 {
50 return _notifier.subscribe(hi_forward(callback), flags);
51 }
52
53protected:
54 notifier_type _notifier;
55};
56
62template<typename T>
64
69template<>
71public:
72 using value_type = char const *;
73
75
80 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
81 {
82 _value_cbt = this->value.subscribe([&](auto...) {
83 this->_notifier();
84 });
85 }
86
87 [[nodiscard]] gstring read(text_widget& sender) noexcept override
88 {
89 return to_gstring(std::string{*value});
90 }
91
92 void write(text_widget& sender, gstring const& text) noexcept override
93 {
94 hi_no_default();
95 }
96
97private:
98 typename decltype(value)::callback_token _value_cbt;
99};
100
105template<>
106class default_text_delegate<std::string> : public text_delegate {
107public:
108 using value_type = std::string;
109
111
116 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
117 {
118 _value_cbt = this->value.subscribe([&](auto...) {
119 this->_notifier();
120 });
121 }
122
123 [[nodiscard]] gstring read(text_widget& sender) noexcept override
124 {
125 return to_gstring(*value);
126 }
127
128 void write(text_widget& sender, gstring const& text) noexcept override
129 {
130 *value.copy() = to_string(text);
131 }
132
133private:
134 typename decltype(value)::callback_token _value_cbt;
135};
136
141template<>
142class default_text_delegate<gstring> : public text_delegate {
143public:
144 using value_type = gstring;
145
147
152 explicit default_text_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 [[nodiscard]] gstring read(text_widget& sender) noexcept override
160 {
161 return *value;
162 }
163
164 void write(text_widget& sender, gstring const& text) noexcept override
165 {
166 *value.copy() = text;
167 }
168
169private:
170 typename decltype(value)::callback_token _value_cbt;
171};
172
177template<>
179public:
180 using value_type = txt;
181
183
188 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
189 {
190 _value_cbt = this->value.subscribe([&](auto...) {
191 this->_notifier();
192 });
193 }
194
195 [[nodiscard]] gstring read(text_widget& sender) noexcept override
196 {
197 return value.read()->translate();
198 }
199
200 void write(text_widget& sender, gstring const& text) noexcept override
201 {
202 hi_no_default();
203 }
204
205private:
206 typename decltype(value)::callback_token _value_cbt;
207};
208
216std::shared_ptr<text_delegate> make_default_text_delegate(auto&& value) noexcept requires requires
217{
218 default_text_delegate<observer_decay_t<decltype(value)>>{hi_forward(value)};
219}
220{
221 return std::make_shared<default_text_delegate<observer_decay_t<decltype(value)>>>(hi_forward(value));
222}
223
224}} // namespace hi::v1
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:216
STL namespace.
DOXYGEN BUG.
Definition algorithm.hpp:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
A localizable message.
Definition txt.hpp:100
A delegate that controls the state of a text_widget.
Definition text_delegate.hpp:26
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:48
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:63
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:92
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:80
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:87
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:116
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:123
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:128
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:152
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:164
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:159
gstring read(text_widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:195
void write(text_widget &sender, gstring const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:200
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:188
A text widget.
Definition text_widget.hpp:60
True if T is a forwarded type of Forward.
Definition concepts.hpp:131
T make_shared(T... args)