HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
text_field_widget.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 "default_text_field_delegate.hpp"
9#include "widget.hpp"
10#include "label_widget.hpp"
11#include "scroll_widget.hpp"
12#include "../label.hpp"
13#include "../weak_or_unique_ptr.hpp"
14#include <memory>
15#include <string>
16#include <array>
17#include <optional>
18#include <future>
19
20namespace hi::inline v1 {
21
55class text_field_widget final : public widget {
56public:
58 using super = widget;
59
63 observable<bool> continues = false;
64
67 observable<semantic_text_style> text_style = semantic_text_style::label;
68
69 virtual ~text_field_widget();
70
71 text_field_widget(gui_window &window, widget *parent, std::weak_ptr<delegate_type> delegate) noexcept;
72
73 template<typename Value>
74 text_field_widget(gui_window &window, widget *parent, Value &&value) noexcept
75 requires(not std::is_convertible_v<Value, weak_or_unique_ptr<delegate_type>>) :
76 text_field_widget(window, parent, make_unique_default_text_field_delegate(std::forward<Value>(value)))
77 {
78 }
79
81 [[nodiscard]] generator<widget *> children() const noexcept override
82 {
83 co_yield _scroll_widget.get();
84 }
85 widget_constraints const &set_constraints() noexcept override;
86 void set_layout(widget_layout const &layout) noexcept override;
87 void draw(draw_context const &context) noexcept override;
88 bool handle_event(gui_event const& event) noexcept override;
89 hitbox hitbox_test(point3 position) const noexcept override;
90 [[nodiscard]] bool accepts_keyboard_focus(keyboard_focus_group group) const noexcept override;
91 [[nodiscard]] color focus_color() const noexcept override;
93private:
94 weak_or_unique_ptr<delegate_type> _delegate;
95 notifier<>::token_type _delegate_cbt;
96
99 std::unique_ptr<scroll_widget<axis::none, false>> _scroll_widget;
100
103 text_widget *_text_widget = nullptr;
104
105
108 observable<gstring> _text;
109
112 aarectangle _box_rectangle;
113
116 aarectangle _text_rectangle;
117 widget_constraints _text_constraints;
118
121 observable<label> _error_label;
122 aarectangle _error_label_rectangle;
123 widget_constraints _error_label_constraints;
124 std::unique_ptr<label_widget> _error_label_widget;
125
126 typename decltype(continues)::token_type _continues_cbt;
127 typename decltype(text_style)::token_type _text_style_cbt;
128 typename decltype(_text)::token_type _text_cbt;
129 typename decltype(_error_label)::token_type _error_label_cbt;
130
131 text_field_widget(gui_window &window, widget *parent, weak_or_unique_ptr<delegate_type> delegate) noexcept;
132 void revert(bool force) noexcept;
133 void commit(bool force) noexcept;
134 void draw_background_box(draw_context const &context) const noexcept;
135};
136
137} // namespace hi::inline v1
STL namespace.
A return value for a generator-function.
Definition generator.hpp:28
Definition gui_window.hpp:39
An observable value.
Definition observable.hpp:359
Definition text_style.hpp:175
Definition text_field_delegate.hpp:15
A single line text field.
Definition text_field_widget.hpp:55
An interactive graphical object as part of the user-interface.
Definition widget.hpp:39