49 static constexpr hi::axis axis = Axis;
65 _aperture = std::make_unique<scroll_aperture_widget>(
this);
66 _horizontal_scroll_bar = std::make_unique<horizontal_scroll_bar_widget>(
67 this, _aperture->content_width, _aperture->aperture_width, _aperture->offset_x);
68 _vertical_scroll_bar = std::make_unique<vertical_scroll_bar_widget>(
69 this, _aperture->content_height, _aperture->aperture_height, _aperture->offset_y);
81 template<
typename Widget,
typename... Args>
84 return _aperture->make_widget<Widget>(std::forward<Args>(args)...);
88 [[nodiscard]] generator<widget *> children() const noexcept
override
90 co_yield _aperture.get();
91 co_yield _vertical_scroll_bar.get();
92 co_yield _horizontal_scroll_bar.get();
98 hilet aperture_constraints = _aperture->set_constraints(context);
99 hilet horizontal_constraints = _horizontal_scroll_bar->set_constraints(context);
100 hilet vertical_constraints = _vertical_scroll_bar->set_constraints(context);
102 _constraints = aperture_constraints;
106 if constexpr (to_bool(axis & axis::horizontal)) {
107 _constraints.minimum.width() = horizontal_constraints.minimum.width();
108 inplace_max(_constraints.preferred.width(), horizontal_constraints.minimum.width());
109 inplace_max(_constraints.maximum.width(), horizontal_constraints.minimum.width());
111 if constexpr (to_bool(axis & axis::vertical)) {
112 _constraints.minimum.height() = vertical_constraints.minimum.height();
113 inplace_max(_constraints.preferred.height(), vertical_constraints.minimum.height());
114 inplace_max(_constraints.maximum.height(), vertical_constraints.minimum.height());
118 if constexpr (to_bool(axis & axis::horizontal)) {
119 _constraints.minimum.height() += horizontal_constraints.preferred.height();
120 _constraints.preferred.height() += horizontal_constraints.preferred.height();
121 _constraints.maximum.height() += horizontal_constraints.preferred.height();
123 if constexpr (to_bool(axis & axis::vertical)) {
124 _constraints.minimum.width() += vertical_constraints.preferred.width();
125 _constraints.preferred.width() += vertical_constraints.preferred.width();
126 _constraints.maximum.width() += vertical_constraints.preferred.width();
131 void set_layout(widget_layout
const& context)
noexcept override
134 hilet horizontal_visible = _aperture->x_axis_scrolls() and to_bool(axis & axis::horizontal);
135 hilet vertical_visible = _aperture->y_axis_scrolls() and to_bool(axis & axis::vertical);
136 hilet both_visible = horizontal_visible and vertical_visible;
141 hilet vertical_scroll_bar_width = _vertical_scroll_bar->constraints().preferred.width();
142 hilet horizontal_scroll_bar_height = _horizontal_scroll_bar->constraints().preferred.height();
145 hilet aperture_size = extent2{
146 vertical_visible ? context.
width() - vertical_scroll_bar_width : context.width(),
147 horizontal_visible ? context.height() - horizontal_scroll_bar_height : context.height()};
149 hilet aperture_x = context.left_to_right() ? 0.0f : vertical_visible ? vertical_scroll_bar_width : 0.0f;
150 hilet aperture_y = horizontal_visible ? horizontal_scroll_bar_height : 0.0f;
152 hilet aperture_offset = point2{aperture_x, aperture_y};
153 _aperture_rectangle = aarectangle{aperture_offset, aperture_size};
157 hilet horizontal_scroll_bar_size =
158 extent2{both_visible ? aperture_size.
width() : context.width(), horizontal_scroll_bar_height};
159 hilet vertical_scroll_bar_size =
160 extent2{vertical_scroll_bar_width, both_visible ? aperture_size.
height() : context.height()};
162 hilet vertical_scroll_bar_x = context.left_to_right() ? context.width() - vertical_scroll_bar_size.width() : 0.0f;
163 hilet vertical_scroll_bar_y = context.height() - vertical_scroll_bar_size.height();
164 _vertical_scroll_bar_rectangle =
165 aarectangle{point2{vertical_scroll_bar_x, vertical_scroll_bar_y}, vertical_scroll_bar_size};
167 hilet horizontal_scroll_bar_x = context.left_to_right() ? 0.0f : vertical_visible ? vertical_scroll_bar_width : 0.0f;
168 hilet horizontal_scroll_bar_y = 0.0f;
169 _horizontal_scroll_bar_rectangle =
170 aarectangle{point2{horizontal_scroll_bar_x, horizontal_scroll_bar_y}, horizontal_scroll_bar_size};
173 _aperture->set_layout(context.transform(_aperture_rectangle));
175 _vertical_scroll_bar->set_layout(context.transform(_vertical_scroll_bar_rectangle));
178 _horizontal_scroll_bar->set_layout(context.transform(_horizontal_scroll_bar_rectangle));
182 void draw(draw_context
const& context)
noexcept
185 _vertical_scroll_bar->draw(context);
186 _horizontal_scroll_bar->draw(context);
187 _aperture->draw(context);
191 [[nodiscard]] hitbox hitbox_test(point3 position)
const noexcept override
196 auto r = _aperture->hitbox_test_from_parent(position);
197 r = _horizontal_scroll_bar->hitbox_test_from_parent(position, r);
198 r = _vertical_scroll_bar->hitbox_test_from_parent(position, r);
200 if (
layout().contains(position)) {
201 r =
std::max(r, hitbox{
this, position});
211 aarectangle _aperture_rectangle;
214 aarectangle _horizontal_scroll_bar_rectangle;
217 aarectangle _vertical_scroll_bar_rectangle;