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<typename Value>
73default_text_field_delegate(Value &&) -> default_text_field_delegate<observable_argument_t<std::remove_cvref_t<Value>>>;
74
75template<typename Value, typename... Args>
76std::unique_ptr<text_field_delegate> make_unique_default_text_field_delegate(Value &&value, Args &&... args) noexcept
77{
78 using value_type = observable_argument_t<std::remove_cvref_t<Value>>;
79 return std::make_unique<default_text_field_delegate<value_type>>(std::forward<Value>(value), std::forward<Args>(args)...);
80}
81
82} // namespace tt
Exception thrown during parsing on an error.
Definition exception.hpp:26
A localizable message.
Definition l10n.hpp:149
An observable value.
Definition observable.hpp:280
void unsubscribe(callback_ptr_type const &callback_ptr) noexcept
Unsubscribe a callback function.
Definition observable.hpp:468
callback_ptr_type subscribe(Callback &&callback) noexcept
Subscribe a callback function.
Definition observable.hpp:442
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