27class window_controls_win32_widget final :
public widget {
38 hilet size =
extent2{theme().large_size() * 3.0f, theme().large_size()};
39 return {size, size, size};
42 void set_layout(
widget_layout const& context)
noexcept override
45 auto extent = context.size();
46 if (extent.height() > floor_cast<int>(theme().large_size() * 1.2f)) {
47 extent =
extent2{extent.width(), theme().large_size()};
49 auto y = context.height() - extent.height();
52 aarectangle{point2(extent.width() * 2.0f / 3.0f, y),
extent2{extent.width() * 1.0f / 3.0f, extent.height()}};
55 aarectangle{point2(extent.width() * 1.0f / 3.0f, y),
extent2{extent.width() * 1.0f / 3.0f, extent.height()}};
57 minimizeRectangle =
aarectangle{point2(0.0f, y),
extent2{extent.width() * 1.0f / 3.0f, extent.height()}};
59 closeWindowGlyph = find_glyph(hikogui_icon::CloseWindow);
60 minimizeWindowGlyph = find_glyph(hikogui_icon::MinimizeWindow);
61 maximizeWindowGlyph = find_glyph(hikogui_icon::MaximizeWindowMS);
62 restoreWindowGlyph = find_glyph(hikogui_icon::RestoreWindowMS);
63 hilet glyph_size = theme().icon_size();
65 hilet closeWindowGlyphBB = closeWindowGlyph.get_metrics().bounding_rectangle * glyph_size;
66 hilet minimizeWindowGlyphBB = minimizeWindowGlyph.get_metrics().bounding_rectangle * glyph_size;
67 hilet maximizeWindowGlyphBB = maximizeWindowGlyph.get_metrics().bounding_rectangle * glyph_size;
68 hilet restoreWindowGlyphBB = restoreWindowGlyph.get_metrics().bounding_rectangle * glyph_size;
70 closeWindowGlyphRectangle = align(closeRectangle, closeWindowGlyphBB, alignment::middle_center());
71 minimizeWindowGlyphRectangle = align(minimizeRectangle, minimizeWindowGlyphBB, alignment::middle_center());
72 maximizeWindowGlyphRectangle = align(maximizeRectangle, maximizeWindowGlyphBB, alignment::middle_center());
73 restoreWindowGlyphRectangle = align(maximizeRectangle, restoreWindowGlyphBB, alignment::middle_center());
81 context.draw_box(
layout(), closeRectangle,
color{1.0f, 0.0f, 0.0f});
82 }
else if (hoverClose) {
83 context.draw_box(
layout(), closeRectangle,
color{0.5f, 0.0f, 0.0f});
88 if (pressedMinimize) {
90 }
else if (hoverMinimize) {
96 if (pressedMaximize) {
98 }
else if (hoverMaximize) {
104 hilet glyph_color = context.active ? label_color() : foreground_color();
106 context.draw_glyph(
layout(), translate_z(0.1f) * closeWindowGlyphRectangle, closeWindowGlyph, glyph_color);
107 context.draw_glyph(
layout(), translate_z(0.1f) * minimizeWindowGlyphRectangle, minimizeWindowGlyph, glyph_color);
108 if (
layout().window_size_state == gui_window_size::maximized) {
109 context.draw_glyph(
layout(), translate_z(0.1f) * restoreWindowGlyphRectangle, restoreWindowGlyph, glyph_color);
111 context.draw_glyph(
layout(), translate_z(0.1f) * maximizeWindowGlyphRectangle, maximizeWindowGlyph, glyph_color);
116 bool handle_event(
gui_event const& event)
noexcept override
118 switch (event.
type()) {
119 case gui_event_type::mouse_move:
120 case gui_event_type::mouse_drag:
123 auto state_has_changed =
false;
127 if (state_has_changed) {
133 case gui_event_type::mouse_exit:
135 hoverMinimize =
false;
136 hoverMaximize =
false;
140 case gui_event_type::mouse_down:
145 }
else if (minimizeRectangle.contains(event.
mouse().
position)) {
146 pressedMinimize =
true;
148 }
else if (maximizeRectangle.contains(event.
mouse().
position)) {
149 pressedMaximize =
true;
156 case gui_event_type::mouse_up:
158 pressedClose =
false;
159 pressedMinimize =
false;
160 pressedMaximize =
false;
166 }
else if (minimizeRectangle.contains(event.
mouse().
position)) {
169 }
else if (maximizeRectangle.contains(event.
mouse().
position)) {
170 switch (
layout().window_size_state) {
171 case gui_window_size::normal:
174 case gui_window_size::maximized:
190 [[nodiscard]] hitbox hitbox_test(point2 position)
const noexcept override
192 hi_axiom(loop::main().on_thread());
195 (closeRectangle.contains(position) or minimizeRectangle.contains(position) or maximizeRectangle.contains(position))) {
196 return hitbox{
id, _layout.elevation, hitbox_type::button};
207 font_book::font_glyph_type closeWindowGlyph;
208 font_book::font_glyph_type minimizeWindowGlyph;
209 font_book::font_glyph_type maximizeWindowGlyph;
210 font_book::font_glyph_type restoreWindowGlyph;
217 bool hoverClose =
false;
218 bool hoverMinimize =
false;
219 bool hoverMaximize =
false;
221 bool pressedClose =
false;
222 bool pressedMinimize =
false;
223 bool pressedMaximize =
false;