41 static_assert(Axis == axis::horizontal or Axis == axis::vertical);
44 static constexpr hi::axis axis = Axis;
55 hi_axiom(is_gui_thread());
74 template<
typename Widget,
typename... Args>
77 auto tmp = std::make_unique<Widget>(
window,
this, std::forward<Args>(args)...);
80 hi_request_reconstrain(
"row_column_widget::make_widget()");
88 hi_axiom(is_gui_thread());
90 hi_request_reconstrain(
"row_column_widget::clear()");
94 [[nodiscard]] generator<widget *> children() const noexcept
override
96 for (
hilet& child : _children) {
101 widget_constraints
const& set_constraints() noexcept
override
107 auto minimum_thickness = 0.0f;
108 auto preferred_thickness = 0.0f;
109 auto maximum_thickness = 0.0f;
110 float margin_before_thickness = 0.0f;
111 float margin_after_thickness = 0.0f;
112 widget_baseline baseline = {};
114 _grid_layout.
clear();
115 for (
hilet& child : _children) {
116 update_constraints_for_child(
122 margin_before_thickness,
123 margin_after_thickness,
128 hi_axiom(index == ssize(_children));
130 if constexpr (axis == axis::row) {
131 return _constraints = {
132 {_grid_layout.
minimum(), minimum_thickness},
133 {_grid_layout.
preferred(), preferred_thickness},
134 {_grid_layout.
maximum(), maximum_thickness},
135 {_grid_layout.margin_before(),
136 margin_before_thickness,
137 _grid_layout.margin_after(),
138 margin_after_thickness},
141 return _constraints = {
142 {minimum_thickness, _grid_layout.
minimum()},
143 {preferred_thickness, _grid_layout.
preferred()},
144 {maximum_thickness, _grid_layout.
maximum()},
145 {margin_before_thickness,
146 _grid_layout.margin_before(),
147 margin_after_thickness,
148 _grid_layout.margin_after()}};
152 void set_layout(widget_layout
const&
layout)
noexcept override
159 for (
hilet& child : _children) {
160 update_layout_for_child(*child, index++,
layout);
163 hi_axiom(index == ssize(_children));
166 void draw(draw_context
const& context)
noexcept override
169 for (
hilet& child : _children) {
170 child->draw(context);
175 hitbox hitbox_test(point3 position)
const noexcept override
177 hi_axiom(is_gui_thread());
181 for (
hilet& child : _children) {
182 r = child->hitbox_test_from_parent(position, r);
192 grid_layout _grid_layout;
194 void update_constraints_for_child(
197 float& minimum_thickness,
198 float& preferred_thickness,
199 float& maximum_thickness,
200 float& margin_before_thickness,
201 float& margin_after_thickness,
202 widget_baseline& baseline)
noexcept
204 hi_axiom(is_gui_thread());
206 hilet& child_constraints = child.set_constraints();
207 if (axis == axis::row) {
208 _grid_layout.add_constraint(
210 child_constraints.minimum.width(),
211 child_constraints.preferred.width(),
212 child_constraints.maximum.width(),
213 child_constraints.margins.left(),
214 child_constraints.margins.right());
216 inplace_max(minimum_thickness, child_constraints.minimum.height());
217 inplace_max(preferred_thickness, child_constraints.preferred.height());
218 inplace_max(maximum_thickness, child_constraints.maximum.height());
219 inplace_max(margin_before_thickness, child_constraints.margins.top());
220 inplace_max(margin_after_thickness, child_constraints.margins.bottom());
221 inplace_max(baseline, child_constraints.baseline);
224 _grid_layout.add_constraint(
226 child_constraints.minimum.height(),
227 child_constraints.preferred.height(),
228 child_constraints.maximum.height(),
229 child_constraints.margins.top(),
230 child_constraints.margins.bottom(),
231 child_constraints.baseline);
233 inplace_max(minimum_thickness, child_constraints.minimum.width());
234 inplace_max(preferred_thickness, child_constraints.preferred.width());
235 inplace_max(maximum_thickness, child_constraints.maximum.width());
236 inplace_max(margin_before_thickness, child_constraints.margins.left());
237 inplace_max(margin_after_thickness, child_constraints.margins.right());
241 void update_layout_for_child(
widget& child,
ssize_t index, widget_layout
const& context)
const noexcept
243 hi_axiom(is_gui_thread());
245 hilet[child_position, child_length] = _grid_layout.get_position_and_size(index);
247 if (axis == axis::row) {
248 hilet child_rectangle = aarectangle{child_position, 0.0f, child_length,
layout().height()};
250 child.set_layout(context.transform(child_rectangle, 0.0f));
253 hilet child_rectangle =
254 aarectangle{0.0f,
layout().height() - child_position - child_length,
layout().width(), child_length};
255 child.set_layout(context.transform(child_rectangle, 0.0f, _grid_layout.get_baseline(index)));