Mercurial > molko
annotate libmlk-ui/mlk/ui/gridmenu.c @ 610:90ac81e4c190
ui: reorder params
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 12 Aug 2023 09:44:49 +0200 |
parents | d97674d33764 |
children | 297fa28cac90 |
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/trace.h> |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
28 #include <mlk/core/window.h> |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "gridmenu.h" |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
31 #include "frame.h" |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
32 #include "label.h" |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
33 #include "style.h" |
507
d49a05e7a5b5
ui: separate delegate/style
David Demelier <markand@malikania.fr>
parents:
506
diff
changeset
|
34 #include "ui_p.h" |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 struct index { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 unsigned int row; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 unsigned int col; |
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 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 static struct index |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
42 get_index(const struct mlk_gridmenu *menu) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 return (struct index) { |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
45 .row = (unsigned int)(menu->selected / menu->ncols), |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
46 .col = (unsigned int)(menu->selected % menu->ncols) |
181
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 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
50 static int |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
51 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
|
52 { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
53 assert(key->type == MLK_EVENT_KEYDOWN); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 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
|
56 int validate = 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 switch (key->key) { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
59 case MLK_KEY_UP: |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 if (idx.row > 0) |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 menu->selected -= menu->ncols; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
63 case MLK_KEY_RIGHT: |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
64 if (menu->selected + 1U < menu->itemsz) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 menu->selected += 1; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
67 case MLK_KEY_DOWN: |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
68 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
|
69 menu->selected += menu->ncols; |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
70 else |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
71 menu->selected = menu->itemsz - 1; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
73 case MLK_KEY_LEFT: |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 if (idx.col > 0) |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 menu->selected -= 1; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 break; |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
77 case MLK_KEY_ENTER: |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
78 validate = 1; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 break; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 default: |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 break; |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
84 return validate; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
87 static int |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
88 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
|
89 { |
450
b26dd49f69ff
core: event -> mlk_event (and friends)
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
90 assert(click->type == MLK_EVENT_CLICKDOWN); |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
92 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
|
93 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
|
94 int x, y; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
95 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
96 pagesz = menu->nrows * menu->ncols; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
97 pagenr = menu->selected / pagesz; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
98 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
99 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
|
100 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
|
101 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
|
102 |
528
95792046d3d2
core: doxygenize maths
David Demelier <markand@malikania.fr>
parents:
508
diff
changeset
|
103 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
|
104 selected = c + r * menu->ncols; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
105 selected += pagesz * pagenr; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
107 if (selected < menu->itemsz) { |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
108 menu->selected = selected; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
109 return 1; |
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 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
113 if (++c >= menu->ncols) { |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
114 ++r; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
115 c = 0; |
181
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 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
119 return 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
122 static void |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
123 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
|
124 { |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
125 (void)self; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
126 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
127 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
|
128 unsigned int reqw = 0, reqh = 0, lw, lh; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
129 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
130 /* 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
|
131 menu->eltw = menu->elth = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
132 menu->spacew = menu->spaceh = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
133 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
134 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
|
135 if (!(menu->items[i])) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
136 continue; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
137 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
138 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
|
139 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
140 menu->eltw = fmax(menu->eltw, lw); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
141 menu->elth = fmax(menu->elth, lh); |
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 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
144 /* Total texture size required to draw items. */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
145 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
|
146 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
|
147 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
148 /* |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
149 * 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
|
150 * is outside of the elements. |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
151 */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
152 if (reqw > menu->w) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
153 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
|
154 menu->spacew = 1; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
155 } else if (menu->ncols > 1) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
156 reqw -= attr->geo.padding * 2; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
157 menu->spacew = (menu->w - reqw) / menu->ncols; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
158 } |
508
7f7602bae0bd
examples: minor touches
David Demelier <markand@malikania.fr>
parents:
507
diff
changeset
|
159 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
160 if (reqh > menu->h) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
161 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
|
162 menu->spaceh = 1; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
163 } else if (menu->nrows > 1) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
164 reqh -= attr->geo.padding * 2; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
165 menu->spaceh = (menu->h - reqh) / menu->nrows; |
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 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
169 static int |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
170 handle(struct mlk_gridmenu_delegate *self, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
171 struct mlk_gridmenu *menu, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
172 const union mlk_event *ev) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
173 { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
174 (void)self; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
175 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
176 switch (ev->type) { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
177 case MLK_EVENT_KEYDOWN: |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
178 return handle_keydown(menu, &ev->key); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
179 case MLK_EVENT_CLICKDOWN: |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
180 return handle_clickdown(menu, &ev->click); |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
181 default: |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
182 break; |
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 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
185 return 0; |
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 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
188 static void |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
189 draw_frame(struct mlk_gridmenu_delegate *self, const struct mlk_gridmenu *menu) |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
190 { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
191 (void)self; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
192 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
193 struct mlk_frame frame; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
194 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
195 mlk_frame_init(&frame, menu->style, &mlk_frame_delegate); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
196 frame.x = menu->x; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
197 frame.y = menu->y; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
198 frame.w = menu->w; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
199 frame.h = menu->h; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
200 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
201 mlk_frame_draw(&frame); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
202 mlk_frame_finish(&frame); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
203 } |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
204 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
205 static void |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
206 draw_item(struct mlk_gridmenu_delegate *self, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
207 const struct mlk_gridmenu *menu, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
208 const char *item, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
209 unsigned int row, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
210 unsigned int col, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
211 int selected) |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
212 { |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
213 (void)self; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
214 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
215 struct mlk_label label; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
216 |
610 | 217 mlk_label_init(&label, &mlk_label_if, menu->style); |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
218 label.x = menu->x + menu->style->normal.geo.padding + (col * menu->eltw) + (col * menu->spacew); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
219 label.y = menu->y + menu->style->normal.geo.padding + (row * menu->elth) + (row * menu->spaceh); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
220 label.text = item; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
221 label.selected = selected; |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
222 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
223 mlk_label_draw(&label); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
224 mlk_label_finish(&label); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
225 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
226 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
227 struct mlk_gridmenu_delegate mlk_gridmenu_delegate = { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
228 .resize = resize, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
229 .handle = handle, |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
230 .draw_frame = draw_frame, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
231 .draw_item = draw_item |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
232 }; |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
233 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
234 void |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
235 mlk_gridmenu_init(struct mlk_gridmenu *menu, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
236 struct mlk_gridmenu_delegate *dt, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
237 struct mlk_style *st) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
238 { |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
239 assert(menu); |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
240 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
241 menu->x = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
242 menu->y = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
243 menu->w = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
244 menu->h = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
245 menu->items = NULL; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
246 menu->itemsz = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
247 menu->nrows = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
248 menu->ncols = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
249 menu->delegate = dt ? dt : &mlk_gridmenu_delegate; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
250 menu->style = st ? st : &mlk_style; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
251 |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
252 /* Can't be computed yet. */ |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
253 menu->eltw = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
254 menu->elth = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
255 menu->spacew = 0; |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
256 menu->spaceh = 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 void |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
260 mlk_gridmenu_resize(struct mlk_gridmenu *menu, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
261 int x, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
262 int y, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
263 unsigned int w, |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
264 unsigned int h) |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
265 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 assert(menu); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
268 menu->x = x; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
269 menu->y = y; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
270 menu->w = w; |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
271 menu->h = h; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
272 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
273 if (menu->delegate->resize) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
274 menu->delegate->resize(menu->delegate, menu); |
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 |
395
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
277 int |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
278 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
|
279 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 assert(menu); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
281 assert(ev); |
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->handle) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
284 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
|
285 |
ef2fc4442ed5
ui: don't use fixed size arrays
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
286 return 0; |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
287 } |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
288 |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 void |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
290 mlk_gridmenu_update(struct mlk_gridmenu *menu, unsigned int ticks) |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
291 { |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
292 assert(menu); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
293 |
608
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
294 if (menu->delegate->update) |
2527b000aaa5
ui: do the same with gridmenu
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
295 menu->delegate->update(menu->delegate, menu, ticks); |
506
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
296 } |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
297 |
e205625015ba
ui: gridmenu is stylable
David Demelier <markand@malikania.fr>
parents:
505
diff
changeset
|
298 void |
492
c7b18475f640
ui: gridmenu -> mlk_gridmenu
David Demelier <markand@malikania.fr>
parents:
491
diff
changeset
|
299 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
|
300 { |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 assert(menu); |
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 |
609
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
303 size_t pagesz, pagenr, item; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
304 unsigned int row = 0, col = 0; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
305 int selected; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
306 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
307 if (menu->delegate->draw_frame) |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
308 menu->delegate->draw_frame(menu->delegate, menu); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
309 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
310 /* |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
311 * Select the first top-left column based on the current selection and |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
312 * the number of rows/columns. |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
313 */ |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
314 pagesz = menu->nrows * menu->ncols; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
315 pagenr = menu->selected / pagesz; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
316 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
317 for (size_t i = 0; i < pagesz; ++i) { |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
318 item = i + pagenr * pagesz; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
319 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
320 if (item >= menu->itemsz || !menu->items[item]) |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
321 continue; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
322 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
323 selected = i == menu->selected % pagesz; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
324 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
325 if (menu->delegate->draw_item) |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
326 menu->delegate->draw_item( |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
327 menu->delegate, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
328 menu, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
329 menu->items[item], |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
330 row, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
331 col, |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
332 selected |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
333 ); |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
334 |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
335 if (++col >= menu->ncols) { |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
336 ++row; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
337 col = 0; |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
338 } |
d97674d33764
ui: grid menu be more flexible
David Demelier <markand@malikania.fr>
parents:
608
diff
changeset
|
339 } |
181
867b60e6258a
ui: add gridmenu object, closes #2511 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
340 } |