HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
selection_widget.hpp
1// Copyright Take Vos 2020-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 "widget.hpp"
8#include "label_widget.hpp"
9#include "overlay_widget.hpp"
10#include "scroll_widget.hpp"
11#include "row_column_widget.hpp"
12#include "menu_button_widget.hpp"
13#include "selection_delegate.hpp"
14#include "default_selection_delegate.hpp"
15#include "../observable.hpp"
16#include "../weak_or_unique_ptr.hpp"
17#include <memory>
18#include <string>
19#include <array>
20#include <optional>
21#include <future>
22
23namespace hi::inline v1 {
24
37class selection_widget final : public widget {
38public:
39 using super = widget;
41
42 observable<label> unknown_label;
43
45
52 selection_widget(gui_window &window, widget *parent, std::weak_ptr<delegate_type> delegate) noexcept;
53
65 template<typename OptionList, typename Value, typename... Args>
66 selection_widget(gui_window &window, widget *parent, OptionList &&option_list, Value &&value, Args &&...args) noexcept
67 requires(not std::is_convertible_v<Value, weak_or_unique_ptr<delegate_type>>) :
69 window,
70 parent,
71 make_unique_default_selection_delegate(
72 std::forward<OptionList>(option_list),
73 std::forward<Value>(value),
74 std::forward<Args>(args)...))
75 {
76 }
77
79 [[nodiscard]] generator<widget *> children() const noexcept override
80 {
81 co_yield _overlay_widget.get();
82 co_yield _current_label_widget.get();
83 co_yield _unknown_label_widget.get();
84 }
85
86 widget_constraints const &set_constraints() noexcept override;
87 void set_layout(widget_layout const &layout) noexcept override;
88 void draw(draw_context const &context) noexcept override;
89 bool handle_event(mouse_event const &event) noexcept override;
90 bool handle_event(command command) noexcept override;
91 [[nodiscard]] hitbox hitbox_test(point3 position) const noexcept override;
92 [[nodiscard]] bool accepts_keyboard_focus(keyboard_focus_group group) const noexcept override;
93 [[nodiscard]] color focus_color() const noexcept override;
95private:
96 weak_or_unique_ptr<delegate_type> _delegate;
97 notifier<>::token_type _delegate_cbt;
98
99 std::unique_ptr<label_widget> _current_label_widget;
100 std::unique_ptr<label_widget> _unknown_label_widget;
101
102 aarectangle _option_rectangle;
103 aarectangle _left_box_rectangle;
104
105 glyph_ids _chevrons_glyph;
106 aarectangle _chevrons_rectangle;
107
108 bool _selecting = false;
109 bool _has_options = false;
110
111 aarectangle _overlay_rectangle;
112 std::unique_ptr<overlay_widget> _overlay_widget;
113 vertical_scroll_widget<> *_scroll_widget = nullptr;
114 column_widget *_column_widget = nullptr;
115
116 decltype(unknown_label)::token_type _unknown_label_cbt;
117 std::vector<menu_button_widget *> _menu_button_widgets;
118 std::vector<notifier<>::token_type> _menu_button_tokens;
119
120 selection_widget(gui_window &window, widget *parent, weak_or_unique_ptr<delegate_type> delegate) noexcept;
121 [[nodiscard]] menu_button_widget const *get_first_menu_button() const noexcept;
122 [[nodiscard]] menu_button_widget const *get_selected_menu_button() const noexcept;
123 void start_selecting() noexcept;
124 void stop_selecting() noexcept;
125 void repopulate_options() noexcept;
126 void draw_outline(draw_context const &context) noexcept;
127 void draw_left_box(draw_context const &context) noexcept;
128 void draw_chevrons(draw_context const &context) noexcept;
129};
130
131} // 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 selection_delegate.hpp:15
A graphical control element that allows the user to choose only one of a predefined set of mutually e...
Definition selection_widget.hpp:37
selection_widget(gui_window &window, widget *parent, OptionList &&option_list, Value &&value, Args &&...args) noexcept
Construct a selection widget which will monitor an option list and a value.
Definition selection_widget.hpp:66
selection_widget(gui_window &window, widget *parent, std::weak_ptr< delegate_type > delegate) noexcept
Construct a selection widget with a delegate.
An interactive graphical object as part of the user-interface.
Definition widget.hpp:40