Mercurial > molko
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 |
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 | 40 #include "button.h" |
619
b8fd5c112538
ui: simplify checkbox
David Demelier <markand@malikania.fr>
parents:
618
diff
changeset
|
41 #include "checkbox.h" |
616 | 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 | 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 | 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 | 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 | 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 | 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 | 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 } |