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 hi::inline v1 {
18template<typename T>
20
21template<std::integral T>
23public:
24 using value_type = T;
25
27
28 default_text_field_delegate(auto&& value) noexcept : value(hi_forward(value))
29 {
30 _value_cbt = this->value.subscribe([&](auto...) {
31 this->_notifier();
32 });
33 }
34
35 std::optional<label> validate(text_field_widget& sender, std::string_view text) noexcept override
36 {
37 try {
38 [[maybe_unused]] auto dummy = from_string<value_type>(text, 10);
39 } catch (parse_error const&) {
40 return {tr{"Invalid integer"}};
41 }
42
43 return {};
44 }
45
46 std::string text(text_field_widget& sender) noexcept override
47 {
48 return to_string(*value);
49 }
50
51 void set_text(text_field_widget& sender, std::string_view text) noexcept override
52 {
53 try {
54 value = from_string<value_type>(text, 10);
55 } catch (std::exception const&) {
56 // Ignore the error, don't modify the value.
57 return;
58 }
59 }
60
61private:
62 typename decltype(value)::token_type _value_cbt;
63};
64
65template<std::floating_point T>
66class default_text_field_delegate<T> : public text_field_delegate {
67public:
68 using value_type = T;
69
70 observable<value_type> value;
71
72 default_text_field_delegate(auto&& value) noexcept : value(hi_forward(value))
73 {
74 _value_cbt = this->value.subscribe([&](auto...) {
75 this->_notifier();
76 });
77 }
78
79 label validate(text_field_widget& sender, std::string_view text) noexcept override
80 {
81 try {
82 [[maybe_unused]] auto dummy = from_string<value_type>(text);
83 } catch (parse_error const&) {
84 return {elusive_icon::WarningSign, tr{"Invalid floating point number"}};
85 }
86
87 return {};
88 }
89
90 std::string text(text_field_widget& sender) noexcept override
91 {
92 return to_string(*value);
93 }
94
95 void set_text(text_field_widget& sender, std::string_view text) noexcept override
96 {
97 try {
98 value = from_string<value_type>(text);
99 } catch (std::exception const&) {
100 // Ignore the error, don't modify the value.
101 return;
102 }
103 }
104
105private:
106 typename decltype(value)::token_type _value_cbt;
107};
108
109template<typename Value>
110default_text_field_delegate(Value&&) -> default_text_field_delegate<observable_argument_t<std::remove_cvref_t<Value>>>;
111
112std::unique_ptr<text_field_delegate> make_unique_default_text_field_delegate(auto&& value, auto&&...args) noexcept
113{
114 using value_type = observable_argument_t<std::remove_cvref_t<decltype(value)>>;
115 return std::make_unique<default_text_field_delegate<value_type>>(hi_forward(value), hi_forward(args)...);
116}
117
118} // namespace hi::inline v1
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition required.hpp:29
Exception thrown during parsing on an error.
Definition exception.hpp:25
A localizable message.
Definition translate.hpp:150
A label consisting of localizable text and an icon.
Definition label.hpp:27
An observable value.
Definition observable.hpp:356
Definition default_text_field_delegate.hpp:19
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:51
std::string text(text_field_widget &sender) noexcept override
Get the text to show in the text field.
Definition default_text_field_delegate.hpp:46
label validate(text_field_widget &sender, std::string_view text) noexcept override
Validate the text field.
Definition default_text_field_delegate.hpp:79
std::optional< label > validate(text_field_widget &sender, std::string_view text) noexcept override
Validate the text field.
Definition default_text_field_delegate.hpp:35
Definition text_field_delegate.hpp:15
A single line text field.
Definition text_field_widget.hpp:55