91 [[nodiscard]] generator<widget_intf &> children(
bool include_invisible)
noexcept override
93 co_yield *_icon_widget;
94 co_yield *_text_widget;
102 auto const resolved_alignment = resolve(*
alignment,
true);
105 if (to_bool(
label->icon) and to_bool(
label->text)) {
109 _grid.add_cell(0, 0, _icon_widget.get());
110 _grid.add_cell(1, 0, _text_widget.get(),
true);
113 _grid.add_cell(0, 0, _text_widget.get(),
true);
114 _grid.add_cell(1, 0, _icon_widget.get());
118 _grid.add_cell(0, 0, _icon_widget.get());
119 _grid.add_cell(0, 1, _text_widget.get(),
true);
123 _grid.add_cell(0, 0, _text_widget.get(),
true);
124 _grid.add_cell(0, 1, _icon_widget.get());
126 hi_no_default(
"alignment is not allowed to be middle-center.");
128 }
else if (to_bool(
label->icon)) {
130 _grid.add_cell(0, 0, _icon_widget.get());
131 }
else if (to_bool(
label->text)) {
133 _grid.add_cell(0, 0, _text_widget.get());
136 auto const label_style = theme().text_style_set()[{phrasing::regular}];
137 auto const icon_size =
139 theme().large_icon_size() :
140 (label_style.size() * theme().
pixel_density).in(unit::pixels_per_em);
142 _icon_widget->minimum = extent2{icon_size, icon_size};
143 _icon_widget->maximum = extent2{icon_size, icon_size};
145 for (
auto& cell : _grid) {
146 cell.set_constraints(cell.value->update_constraints());
149 return _grid.constraints(os_settings::left_to_right());
151 void set_layout(widget_layout
const& context)
noexcept override
154 _grid.set_layout(context.shape, theme().baseline_adjustment());
157 for (
auto const& cell : _grid) {
162 void draw(draw_context
const& context)
noexcept override
165 for (
auto const& cell : _grid) {
166 cell.value->draw(context);
171 [[nodiscard]] hitbox hitbox_test(point2 position)
const noexcept override
173 hi_axiom(loop::main().on_thread());
176 return _text_widget->hitbox_test_from_parent(position);
186 std::unique_ptr<icon_widget> _icon_widget;
187 std::unique_ptr<text_widget> _text_widget;
188 grid_layout<widget *> _grid;
190 callback<void(hi::label)> _label_cbt;
191 callback<void(hi::alignment)> _alignment_cbt;
193 void set_attributes() noexcept {}
195 template<label_widget_attribute First, label_widget_attribute... Rest>
196 void set_attributes(First&& first, Rest&&...rest)
noexcept
198 if constexpr (forward_of<First, observer<hi::label>>) {
200 }
else if constexpr (forward_of<First, observer<hi::alignment>>) {
202 }
else if constexpr (forward_of<First, observer<hi::phrasing>>) {
205 hi_static_no_default();
215 _icon_widget = std::make_unique<icon_widget>(
label.sub<
"icon">());
216 _icon_widget->set_parent(
this);
219 _text_widget = std::make_unique<text_widget>(
label.sub<
"text">());
220 _text_widget->set_parent(
this);
222 _text_widget->set_mode(mode());
224 _alignment_cbt =
alignment.subscribe([
this](
auto...) {
226 _icon_widget->alignment = hi::alignment::middle_center();