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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
76ce31b0151f misc: minor edits
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
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
90ac81e4c190 ui: reorder params
David Demelier <markand@malikania.fr>
parents: 609
diff changeset
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 }