36 constexpr static auto prefix = Name /
"icon";
40 observer<icon>
icon = hi::icon{};
44 observer<alignment>
alignment = hi::alignment::middle_center();
54 void set_attributes() noexcept {}
55 void set_attributes(icon_widget_attribute
auto&& first, icon_widget_attribute
auto&&...rest)
noexcept
57 if constexpr (forward_of<
decltype(first), observer<hi::icon>>) {
59 }
else if constexpr (forward_of<
decltype(first), observer<hi::alignment>>) {
68 void layout() noexcept
override
70 if (_icon_has_modified.
exchange(
false)) {
71 _icon_type = icon_type::no;
76 _icon_type = icon_type::pixmap;
78 hilet preferred =
extent2{narrow_cast<float>(pixmap->width()), narrow_cast<float>(pixmap->height())};
79 cell.set_constraints(minimum, preferred, maximum);
81 if (_pixmap_backing = paged_image{
surface, *pixmap}; not _pixmap_backing) {
83 _icon_has_modified =
true;
84 ++global_counter<
"icon_widget:no-backing-image:constrain">;
88 }
else if (
hilet g1 = std::get_if<font_book::font_glyph_type>(&
icon.read())) {
90 _icon_type = icon_type::glyph;
91 hilet preferred =
ceil(_glyph.get_bounding_rectangle().size() * theme<prefix>.line_height(
this));
92 cell.set_constraints(minimum, preferred, maximum);
94 }
else if (
hilet g2 = std::get_if<elusive_icon>(&
icon.read())) {
96 _icon_type = icon_type::glyph;
97 hilet preferred =
ceil(_glyph.get_bounding_rectangle().size() * theme<prefix>.line_height(
this));
98 cell.set_constraints(minimum, preferred, maximum);
100 }
else if (
hilet g3 = std::get_if<hikogui_icon>(&
icon.read())) {
102 _icon_type = icon_type::glyph;
103 hilet preferred =
ceil(_glyph.get_bounding_rectangle().size() * theme<prefix>.line_height(
this));
104 cell.set_constraints(minimum, preferred, maximum);
108 cell.set_margin(theme<prefix>.margin(
this));
111 void draw(widget_draw_context& context)
noexcept override
114 switch (_icon_type) {
118 case icon_type::pixmap:
120 hilet image_size =
extent2{narrow_cast<float>(pixmap->width()), narrow_cast<float>(pixmap->height())};
121 hilet S = scale2::uniform(image_size, cell.size());
122 hilet icon_rectangle = aarectangle{S * image_size};
123 hilet T = translate2::align(icon_rectangle, cell.rectangle(), resolve(*
alignment));
126 if (not context.draw_image(
rectangle, _pixmap_backing))
134 case icon_type::glyph:
136 hilet image_size = _glyph.get_bounding_rectangle().size();
137 hilet S = scale2::uniform(image_size, cell.size());
138 hilet icon_rectangle = aarectangle{S * image_size};
139 hilet T = translate2::align(icon_rectangle, cell.rectangle(), resolve(*
alignment));
142 context.draw_glyph(
rectangle, *_glyph.font, _glyph.glyph, theme<prefix>.fill_color(
this));
153 enum class icon_type { no, glyph, pixmap };
155 icon_type _icon_type;
156 font_book::font_glyph_type _glyph;
157 paged_image _pixmap_backing;
158 decltype(
icon)::callback_token _icon_cbt;
163 _icon_cbt =
icon.subscribe([
this](
auto...) {
164 _icon_has_modified =
true;
#define hi_no_default(...)
This part of the code should not be reachable, unless a programming bug.
Definition assert.hpp:279
auto find_glyph(font const &font, grapheme grapheme) noexcept
Find a glyph using the given code-point.
Definition font_book.hpp:223