annotate libmlk-ui/mlk/ui/ui.c @ 609:d97674d33764

ui: grid menu be more flexible
author David Demelier <markand@malikania.fr>
date Fri, 11 Aug 2023 18:01:28 +0200
parents ed1d3244ed57
children 281608524dd1
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
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
27 #include <mlk/core/err.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
28 #include <mlk/core/font.h>
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
29 #include <mlk/core/texture.h>
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
30 #include <mlk/core/trace.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
31 #include <mlk/core/util.h>
600
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
32 #include <mlk/core/sys.h>
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
33
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
34 #include <assets/fonts/opensans-regular.h>
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
35
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
36 #include "align.h"
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include "ui.h"
587
c027304ced27 misc: add NLS for ui/rpg
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
38 #include "ui_p.h"
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
40 /* Default font catalog. */
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
41 #define FONT_DEF(b, s, i) \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
42 { \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
43 .data = b, \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
44 .datasz = sizeof (b), \
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
45 .size = s, \
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
46 .font = &mlk_ui_fonts[i] \
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
47 }
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
48
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
49 static struct font_def {
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
50 const unsigned char *data;
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
51 const size_t datasz;
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
52 unsigned int size;
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
53 struct mlk_font *font;
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
54 } fonts[MLK_UI_FONT_LAST] = {
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
55 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
56 };
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
57
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
58 struct mlk_font mlk_ui_fonts[MLK_UI_FONT_LAST] = {0};
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
59
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
60 int
497
8d5a266a1774 ui: ui -> mlk_ui
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
61 mlk_ui_init(void)
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 {
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
63 struct font_def *def;
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
64
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
65 /* Open all fonts and set the appropriate pointer address. */
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
66 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
67 def = &fonts[i];
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
68
603
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
69 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
70 mlk_ui_finish();
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
71 return -1;
ed1d3244ed57 ui: start re-working delegates
David Demelier <markand@malikania.fr>
parents: 600
diff changeset
72 }
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
73 }
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
74
600
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
75 #if defined(MLK_WITH_NLS)
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
76 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
77 #endif
23bbe3f71dbd misc: enable NLS back in
David Demelier <markand@malikania.fr>
parents: 587
diff changeset
78
505
6100c643dba0 ui: finally ditch theme
David Demelier <markand@malikania.fr>
parents: 497
diff changeset
79 return 0;
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 }
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 void
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
83 mlk_ui_draw_text(enum mlk_align align,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
84 struct mlk_font *font,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
85 unsigned long color,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
86 const char *text,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
87 int px,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
88 int py,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
89 unsigned int pw,
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
90 unsigned int ph)
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
91 {
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
92 assert(font);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
93 assert(text && strlen(text) > 0);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
94
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
95 struct mlk_texture texture;
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
96 int x, y;
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
97
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 507
diff changeset
98 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
99 mlk_tracef(_("unable to render text: %s"), mlk_err());
507
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
100 else {
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
101 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
102 mlk_texture_draw(&texture, x, y);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
103 mlk_texture_finish(&texture);
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
104 }
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
105 }
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
106
d49a05e7a5b5 ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents: 505
diff changeset
107 void
497
8d5a266a1774 ui: ui -> mlk_ui
David Demelier <markand@malikania.fr>
parents: 495
diff changeset
108 mlk_ui_finish(void)
156
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 {
c3a40062acc2 misc: create more generic startup function, closes #2500
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 }