HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
default_text_field_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 "text_field_delegate.hpp"
8#include "../observable.hpp"
9#include "../label.hpp"
10#include "../charconv.hpp"
11#include "../type_traits.hpp"
12#include <type_traits>
13#include <memory>
14#include <vector>
15#include <concepts>
16
17namespace tt {
18
19template<typename T>
21
22template<std::integral T>
24public:
25 using value_type = T;
26
28
29 template<typename Value>
30 default_text_field_delegate(Value &&value) noexcept : value(std::forward<Value>(value))
31 {
32 }
33
34 callback_ptr_type subscribe(text_field_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
35 {
36 value.subscribe(callback_ptr);
37 return callback_ptr;
38 }
39
40 void unsubscribe(text_field_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
41 {
42 value.unsubscribe(callback_ptr);
43 }
44
45 std::optional<label> validate(text_field_widget &sender, std::string_view text) noexcept override
46 {
47 try {
48 [[maybe_unused]] auto dummy = from_string<value_type>(text, 10);
49 } catch (parse_error const &) {
50 return {l10n{"Invalid integer"}};
51 }
52
53 return {};
54 }
55
56 std::string text(text_field_widget &sender) noexcept override
57 {
58 return to_string(*value);
59 }
60
61 void set_text(text_field_widget &sender, std::string_view text) noexcept override
62 {
63 try {
64 value = from_string<value_type>(text, 10);
65 } catch (std::exception const &) {
66 // Ignore the error, don't modify the value.
67 return;
68 }
69 }
70};
71
72template<std::floating_point T>
73class default_text_field_delegate<T> : public text_field_delegate {
74public:
75 using value_type = T;
76
77 observable<value_type> value;
78
79 template<typename Value>
80 default_text_field_delegate(Value &&value) noexcept : value(std::forward<Value>(value))
81 {
82 }
83
84 callback_ptr_type subscribe(text_field_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
85 {
86 value.subscribe(callback_ptr);
87 return callback_ptr;
88 }
89
90 void unsubscribe(text_field_widget &sender, callback_ptr_type const &callback_ptr) noexcept override
91 {
92 value.unsubscribe(callback_ptr);
93 }
94
95 std::optional<label> validate(text_field_widget &sender, std::string_view text) noexcept override
96 {
97 try {
98 [[maybe_unused]] auto dummy = from_string<value_type>(text);
99 } catch (parse_error const &) {
100 return {l10n{"Invalid integer"}};
101 }
102
103 return {};
104 }
105
106 std::string text(text_field_widget &sender) noexcept override
107 {
108 return to_string(*value);
109 }
110
111 void set_text(text_field_widget &sender, std::string_view text) noexcept override
112 {
113 try {
114 value = from_string<value_type>(text);
115 } catch (std::exception const &) {
116 // Ignore the error, don't modify the value.
117 return;
118 }
119 }
120};
121
122template<typename Value>
123default_text_field_delegate(Value &&) -> default_text_field_delegate<observable_argument_t<std::remove_cvref_t<Value>>>;
124
125template<typename Value, typename... Args>
126std::unique_ptr<text_field_delegate> make_unique_default_text_field_delegate(Value &&value, Args &&... args) noexcept
127{
128 using value_type = observable_argument_t<std::remove_cvref_t<Value>>;
129 return std::make_unique<default_text_field_delegate<value_type>>(std::forward<Value>(value), std::forward<Args>(args)...);
130}
131
132} // namespace tt
Exception thrown during parsing on an error.
Definition exception.hpp:26
A localizable message.
Definition l10n.hpp:149
A value which can be observed for modifications.
Definition observable.hpp:464
Definition default_text_field_delegate.hpp:20
std::string text(text_field_widget &sender) noexcept override
Get the text to show in the text field.
Definition default_text_field_delegate.hpp:56
void set_text(text_field_widget &sender, std::string_view text) noexcept override
Set the text as entered by the user.
Definition default_text_field_delegate.hpp:61
std::optional< label > validate(text_field_widget &sender, std::string_view text) noexcept override
Validate the text field.
Definition default_text_field_delegate.hpp:45
Definition text_field_delegate.hpp:15
A single line text field.
Definition text_field_widget.hpp:55