39 observer<icon>
icon = hi::icon{};
43 observer<color>
color = color::foreground();
47 observer<alignment>
alignment = hi::alignment::middle_center();
52 set_attributes(hi_forward(attributes)...);
55 void set_attributes() noexcept {}
56 void set_attributes(icon_widget_attribute
auto&& first, icon_widget_attribute
auto&&...rest)
noexcept
58 if constexpr (forward_of<
decltype(first), observer<hi::icon>>) {
59 icon = hi_forward(first);
60 }
else if constexpr (forward_of<
decltype(first), observer<hi::alignment>>) {
62 }
else if constexpr (forward_of<
decltype(first), observer<hi::color>>) {
63 color = hi_forward(first);
65 hi_static_no_default();
67 set_attributes(hi_forward(rest)...);
75 if (_icon_has_modified.exchange(
false)) {
76 _icon_type = icon_type::no;
81 if (hilet pixmap = std::get_if<hi::pixmap<sfloat_rgba16>>(&
icon.read())) {
82 _icon_type = icon_type::pixmap;
85 if (not(_pixmap_backing = gfx_pipeline_image::paged_image{surface(), *pixmap})) {
87 _icon_has_modified =
true;
88 ++global_counter<
"icon_widget:no-backing-image:constrain">;
92 }
else if (hilet g1 = std::get_if<font_book::font_glyph_type>(&
icon.read())) {
94 _icon_type = icon_type::glyph;
96 _glyph.get_metrics().bounding_rectangle.size() * theme().text_style(semantic_text_style::label)->size * theme().scale;
98 }
else if (hilet g2 = std::get_if<elusive_icon>(&
icon.read())) {
100 _icon_type = icon_type::glyph;
102 _glyph.get_metrics().bounding_rectangle.size() * theme().text_style(semantic_text_style::label)->size * theme().scale;
104 }
else if (hilet g3 = std::get_if<hikogui_icon>(&
icon.read())) {
106 _icon_type = icon_type::glyph;
108 _glyph.get_metrics().bounding_rectangle.size() * theme().text_style(semantic_text_style::label)->size * theme().scale;
112 hilet resolved_alignment = resolve(*
alignment, os_settings::left_to_right());
113 hilet icon_constraints = box_constraints{
118 theme().margin<
float>()};
121 void set_layout(widget_layout
const& context)
noexcept override
124 if (_icon_type == icon_type::no or not _icon_size) {
125 _icon_rectangle = {};
127 hilet width = std::clamp(context.shape.width(),
minimum->width(),
maximum->width());
128 hilet height = std::clamp(context.shape.height(),
minimum->height(),
maximum->height());
132 hilet resolved_alignment = resolve(*
alignment, os_settings::left_to_right());
133 _icon_rectangle =
align(context.rectangle(), new_icon_size, resolved_alignment);
137 void draw(draw_context
const& context)
noexcept override
140 switch (_icon_type) {
144 case icon_type::pixmap:
145 if (not context.draw_image(
layout(), _icon_rectangle, _pixmap_backing)) {
151 case icon_type::glyph:
153 context.draw_glyph(
layout(), _icon_rectangle, _glyph, theme().
color(*
color));
164 enum class icon_type { no, glyph, pixmap };
166 icon_type _icon_type;
167 font_book::font_glyph_type _glyph;
168 gfx_pipeline_image::paged_image _pixmap_backing;
169 decltype(
icon)::callback_token _icon_cbt;
170 std::atomic<bool> _icon_has_modified =
true;
173 aarectangle _icon_rectangle;
177 _icon_cbt =
icon.subscribe([
this](
auto...) {
178 _icon_has_modified =
true;
179 ++global_counter<
"icon_widget:icon:constrain">;
hi_export auto find_glyph(font const &font, grapheme grapheme) noexcept
Find a glyph using the given code-point.
Definition font_book.hpp:437