Mercurial > molko
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 |
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 | 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 | 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 } |