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<theme_text_style> text_style = theme_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(command command) 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
107 observable<gstring> _text;
108
111 aarectangle _text_rectangle;
112
115 observable<label> _error_label;
116 aarectangle _error_label_rectangle;
117 std::unique_ptr<label_widget> _error_label_widget;
118
119 typename decltype(continues)::token_type _continues_cbt;
120 typename decltype(text_style)::token_type _text_style_cbt;
121 typename decltype(_text)::token_type _text_cbt;
122
123 text_field_widget(gui_window &window, widget *parent, weak_or_unique_ptr<delegate_type> delegate) noexcept;
124 void revert(bool force) noexcept;
125 void commit(bool force) noexcept;
126 void draw_background_box(draw_context const &context) const noexcept;
127};
128
129} // namespace hi::inline v1
STL namespace.
A return value for a generator-function.
Definition generator.hpp:27
Definition gui_window.hpp:40
An observable value.
Definition observable.hpp:356
Definition text_style.hpp:18
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:40