45 constexpr static auto prefix = Name /
"label";
68 observer<alignment>
alignment = hi::alignment::top_flush();
83 [[nodiscard]] generator<widget const&> children(
bool include_invisible)
const noexcept override
85 co_yield *_icon_widget;
86 co_yield *_text_widget;
89 void layout() noexcept
override
94 if (to_bool(
label->icon) and to_bool(
label->text)) {
96 if (resolved_alignment == horizontal_alignment::left) {
98 cell.set_child(_icon_widget.cell, 0, 0);
99 cell.set_child(_text_widget.cell, 1, 0);
101 }
else if (resolved_alignment == horizontal_alignment::right) {
103 cell.set_child(_text_widget.cell, 0, 0);
104 cell.set_child(_icon_widget.cell, 1, 0);
106 }
else if (resolved_alignment == vertical_alignment::top) {
109 cell.set_child(_icon_widget.cell, 0, 0);
110 cell.set_child(_text_widget.cell, 0, 1);
112 }
else if (resolved_alignment == vertical_alignment::bottom) {
115 cell.set_child(_text_widget.cell, 0, 0);
116 cell.set_child(_icon_widget.cell, 0, 1);
119 hi_no_default(
"alignment is not allowed to be middle-center.");
121 }
else if (to_bool(
label->icon)) {
123 cell.set_child(_icon_widget.cell, 0, 0);
125 }
else if (to_bool(
label->text)) {
127 cell.set_child(_text_widget.cell, 0, 0);
131 (resolved_alignment == horizontal_alignment::center or resolved_alignment == horizontal_alignment::justified) ?
132 theme<prefix>.size(
this) :
133 extent2{theme<prefix>.line_height(
this), theme<prefix>.line_height(
this)};
135 _icon_widget->minimum = icon_size;
136 _icon_widget->maximum = icon_size;
139 void draw(widget_draw_context& context)
noexcept override
142 _icon_widget->draw(context);
143 _text_widget->draw(context);
147 [[nodiscard]] hitbox hitbox_test(point2 position)
const noexcept override
150 return _text_widget->hitbox_test(position);
160 decltype(
label)::callback_token _label_cbt;
161 decltype(
alignment)::callback_token _alignment_cbt;
165 grid_layout<widget *> _grid;
167 void set_attributes() noexcept {}
168 void set_attributes(label_widget_attribute
auto&& first, label_widget_attribute
auto&&...rest)
noexcept
170 if constexpr (forward_of<
decltype(first), observer<hi::label>>) {
172 }
else if constexpr (forward_of<
decltype(first), observer<hi::alignment>>) {
185 _icon_widget = std::make_unique<icon_widget<prefix>>(
this,
label.get<
"icon">());
186 _text_widget = std::make_unique<text_widget<prefix>>(
this,
label.get<
"text">());
188 _text_widget->mode =
mode;
190 _alignment_cbt =
alignment.subscribe([
this](
auto...) {
191 if (
alignment == horizontal_alignment::center or
alignment == horizontal_alignment::justified) {
192 _icon_widget->alignment = hi::alignment::middle_center();
197 (*_alignment_cbt)(*alignment);