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 "../unicode/module.hpp"
12#include "../label.hpp"
13#include "../GUI/module.hpp"
14#include "../utility/module.hpp"
15#include <string>
16#include <memory>
17#include <functional>
18
19namespace hi { inline namespace v1 {
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(widget& sender) noexcept {}
34
35 virtual void deinit(widget& sender) noexcept
36 {
37 }
38
41 [[nodiscard]] virtual text read(widget& sender) noexcept = 0;
42
45 virtual void write(widget& sender, text const& text) noexcept = 0;
46
49 [[nodiscard]] callback_token
50 subscribe(forward_of<callback_proto> auto&& callback, callback_flags flags = callback_flags::synchronous) noexcept
51 {
52 return _notifier.subscribe(hi_forward(callback), flags);
53 }
54
55protected:
56 notifier_type _notifier;
57};
58
64template<typename T>
66
71template<>
73public:
74 using value_type = text;
75
76 observer<value_type> value;
77
82 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
83 {
84 _value_cbt = this->value.subscribe([&](auto...) {
85 this->_notifier();
86 });
87 }
88
89 [[nodiscard]] text read(widget& sender) noexcept override
90 {
91 return *value;
92 }
93
94 void write(widget& sender, text const& text) noexcept override
95 {
96 *value.copy() = text;
97 }
98
99private:
100 typename decltype(value)::callback_token _value_cbt;
101};
102
107template<>
108class default_text_delegate<translate> : public text_delegate {
109public:
110 using value_type = translate;
111
112 observer<value_type> value;
113
118 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
119 {
120 _value_cbt = this->value.subscribe([&](auto...) {
121 this->_notifier();
122 });
123 }
124
125 [[nodiscard]] text read(widget& sender) noexcept override
126 {
127 return value.read()();
128 }
129
130 void write(widget& sender, text const& text) noexcept override
131 {
133 }
134
135private:
136 typename decltype(value)::callback_token _value_cbt;
137};
138
143template<>
144class default_text_delegate<text_variant> : public text_delegate {
145public:
146 using value_type = text_variant;
147
148 observer<value_type> value;
149
154 explicit default_text_delegate(forward_of<observer<value_type>> auto&& value) noexcept : value(hi_forward(value))
155 {
156 _value_cbt = this->value.subscribe([&](auto...) {
157 this->_notifier();
158 });
159 }
160
161 [[nodiscard]] text read(widget& sender) noexcept override
162 {
163 return to_text(*value.read());
164 }
165
166 void write(widget& sender, hi::text const& text) noexcept override
167 {
168 auto proxy = value.copy();
169 auto *ptr = std::addressof(*proxy);
170
171 if (auto *text_ptr = get_if<hi::text>(ptr)) {
172 *text_ptr = text;
173 } else {
175 }
176 }
177
178private:
179 typename decltype(value)::callback_token _value_cbt;
180};
181
189std::shared_ptr<text_delegate> make_default_text_delegate(auto&& value) noexcept requires requires
190{
191 default_text_delegate<observer_decay_t<decltype(value)>>{hi_forward(value)};
192}
193{
194 return std::make_shared<default_text_delegate<observer_decay_t<decltype(value)>>>(hi_forward(value));
195}
196
197}} // 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:279
#define hi_not_implemented(...)
This part of the code has not been implemented yet.
Definition assert.hpp:335
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
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:189
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
Definition widget.hpp:26
A delegate that controls the state of a text_widget.
Definition text_delegate.hpp:25
virtual text read(widget &sender) noexcept=0
Read text as a string of graphemes.
virtual void write(widget &sender, text const &text) noexcept=0
Write text from 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:50
A default text delegate.
Definition text_delegate.hpp:65
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:82
void write(widget &sender, text const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:94
text read(widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:89
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:118
text read(widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:125
void write(widget &sender, text const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:130
void write(widget &sender, hi::text const &text) noexcept override
Write text from a string of graphemes.
Definition text_delegate.hpp:166
default_text_delegate(forward_of< observer< value_type > > auto &&value) noexcept
Construct a delegate.
Definition text_delegate.hpp:154
text read(widget &sender) noexcept override
Read text as a string of graphemes.
Definition text_delegate.hpp:161
T addressof(T... args)
T make_shared(T... args)