annotate libmlk-ui/mlk/ui/button.c @ 646:7e1eb7f6c049 default tip @

misc: remove .clang
author David Demelier <markand@malikania.fr>
date Sun, 04 Feb 2024 15:24:37 +0100
parents 509b395171f2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * button.c -- GUI button
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
445
773a082f0b91 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 433
diff changeset
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr>
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
152
1008a796a9e7 ui: make UI widgets usable as actions
David Demelier <markand@malikania.fr>
parents: 151
diff changeset
20 #include <string.h>
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
22 #include <mlk/core/color.h>
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
23 #include <mlk/core/event.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
24 #include <mlk/core/maths.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
25 #include <mlk/core/painter.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 411
diff changeset
26 #include <mlk/core/trace.h>
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
27
152
1008a796a9e7 ui: make UI widgets usable as actions
David Demelier <markand@malikania.fr>
parents: 151
diff changeset
28 #include "align.h"
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "button.h"
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
30 #include "ui.h"
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
31 #include "ui_p.h"
151
b19d076856d2 ui: cleanup theme module, closes #2498
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
32
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
33 static inline int
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
34 is_boxed(const struct mlk_button *button, const struct mlk_event_click *click)
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
35 {
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
36 assert(button);
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
37 assert(click);
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
38 assert(click->type == MLK_EVENT_CLICKDOWN || click->type == MLK_EVENT_CLICKUP);
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
39
528
95792046d3d2 core: doxygenize maths
David Demelier <markand@malikania.fr>
parents: 520
diff changeset
40 return mlk_maths_is_boxed(click->x, click->y,
95792046d3d2 core: doxygenize maths
David Demelier <markand@malikania.fr>
parents: 520
diff changeset
41 button->x, button->y, button->w, button->h);
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
42 }
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
43
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
44 static void
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
45 draw_frame(struct mlk_button_style *self, struct mlk_button *button)
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
46 {
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
47 unsigned long background = self->background;
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
48 unsigned long border = self->border;
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
49
520
7e7c6786d21e ui: button has now pressed style attributes
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
50 if (button->pressed) {
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
51 background = mlk_color_darken(background, 0.9);
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
52 border = mlk_color_darken(border, 0.9);
520
7e7c6786d21e ui: button has now pressed style attributes
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
53 }
7e7c6786d21e ui: button has now pressed style attributes
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
54
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
55 mlk_painter_set_color(border);
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
56 mlk_painter_draw_rectangle(button->x, button->y, button->w, button->h);
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
57 mlk_painter_set_color(background);
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
58 mlk_painter_draw_rectangle(
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
59 button->x + self->border_size,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
60 button->y + self->border_size,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
61 button->w - (self->border_size * 2),
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
62 button->h - (self->border_size * 2)
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
63 );
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
64 }
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
65
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
66 static void
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
67 draw_text(struct mlk_button_style *style, struct mlk_button *button)
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
68 {
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
69 mlk_ui_draw_text(
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
70 MLK_ALIGN_CENTER,
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
71 MLK__STYLE_FONT(style->font, MLK_UI_FONT_INTERFACE),
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
72 style->color,
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
73 button->text,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
74 button->x,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
75 button->y,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
76 button->w,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
77 button->h
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
78 );
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
79 }
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
80
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
81 struct mlk_button_style mlk_button_style_dark = {
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
82 .background = 0x222323ff,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
83 .border = 0x141414ff,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
84 .border_size = 2,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
85 .color = 0xffffffff,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
86 .draw_frame = draw_frame,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
87 .draw_text = draw_text
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
88 };
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
89
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
90 struct mlk_button_style mlk_button_style_light = {
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
91 .background = 0xf5f7faff,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
92 .border = 0xcdd2daff,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
93 .border_size = 2,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
94 .color = 0x000000ff,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
95 .draw_frame = draw_frame,
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
96 .draw_text = draw_text
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
97 };
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
98
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
99 struct mlk_button_style *mlk_button_style = &mlk_button_style_light;
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
100
409
6011ad866e99 ui: delete action functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
101 int
488
441c37e7474f ui: button -> mlk_button
David Demelier <markand@malikania.fr>
parents: 487
diff changeset
102 mlk_button_handle(struct mlk_button *button, const union mlk_event *ev)
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 assert(button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 assert(ev);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
107 int active = 0;
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
108
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 switch (ev->type) {
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
110 case MLK_EVENT_CLICKDOWN:
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 if (is_boxed(button, &ev->click))
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
112 button->pressed = 1;
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 break;
450
b26dd49f69ff core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
114 case MLK_EVENT_CLICKUP:
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 /*
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 * If the button was pressed, indicate that the button is
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 * finally activated. This let the user to move the cursor
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 * outside the button to "forget" the press.
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 */
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
120 button->pressed = 0;
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
121
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
122 if (is_boxed(button, &ev->click))
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
123 active = 1;
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 break;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 default:
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 break;
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 }
409
6011ad866e99 ui: delete action functions
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
128
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
129 return active;
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 void
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
133 mlk_button_update(struct mlk_button *button, unsigned int ticks)
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 assert(button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
137 MLK__STYLE_CALL(button->style, mlk_button_style, update, button, ticks);
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 }
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 void
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
141 mlk_button_draw(struct mlk_button *button)
99
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 {
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 assert(button);
4ac71ac10c9f core: start adding some UI elements
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
145 MLK__STYLE_CALL(button->style, mlk_button_style, draw_frame, button);
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
146
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
147 if (button->text)
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
148 MLK__STYLE_CALL(button->style, mlk_button_style, draw_text, button);
502
ab2816f9551c ui: start reworking on styles
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
149 }