Mercurial > molko
annotate libmlk-ui/mlk/ui/gridmenu.c @ 608:2527b000aaa5
ui: do the same with gridmenu
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 11 Aug 2023 19:45:00 +0200 |
parents | ed1d3244ed57 |
children | d97674d33764 |
rev | line source |
---|---|
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * gridmenu.c -- GUI grid menu |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
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> |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
20 #include <math.h> |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
585 | 22 #include <mlk/core/err.h> |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
23 #include <mlk/core/event.h> |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
24 #include <mlk/core/font.h> |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
25 #include <mlk/core/maths.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
26 #include <mlk/core/painter.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
27 #include <mlk/core/texture.h> |
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
28 #include <mlk/core/trace.h> |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
29 #include <mlk/core/window.h> |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include "gridmenu.h" |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
32 #include "style.h" |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
506
diff
changeset
|
33 #include "ui_p.h" |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 struct index { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 unsigned int row; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 unsigned int col; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 }; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 static struct index |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
41 get_index(const struct mlk_gridmenu *menu) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 return (struct index) { |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
44 .row = (unsigned int)(menu->selected / menu->ncols), |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
45 .col = (unsigned int)(menu->selected % menu->ncols) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 }; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
49 static int |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
50 handle_keydown(struct mlk_gridmenu *menu, const struct mlk_event_key *key) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
52 assert(key->type == MLK_EVENT_KEYDOWN); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 const struct index idx = get_index(menu); |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
55 int validate = 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 switch (key->key) { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
58 case MLK_KEY_UP: |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 if (idx.row > 0) |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 menu->selected -= menu->ncols; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
62 case MLK_KEY_RIGHT: |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
63 if (menu->selected + 1U < menu->itemsz) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 menu->selected += 1; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
66 case MLK_KEY_DOWN: |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
67 if (idx.row + 1U < menu->itemsz / menu->ncols) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 menu->selected += menu->ncols; |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
69 else |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
70 menu->selected = menu->itemsz - 1; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
72 case MLK_KEY_LEFT: |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 if (idx.col > 0) |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 menu->selected -= 1; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
76 case MLK_KEY_ENTER: |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
77 validate = 1; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 break; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 default: |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 break; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
83 return validate; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
86 static int |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
87 handle_clickdown(struct mlk_gridmenu *menu, const struct mlk_event_click *click) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
89 assert(click->type == MLK_EVENT_CLICKDOWN); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
91 const struct mlk_style_attr *attr = &menu->style->normal; |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
92 size_t pagesz, pagenr, selected, c = 0, r = 0; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
93 int x, y; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
94 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
95 pagesz = menu->nrows * menu->ncols; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
96 pagenr = menu->selected / pagesz; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
97 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
98 for (size_t i = 0; i < pagesz; ++i) { |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
99 x = (int)(menu->x + attr->geo.padding + (c * menu->eltw) + (c * menu->spacew)); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
100 y = (int)(menu->y + attr->geo.padding + (r * menu->elth) + (r * menu->spaceh)); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
528
95792046d3d2
core: doxygenize maths
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
102 if (mlk_maths_is_boxed(click->x, click->y, x, y, menu->eltw, menu->elth)) { |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
103 selected = c + r * menu->ncols; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
104 selected += pagesz * pagenr; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
106 if (selected < menu->itemsz) { |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
107 menu->selected = selected; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
108 return 1; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
109 } |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
110 } |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
111 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
112 if (++c >= menu->ncols) { |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
113 ++r; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
114 c = 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
118 return 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
121 static void |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
122 resize(struct mlk_gridmenu_delegate *self, struct mlk_gridmenu *menu) |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
123 { |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
124 (void)self; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
125 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
126 const struct mlk_style_attr *attr = &menu->style->normal; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
127 unsigned int reqw = 0, reqh = 0, lw, lh; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
128 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
129 /* Compute which item has the bigger width/height to create a spacing. */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
130 menu->eltw = menu->elth = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
131 menu->spacew = menu->spaceh = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
132 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
133 for (size_t i = 0; i < menu->itemsz; ++i) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
134 if (!(menu->items[i])) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
135 continue; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
136 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
137 mlk_font_query(attr->font, menu->items[i], &lw, &lh); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
138 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
139 menu->eltw = fmax(menu->eltw, lw); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
140 menu->elth = fmax(menu->elth, lh); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
141 } |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
142 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
143 /* Total texture size required to draw items. */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
144 reqw = (attr->geo.padding * 3) + (menu->eltw * menu->ncols); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
145 reqh = (attr->geo.padding * 3) + (menu->elth * menu->nrows); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
146 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
147 /* |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
148 * Compute spacing between elements. We remove the padding because it |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
149 * is outside of the elements. |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
150 */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
151 if (reqw > menu->w) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
152 mlk_tracef(_("gridmenu width is too small: %u < %u"), menu->w, reqw); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
153 menu->spacew = 1; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
154 } else if (menu->ncols > 1) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
155 reqw -= attr->geo.padding * 2; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
156 menu->spacew = (menu->w - reqw) / menu->ncols; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
157 } |
508
7f7602bae0bd
examples: minor touches
David Demelier <markand@malikania.fr>
parents:
507
diff
changeset
|
158 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
159 if (reqh > menu->h) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
160 mlk_tracef(_("gridmenu height is too small: %u < %u"), menu->h, reqh); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
161 menu->spaceh = 1; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
162 } else if (menu->nrows > 1) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
163 reqh -= attr->geo.padding * 2; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
164 menu->spaceh = (menu->h - reqh) / menu->nrows; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
165 } |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
166 } |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
167 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
168 static int |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
169 handle(struct mlk_gridmenu_delegate *self, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
170 struct mlk_gridmenu *menu, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
171 const union mlk_event *ev) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
172 { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
173 (void)self; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
174 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
175 switch (ev->type) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
176 case MLK_EVENT_KEYDOWN: |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
177 return handle_keydown(menu, &ev->key); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
178 case MLK_EVENT_CLICKDOWN: |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
179 return handle_clickdown(menu, &ev->click); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
180 default: |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
181 break; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
182 } |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
183 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
184 return 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
185 } |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
186 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
187 static void |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
188 draw(struct mlk_gridmenu_delegate *self, const struct mlk_gridmenu *menu) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
189 { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
190 (void)self; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
191 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
192 const struct mlk_style *st = menu->style; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
193 size_t pagesz, pagenr, item, c = 0, r = 0; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
194 struct mlk_texture tex; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
195 struct mlk_font *font; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
196 unsigned long color; |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
197 int x, y; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
198 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
199 /* |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
200 * Select the first top-left column based on the current selection and |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
201 * the number of rows/columns. |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
202 */ |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
203 pagesz = menu->nrows * menu->ncols; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
204 pagenr = menu->selected / pagesz; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
205 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
206 for (size_t i = 0; i < pagesz; ++i) { |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
207 item = i + pagenr * pagesz; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
208 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
209 if (item >= menu->itemsz || !menu->items[item]) |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
210 continue; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
211 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
212 x = (int)(menu->x + st->normal.geo.padding + (c * menu->eltw) + (c * menu->spacew)); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
213 y = (int)(menu->y + st->normal.geo.padding + (r * menu->elth) + (r * menu->spaceh)); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
214 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
215 if (i == menu->selected % pagesz) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
216 color = st->selected.color.text; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
217 font = st->selected.font; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
218 } else { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
219 color = st->normal.color.text; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
220 font = st->normal.font; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
221 } |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
222 |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
223 if (mlk_font_render(font, &tex, menu->items[item], color) < 0) { |
587
c027304ced27
misc: add NLS for ui/rpg
David Demelier <markand@malikania.fr>
parents:
585
diff
changeset
|
224 mlk_tracef(_("unable to render grid menu item: %s"), mlk_err()); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
225 continue; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
226 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
227 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
228 mlk_texture_draw(&tex, x, y); |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
229 mlk_texture_finish(&tex); |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
230 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
231 if (++c >= menu->ncols) { |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
232 ++r; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
233 c = 0; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
234 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
235 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
236 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
237 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
238 struct mlk_gridmenu_delegate mlk_gridmenu_delegate = { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
239 .resize = resize, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
240 .handle = handle, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
241 .draw = draw |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
242 }; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
243 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
244 void |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
245 mlk_gridmenu_init(struct mlk_gridmenu *menu, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
246 struct mlk_gridmenu_delegate *dt, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
247 struct mlk_style *st) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
248 { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
249 assert(menu); |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
250 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
251 menu->x = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
252 menu->y = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
253 menu->w = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
254 menu->h = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
255 menu->items = NULL; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
256 menu->itemsz = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
257 menu->nrows = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
258 menu->ncols = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
259 menu->delegate = dt ? dt : &mlk_gridmenu_delegate; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
260 menu->style = st ? st : &mlk_style; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
261 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
262 /* Can't be computed yet. */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
263 menu->eltw = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
264 menu->elth = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
265 menu->spacew = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
266 menu->spaceh = 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 void |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
270 mlk_gridmenu_resize(struct mlk_gridmenu *menu, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
271 int x, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
272 int y, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
273 unsigned int w, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
274 unsigned int h) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
275 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
276 assert(menu); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
278 menu->x = x; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
279 menu->y = y; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
280 menu->w = w; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
281 menu->h = h; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
282 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
283 if (menu->delegate->resize) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
284 menu->delegate->resize(menu->delegate, menu); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
286 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
287 int |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
288 mlk_gridmenu_handle(struct mlk_gridmenu *menu, const union mlk_event *ev) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
290 assert(menu); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
291 assert(ev); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
293 if (menu->delegate->handle) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
294 return menu->delegate->handle(menu->delegate, menu, ev); |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
295 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
296 return 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
297 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
298 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 void |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
300 mlk_gridmenu_update(struct mlk_gridmenu *menu, unsigned int ticks) |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
301 { |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
302 assert(menu); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
303 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
304 if (menu->delegate->update) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
305 menu->delegate->update(menu->delegate, menu, ticks); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
306 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
307 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
308 void |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
309 mlk_gridmenu_draw(const struct mlk_gridmenu *menu) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
310 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
311 assert(menu); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
312 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
313 if (menu->delegate->draw) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
314 menu->delegate->draw(menu->delegate, menu); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 } |