41 static_assert(Axis == axis::horizontal or Axis == axis::vertical);
44 static constexpr hi::axis axis = Axis;
73 template<
typename Widget,
typename... Args>
76 auto tmp = std::make_unique<Widget>(
this, std::forward<Args>(args)...);
79 ++global_counter<
"row_column_widget:make_widget:constrain">;
90 ++global_counter<
"row_column_widget:clear:constrain">;
95 [[nodiscard]] generator<widget *> children() const noexcept
override
97 for (
hilet& child : _children) {
102 widget_constraints
const& set_constraints(set_constraints_context
const& context)
noexcept override
108 auto minimum_thickness = 0.0f;
109 auto preferred_thickness = 0.0f;
110 auto maximum_thickness = 0.0f;
111 float margin_before_thickness = 0.0f;
112 float margin_after_thickness = 0.0f;
113 widget_baseline baseline = {};
115 _grid_layout.
clear();
116 for (
hilet& child : _children) {
117 update_constraints_for_child(
124 margin_before_thickness,
125 margin_after_thickness,
132 if constexpr (axis == axis::row) {
133 return _constraints = {
134 {_grid_layout.
minimum(), minimum_thickness},
135 {_grid_layout.
preferred(), preferred_thickness},
136 {_grid_layout.
maximum(), maximum_thickness},
137 {_grid_layout.margin_before(),
138 margin_before_thickness,
139 _grid_layout.margin_after(),
140 margin_after_thickness},
143 return _constraints = {
144 {minimum_thickness, _grid_layout.
minimum()},
145 {preferred_thickness, _grid_layout.
preferred()},
146 {maximum_thickness, _grid_layout.
maximum()},
147 {margin_before_thickness,
148 _grid_layout.margin_before(),
149 margin_after_thickness,
150 _grid_layout.margin_after()}};
154 void set_layout(widget_layout
const& context)
noexcept override
157 _grid_layout.
layout(axis == axis::row ? context.width() : context.height());
161 for (
hilet& child : _children) {
162 update_layout_for_child(*child, index++, context);
168 void draw(draw_context
const& context)
noexcept override
171 for (
hilet& child : _children) {
172 child->draw(context);
177 hitbox hitbox_test(point3 position)
const noexcept override
183 for (
hilet& child : _children) {
184 r = child->hitbox_test_from_parent(position, r);
194 grid_layout _grid_layout;
196 void update_constraints_for_child(
197 set_constraints_context
const& context,
200 float& minimum_thickness,
201 float& preferred_thickness,
202 float& maximum_thickness,
203 float& margin_before_thickness,
204 float& margin_after_thickness,
205 widget_baseline& baseline)
noexcept
209 hilet& child_constraints = child.set_constraints(context);
210 if (axis == axis::row) {
211 _grid_layout.add_constraint(
213 child_constraints.minimum.width(),
214 child_constraints.preferred.width(),
215 child_constraints.maximum.width(),
216 child_constraints.margins.left(),
217 child_constraints.margins.right());
219 inplace_max(minimum_thickness, child_constraints.minimum.height());
220 inplace_max(preferred_thickness, child_constraints.preferred.height());
221 inplace_max(maximum_thickness, child_constraints.maximum.height());
222 inplace_max(margin_before_thickness, child_constraints.margins.top());
223 inplace_max(margin_after_thickness, child_constraints.margins.bottom());
224 inplace_max(baseline, child_constraints.baseline);
227 _grid_layout.add_constraint(
229 child_constraints.minimum.height(),
230 child_constraints.preferred.height(),
231 child_constraints.maximum.height(),
232 child_constraints.margins.top(),
233 child_constraints.margins.bottom(),
234 child_constraints.baseline);
236 inplace_max(minimum_thickness, child_constraints.minimum.width());
237 inplace_max(preferred_thickness, child_constraints.preferred.width());
238 inplace_max(maximum_thickness, child_constraints.maximum.width());
239 inplace_max(margin_before_thickness, child_constraints.margins.left());
240 inplace_max(margin_after_thickness, child_constraints.margins.right());
244 void update_layout_for_child(
widget& child,
ssize_t index, widget_layout
const& context)
const noexcept
248 hilet[child_position, child_length] = _grid_layout.get_position_and_size(index);
250 if (axis == axis::row) {
251 auto x0 = context.left_to_right() ? child_position :
layout().width() - child_position - child_length;
253 hilet child_rectangle = aarectangle{x0, 0.0f, child_length,
layout().height()};
255 child.set_layout(context.transform(child_rectangle, 0.0f));
258 hilet child_rectangle =
259 aarectangle{0.0f,
layout().height() - child_position - child_length,
layout().width(), child_length};
260 child.set_layout(context.transform(child_rectangle, 0.0f, _grid_layout.get_baseline(index)));