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;
95 if (to_bool(
label->icon) and to_bool(
label->text)) {
97 if (resolved_alignment == horizontal_alignment::left) {
99 _grid.add_cell(0, 0, _icon_widget.get());
100 _grid.add_cell(1, 0, _text_widget.get(),
true);
101 }
else if (resolved_alignment == horizontal_alignment::right) {
103 _grid.add_cell(0, 0, _text_widget.get(),
true);
104 _grid.add_cell(1, 0, _icon_widget.get());
105 }
else if (resolved_alignment == vertical_alignment::top) {
108 _grid.add_cell(0, 0, _icon_widget.get());
109 _grid.add_cell(0, 1, _text_widget.get(),
true);
110 }
else if (resolved_alignment == vertical_alignment::bottom) {
113 _grid.add_cell(0, 0, _text_widget.get(),
true);
114 _grid.add_cell(0, 1, _icon_widget.get());
116 hi_no_default(
"alignment is not allowed to be middle-center.");
118 }
else if (to_bool(
label->icon)) {
120 _grid.add_cell(0, 0, _icon_widget.get());
121 }
else if (to_bool(
label->text)) {
123 _grid.add_cell(0, 0, _text_widget.get());
127 (resolved_alignment == horizontal_alignment::center or resolved_alignment == horizontal_alignment::justified) ?
128 theme<prefix>.size(
this) :
129 extent2i{theme<prefix>.line_height(
this), theme<prefix>.line_height(
this)};
131 _icon_widget->minimum = icon_size;
132 _icon_widget->maximum = icon_size;
134 for (
auto& cell : _grid) {
135 cell.set_constraints(cell.value->update_constraints());
138 return _grid.constraints(os_settings::left_to_right());
141 void set_layout(widget_layout
const& context)
noexcept override
144 _grid.set_layout(context.shape, theme<prefix>.cap_height(
this));
147 for (
hilet& cell : _grid) {
148 cell.value->set_layout(context.transform(cell.shape, 0.0f));
152 void draw(widget_draw_context& context)
noexcept override
155 for (
hilet& cell : _grid) {
156 cell.value->draw(context);
161 [[nodiscard]] hitbox hitbox_test(point2i position)
const noexcept override
166 return _text_widget->hitbox_test_from_parent(position);
176 decltype(
label)::callback_token _label_cbt;
177 decltype(
alignment)::callback_token _alignment_cbt;
181 grid_layout<widget *> _grid;
183 void set_attributes() noexcept {}
184 void set_attributes(label_widget_attribute
auto&& first, label_widget_attribute
auto&&...rest)
noexcept
186 if constexpr (forward_of<
decltype(first), observer<hi::label>>) {
188 }
else if constexpr (forward_of<
decltype(first), observer<hi::alignment>>) {
201 _icon_widget = std::make_unique<icon_widget<prefix>>(
this,
label.get<
"icon">());
202 _text_widget = std::make_unique<text_widget<prefix>>(
this,
label.get<
"text">());
204 _text_widget->mode =
mode;
206 _alignment_cbt =
alignment.subscribe([
this](
auto...) {
207 if (
alignment == horizontal_alignment::center or
alignment == horizontal_alignment::justified) {
208 _icon_widget->alignment = hi::alignment::middle_center();
213 (*_alignment_cbt)(*alignment);