annotate libmlk-ui/mlk/ui/ui.c @ 624:bbf30f167274

ui: improve button documentation
author David Demelier <markand@malikania.fr>
date Wed, 23 Aug 2023 21:20:16 +0200
parents b8fd5c112538
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * ui.c -- libui convenient header
c3a40062acc2 misc: create more generic startup function, closes #2500
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>
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
600
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
19 #include "sysconfig.h"
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
20
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
21 #include <assert.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
22 #include <stddef.h>
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
23 #include <string.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
24
600
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
25 #include <libintl.h>
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
26
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
27 #include <SDL.h>
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
28
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
29 #include <mlk/core/err.h>
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
30 #include <mlk/core/event.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
31 #include <mlk/core/font.h>
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
32 #include <mlk/core/texture.h>
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
33 #include <mlk/core/trace.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
34 #include <mlk/core/util.h>
600
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
35 #include <mlk/core/sys.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
36
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
37 #include <assets/fonts/opensans-regular.h>
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
38
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
39 #include "align.h"
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 616
diff changeset
40 #include "button.h"
619
b8fd5c112538 ui: simplify checkbox
David Demelier <markand@malikania.fr>
parents: 618
diff changeset
41 #include "checkbox.h"
616
dae4cdc6a984 ui: simplify frame
David Demelier <markand@malikania.fr>
parents: 614
diff changeset
42 #include "frame.h"
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
43 #include "label.h"
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 #include "ui.h"
587
c027304ced27 misc: add NLS for ui/rpg
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
45 #include "ui_p.h"
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
47 /* Default font catalog. */
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
48 #define FONT_DEF(b, s, i) \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
49 { \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
50 .data = b, \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
51 .datasz = sizeof (b), \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
52 .size = s, \
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
53 .font = &mlk_ui_fonts[i] \
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
54 }
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
55
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
56 static struct font_def {
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
57 const unsigned char *data;
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
58 const size_t datasz;
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
59 unsigned int size;
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
60 struct mlk_font *font;
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
61 } fonts[MLK_UI_FONT_LAST] = {
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
62 FONT_DEF(assets_fonts_opensans_regular, 14, MLK_UI_FONT_INTERFACE)
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
63 };
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
64
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
65 /* Global fonts. */
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
66 struct mlk_font mlk_ui_fonts[MLK_UI_FONT_LAST] = {};
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
67
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
68 int
497
8d5a266a1774 ui: ui -> mlk_ui
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
69 mlk_ui_init(void)
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 {
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
71 struct font_def *def;
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
72
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
73 /* Open all fonts and set the appropriate pointer address. */
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
74 for (size_t i = 0; i < MLK_UTIL_SIZE(fonts); ++i) {
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
75 def = &fonts[i];
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
76
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
77 if (mlk_font_openmem(def->font, def->data, def->datasz, def->size) < 0) {
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
78 mlk_ui_finish();
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
79 return -1;
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
80 }
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
81 }
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
82
600
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
83 #if defined(MLK_WITH_NLS)
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
84 bindtextdomain("libmlk-ui", mlk_sys_dir(MLK_SYS_DIR_LOCALES));
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
85 #endif
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
86
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
87 return 0;
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 }
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 void
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
91 mlk_ui_handle(const union mlk_event *ev)
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
92 {
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
93 if (ev->type == MLK_EVENT_THEME)
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
94 mlk_ui_set_theme(ev->theme.theme);
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
95 }
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
96
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
97 void
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
98 mlk_ui_set_theme(enum mlk_window_theme theme)
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
99 {
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
100 if (theme == MLK_WINDOW_THEME_DARK) {
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 616
diff changeset
101 mlk_button_style = &mlk_button_style_dark;
619
b8fd5c112538 ui: simplify checkbox
David Demelier <markand@malikania.fr>
parents: 618
diff changeset
102 mlk_checkbox_style = &mlk_checkbox_style_dark;
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 616
diff changeset
103 mlk_frame_style = &mlk_frame_style_dark;
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
104 mlk_label_style = &mlk_label_style_dark;
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
105 } else {
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 616
diff changeset
106 mlk_button_style = &mlk_button_style_light;
619
b8fd5c112538 ui: simplify checkbox
David Demelier <markand@malikania.fr>
parents: 618
diff changeset
107 mlk_checkbox_style = &mlk_checkbox_style_light;
618
509b395171f2 ui: simplify button
David Demelier <markand@malikania.fr>
parents: 616
diff changeset
108 mlk_frame_style = &mlk_frame_style_light;
614
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
109 mlk_label_style = &mlk_label_style_light;
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
110 }
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
111 }
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
112
281608524dd1 misc: implement dark/light theming
David Demelier <markand@malikania.fr>
parents: 603
diff changeset
113 void
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
114 mlk_ui_draw_text(enum mlk_align align,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
115 struct mlk_font *font,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
116 unsigned long color,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
117 const char *text,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
118 int px,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
119 int py,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
120 unsigned int pw,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
121 unsigned int ph)
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
122 {
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
123 assert(font);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
124 assert(text && strlen(text) > 0);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
125
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
126 struct mlk_texture texture;
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
127 int x, y;
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
128
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
129 if (mlk_font_render(font, &texture, text, color) < 0)
587
c027304ced27 misc: add NLS for ui/rpg
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
130 mlk_tracef(_("unable to render text: %s"), mlk_err());
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
131 else {
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
132 mlk_align(align, &x, &y, texture.w, texture.h, px, py, pw, ph);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
133 mlk_texture_draw(&texture, x, y);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
134 mlk_texture_finish(&texture);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
135 }
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
136 }
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
137
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
138 void
497
8d5a266a1774 ui: ui -> mlk_ui
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
139 mlk_ui_finish(void)
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 {
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 }