11#include "../GUI/module.hpp"
15namespace hi {
inline namespace v1 {
36template<fixed_string Name =
"">
41 constexpr static auto prefix = Name +
"tab";
48 delegate->deinit(*
this);
66 _delegate_cbt = this->delegate->subscribe([&] {
67 ++global_counter<
"tab_widget:delegate:constrain">;
71 this->delegate->init(*
this);
94 template<
typename WidgetType,
typename Key,
typename... Args>
99 auto tmp = std::make_unique<WidgetType>(
this, std::forward<Args>(args)...);
103 delegate->add_tab(*
this,
static_cast<std::size_t>(key), size(_children));
105 ++global_counter<
"tab_widget:make_widget:constrain">;
111 [[nodiscard]] generator<widget const&> children(
bool include_invisible)
const noexcept override
113 for (
hilet& child : _children) {
118 [[nodiscard]] box_constraints update_constraints() noexcept
override
120 auto& selected_child_ = selected_child();
122 if (_previous_selected_child != &selected_child_) {
123 _previous_selected_child = &selected_child_;
124 hi_log_info(
"tab_widget::update_constraints() selected tab changed");
128 for (
hilet& child : _children) {
132 return selected_child_.update_constraints();
135 void set_layout(widget_layout
const& context)
noexcept override
139 for (
hilet& child : _children) {
141 child->set_layout(context);
146 void draw(widget_draw_context
const& context)
noexcept override
149 for (
hilet& child : _children) {
150 child->draw(context);
155 [[nodiscard]] hitbox hitbox_test(point2i position)
const noexcept override
161 for (
hilet& child : _children) {
162 r = child->hitbox_test_from_parent(position, r);
170 [[nodiscard]] widget_id find_next_widget(
171 widget_id current_widget,
172 keyboard_focus_group group,
173 keyboard_focus_direction direction)
const noexcept override
180 widget
const *_previous_selected_child =
nullptr;
182 notifier<>::callback_token _delegate_cbt;
184 using const_iterator =
decltype(_children)::const_iterator;
186 [[nodiscard]] const_iterator find_selected_child() const noexcept
191 auto index = delegate->index(
const_cast<tab_widget&
>(*
this));
192 if (index >= 0 and index < ssize(_children)) {
193 return _children.
begin() + index;
196 return _children.
end();
199 [[nodiscard]] widget& selected_child() const noexcept
204 auto i = find_selected_child();
205 if (i != _children.
cend()) {
208 return *_children.
front();
Defines delegate_delegate and some default tab delegates.
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
#define hi_assert_not_null(x,...)
Assert if an expression is not nullptr.
Definition assert.hpp:238
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
#define hi_forward(x)
Forward a value, based on the decltype of the value.
Definition utility.hpp:29
@ window_reconstrain
Request that widget get constraint on the next frame.
@ window_resize
Request that the window resizes to desired constraints on the next frame.
std::shared_ptr< tab_delegate > make_default_tab_delegate(auto &&value) noexcept
Create a shared pointer to a default tab delegate.
Definition tab_delegate.hpp:101
@ partial
A widget is partially enabled.
@ invisible
The widget is invisible.
@ enabled
The widget is fully enabled.
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11
virtual widget_id find_next_widget(widget_id current_keyboard_widget, keyboard_focus_group group, keyboard_focus_direction direction) const noexcept
Find the next widget that handles keyboard focus.
Definition widget.hpp:388
widget * parent
Pointer to the parent widget.
Definition widget.hpp:40
observer< widget_mode > mode
The widget mode.
Definition widget.hpp:53
size_t semantic_layer
The draw layer of the widget.
Definition widget.hpp:85
A delegate that controls the state of a tab_widget.
Definition tab_delegate.hpp:20
A graphical element that shows only one of a predefined set of mutually exclusive child widgets.
Definition tab_widget.hpp:37
tab_widget(widget *parent, different_from< std::shared_ptr< delegate_type > > auto &&value) noexcept
Construct a tab widget with an observer value.
Definition tab_widget.hpp:80
WidgetType & make_widget(Key const &key, Args &&...args)
Make and add a child widget.
Definition tab_widget.hpp:95
tab_widget(widget *parent, std::shared_ptr< delegate_type > delegate) noexcept
Construct a tab widget with a delegate.
Definition tab_widget.hpp:56