Wed, 02 Apr 2014 20:31:47 +0200
added groups for menu items (Cocoa)
0 | 1 | /* |
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. | |
3 | * | |
4 | * Copyright 2014 Olaf Wintermann. All rights reserved. | |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions are met: | |
8 | * | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * | |
12 | * 2. Redistributions in binary form must reproduce the above copyright | |
13 | * notice, this list of conditions and the following disclaimer in the | |
14 | * documentation and/or other materials provided with the distribution. | |
15 | * | |
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
26 | * POSSIBILITY OF SUCH DAMAGE. | |
27 | */ | |
28 | ||
29 | #include <stdio.h> | |
30 | #include <stdlib.h> | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
31 | #include <inttypes.h> |
0 | 32 | |
33 | #include "menu.h" | |
34 | #include "toolkit.h" | |
35 | #include "../common/context.h" | |
36 | #include "../ui/window.h" | |
37 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
38 | static UcxList *menus; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
39 | static UcxList *current; |
0 | 40 | |
41 | void ui_menu(char *label) { | |
42 | // free current menu hierarchy | |
43 | ucx_list_free(current); | |
44 | ||
45 | // create menu | |
46 | UiMenu *menu = malloc(sizeof(UiMenu)); | |
47 | menu->item.add_to = (ui_menu_add_f)add_menu_widget; | |
48 | ||
49 | menu->label = label; | |
50 | menu->items = NULL; | |
51 | menu->parent = NULL; | |
52 | ||
53 | current = ucx_list_prepend(NULL, menu); | |
54 | menus = ucx_list_append(menus, menu); | |
55 | ||
56 | } | |
57 | ||
58 | void ui_submenu(char *label) { | |
59 | UiMenu *menu = malloc(sizeof(UiMenu)); | |
60 | menu->item.add_to = (ui_menu_add_f)add_menu_widget; | |
61 | ||
62 | menu->label = label; | |
63 | menu->items = NULL; | |
64 | menu->parent = NULL; | |
65 | ||
66 | // add submenu to current menu | |
67 | UiMenu *cm = current->data; | |
68 | cm->items = ucx_list_append(cm->items, menu); | |
69 | ||
70 | // set the submenu to current menu | |
71 | current = ucx_list_prepend(current, menu); | |
72 | } | |
73 | ||
74 | void ui_submenu_end() { | |
75 | if(ucx_list_size(current) < 2) { | |
76 | return; | |
77 | } | |
78 | current = ucx_list_remove(current, current); | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
79 | //UcxList *c = current; |
0 | 80 | } |
81 | ||
82 | void ui_menuitem(char *label, ui_callback f, void *userdata) { | |
83 | if(!current) { | |
84 | return; | |
85 | } | |
86 | ||
87 | UiMenuItem *item = malloc(sizeof(UiMenuItem)); | |
88 | item->item.add_to = (ui_menu_add_f)add_menuitem_widget; | |
89 | ||
90 | item->label = label; | |
91 | item->userdata = userdata; | |
92 | item->callback = f; | |
93 | ||
94 | UiMenu *cm = current->data; | |
95 | cm->items = ucx_list_append(cm->items, item); | |
96 | } | |
97 | ||
18
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
98 | void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) { |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
99 | if(!current) { |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
100 | return; |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
101 | } |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
102 | |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
103 | UiStMenuItem *item = malloc(sizeof(UiStMenuItem)); |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
104 | item->item.add_to = (ui_menu_add_f)add_menuitem_st_widget; |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
105 | |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
106 | item->stockid = stockid; |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
107 | item->userdata = userdata; |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
108 | item->callback = f; |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
109 | |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
110 | UiMenu *cm = current->data; |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
111 | cm->items = ucx_list_append(cm->items, item); |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
112 | } |
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
113 | |
0 | 114 | void ui_menuseparator() { |
115 | if(!current) { | |
116 | return; | |
117 | } | |
118 | ||
119 | UiMenuItemI *item = malloc(sizeof(UiMenuItemI)); | |
120 | item->add_to = (ui_menu_add_f)add_menuseparator_widget; | |
121 | ||
122 | UiMenu *cm = current->data; | |
123 | cm->items = ucx_list_append(cm->items, item); | |
124 | } | |
125 | ||
126 | void ui_checkitem(char *label, ui_callback f, void *userdata) { | |
127 | if(!current) { | |
128 | return; | |
129 | } | |
130 | ||
131 | UiCheckItem *item = malloc(sizeof(UiCheckItem)); | |
132 | item->item.add_to = (ui_menu_add_f)add_checkitem_widget; | |
133 | item->label = label; | |
134 | item->callback = f; | |
135 | item->userdata = userdata; | |
136 | ||
137 | UiMenu *cm = current->data; | |
138 | cm->items = ucx_list_append(cm->items, item); | |
139 | } | |
140 | ||
141 | void ui_checkitem_nv(char *label, char *vname) { | |
142 | if(!current) { | |
143 | return; | |
144 | } | |
145 | ||
146 | UiCheckItemNV *item = malloc(sizeof(UiCheckItemNV)); | |
147 | item->item.add_to = (ui_menu_add_f)add_checkitemnv_widget; | |
148 | item->varname = vname; | |
149 | item->label = label; | |
150 | ||
151 | UiMenu *cm = current->data; | |
152 | cm->items = ucx_list_append(cm->items, item); | |
153 | } | |
154 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
155 | void ui_menuitem_list(UiList *items, ui_callback f, void *userdata) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
156 | if(!current) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
157 | return; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
158 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
159 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
160 | UiMenuItemList *item = malloc(sizeof(UiMenuItemList)); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
161 | item->item.add_to = (ui_menu_add_f)add_menuitem_list_widget; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
162 | item->callback = f; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
163 | item->userdata = userdata; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
164 | item->list = items; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
165 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
166 | UiMenu *cm = current->data; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
167 | cm->items = ucx_list_append(cm->items, item); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
168 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
169 | |
0 | 170 | // private menu functions |
171 | GtkWidget *ui_create_menubar(UiObject *obj) { | |
172 | if(menus == NULL) { | |
173 | return NULL; | |
174 | } | |
175 | ||
176 | GtkWidget *mb = gtk_menu_bar_new(); | |
177 | ||
178 | UcxList *ls = menus; | |
179 | while(ls) { | |
180 | UiMenu *menu = ls->data; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
181 | menu->item.add_to(mb, 0, &menu->item, obj); |
0 | 182 | |
183 | ls = ls->next; | |
184 | } | |
185 | ||
186 | return mb; | |
187 | } | |
188 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
189 | void add_menu_widget(GtkWidget *parent, int i, UiMenuItemI *item, UiObject *obj) { |
0 | 190 | UiMenu *menu = (UiMenu*)item; |
191 | ||
192 | GtkWidget *menu_widget = gtk_menu_new(); | |
193 | GtkWidget *menu_item = gtk_menu_item_new_with_label(menu->label); | |
194 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), menu_widget); | |
195 | ||
196 | UcxList *ls = menu->items; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
197 | int index = 0; |
0 | 198 | while(ls) { |
199 | UiMenuItemI *i = ls->data; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
200 | i->add_to(menu_widget, index, i, obj); |
0 | 201 | |
202 | ls = ls->next; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
203 | index++; |
0 | 204 | } |
205 | ||
206 | gtk_menu_shell_append(GTK_MENU_SHELL(parent), menu_item); | |
207 | } | |
208 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
209 | void add_menuitem_widget(GtkWidget *parent, int index, UiMenuItemI *item, UiObject *obj) { |
0 | 210 | UiMenuItem *i = (UiMenuItem*)item; |
211 | ||
212 | //GtkWidget *widget = gtk_menu_item_new_with_label(i->title); | |
213 | GtkWidget *widget = gtk_menu_item_new_with_mnemonic(i->label); | |
214 | ||
215 | if(i->callback != NULL) { | |
216 | UiEventData *event = malloc(sizeof(UiEventData)); | |
217 | event->obj = obj; | |
218 | event->user_data = i->userdata; | |
219 | event->callback = i->callback; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
220 | event->value = 0; |
0 | 221 | |
222 | g_signal_connect( | |
223 | widget, | |
224 | "activate", | |
225 | G_CALLBACK(ui_menu_event_wrapper), | |
226 | event); | |
227 | } | |
228 | ||
229 | gtk_menu_shell_append(GTK_MENU_SHELL(parent), widget); | |
230 | } | |
231 | ||
232 | void add_menuitem_st_widget( | |
233 | GtkWidget *parent, | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
234 | int index, |
0 | 235 | UiMenuItemI *item, |
236 | UiObject *obj) | |
237 | { | |
238 | UiStMenuItem *i = (UiStMenuItem*)item; | |
239 | ||
18
06be29a56f8b
added menu accelerators
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
16
diff
changeset
|
240 | GtkWidget *widget = gtk_image_menu_item_new_from_stock(i->stockid, obj->ctx->accel_group); |
0 | 241 | |
242 | if(i->callback != NULL) { | |
243 | UiEventData *event = malloc(sizeof(UiEventData)); | |
244 | event->obj = obj; | |
245 | event->user_data = i->userdata; | |
246 | event->callback = i->callback; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
247 | event->value = 0; |
0 | 248 | |
249 | g_signal_connect( | |
250 | widget, | |
251 | "activate", | |
252 | G_CALLBACK(ui_menu_event_wrapper), | |
253 | event); | |
254 | } | |
255 | ||
256 | gtk_menu_shell_append(GTK_MENU_SHELL(parent), widget); | |
257 | } | |
258 | ||
259 | void add_menuseparator_widget( | |
260 | GtkWidget *parent, | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
261 | int index, |
0 | 262 | UiMenuItemI *item, |
263 | UiObject *obj) | |
264 | { | |
265 | gtk_menu_shell_append( | |
266 | GTK_MENU_SHELL(parent), | |
267 | gtk_separator_menu_item_new()); | |
268 | } | |
269 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
270 | void add_checkitem_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
0 | 271 | UiCheckItem *ci = (UiCheckItem*)item; |
272 | GtkWidget *widget = gtk_check_menu_item_new_with_mnemonic(ci->label); | |
273 | gtk_menu_shell_append(GTK_MENU_SHELL(p), widget); | |
274 | ||
275 | if(ci->callback) { | |
276 | UiEventData *event = malloc(sizeof(UiEventData)); | |
277 | event->obj = obj; | |
278 | event->user_data = ci->userdata; | |
279 | event->callback = ci->callback; | |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
280 | event->value = 0; |
0 | 281 | |
282 | g_signal_connect( | |
283 | widget, | |
284 | "toggled", | |
285 | G_CALLBACK(ui_menu_event_toggled), | |
286 | event); | |
287 | } | |
288 | } | |
289 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
290 | void add_checkitemnv_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
0 | 291 | UiCheckItemNV *ci = (UiCheckItemNV*)item; |
292 | GtkWidget *widget = gtk_check_menu_item_new_with_mnemonic(ci->label); | |
293 | gtk_menu_shell_append(GTK_MENU_SHELL(p), widget); | |
294 | ||
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
295 | UiVar *var = uic_connect_var(obj->ctx, ci->varname, UI_VAR_INTEGER); |
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
296 | if(var) { |
0 | 297 | UiInteger *value = var->value; |
298 | value->obj = widget; | |
299 | value->get = ui_checkitem_get; | |
300 | value->set = ui_checkitem_set; | |
301 | value = 0; | |
302 | } else { | |
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
303 | // TODO: error |
0 | 304 | } |
305 | } | |
306 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
307 | void add_menuitem_list_widget(GtkWidget *p, int index, UiMenuItemI *item, UiObject *obj) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
308 | UiMenuItemList *il = (UiMenuItemList*)item; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
309 | UcxMempool *mp = obj->ctx->mempool; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
310 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
311 | UiActiveMenuItemList *ls = ucx_mempool_malloc( |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
312 | mp, |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
313 | sizeof(UiActiveMenuItemList)); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
314 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
315 | ls->object = obj; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
316 | ls->menu = GTK_MENU_SHELL(p); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
317 | ls->index = index; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
318 | ls->oldcount = 0; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
319 | ls->list = il->list; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
320 | ls->callback = il->callback; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
321 | ls->userdata = il->userdata; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
322 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
323 | ls->list->observers = ui_add_observer( |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
324 | ls->list->observers, |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
325 | (ui_callback)ui_update_menuitem_list, |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
326 | ls); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
327 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
328 | ui_update_menuitem_list(NULL, ls); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
329 | } |
0 | 330 | |
331 | ||
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
332 | void ui_update_menuitem_list(UiEvent *event, UiActiveMenuItemList *list) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
333 | // remove old items |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
334 | if(list->oldcount > 0) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
335 | int i = 0; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
336 | GList *mi = gtk_container_get_children(GTK_CONTAINER(list->menu)); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
337 | while(mi) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
338 | if(i >= list->index && i < list->index + list->oldcount) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
339 | gtk_container_remove(GTK_CONTAINER(list->menu), mi->data); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
340 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
341 | mi = mi->next; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
342 | i++; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
343 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
344 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
345 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
346 | char *str = ui_list_first(list->list); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
347 | if(str) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
348 | GtkWidget *widget = gtk_separator_menu_item_new(); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
349 | gtk_menu_shell_insert(list->menu, widget, list->index); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
350 | gtk_widget_show(widget); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
351 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
352 | int i = 1; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
353 | while(str) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
354 | GtkWidget *widget = gtk_menu_item_new_with_label(str); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
355 | gtk_menu_shell_insert(list->menu, widget, list->index + i); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
356 | gtk_widget_show(widget); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
357 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
358 | if(list->callback) { |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
359 | // TODO: use mempool |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
360 | UiEventData *event = malloc(sizeof(UiEventData)); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
361 | event->obj = list->object; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
362 | event->user_data = list->userdata; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
363 | event->callback = list->callback; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
364 | event->value = i - 1; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
365 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
366 | g_signal_connect( |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
367 | widget, |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
368 | "activate", |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
369 | G_CALLBACK(ui_menu_event_wrapper), |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
370 | event); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
371 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
372 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
373 | str = ui_list_next(list->list); |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
374 | i++; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
375 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
376 | |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
377 | list->oldcount = i; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
378 | } |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
379 | |
0 | 380 | void ui_menu_event_wrapper(GtkMenuItem *item, UiEventData *event) { |
381 | UiEvent evt; | |
382 | evt.obj = event->obj; | |
383 | evt.window = event->obj->window; | |
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
384 | evt.document = event->obj->document; |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
385 | evt.eventdata = NULL; |
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
386 | evt.intval = event->value; |
0 | 387 | event->callback(&evt, event->user_data); |
388 | } | |
389 | ||
390 | void ui_menu_event_toggled(GtkCheckMenuItem *ci, UiEventData *event) { | |
391 | UiEvent evt; | |
392 | evt.obj = event->obj; | |
393 | evt.window = event->obj->window; | |
2
eeb50c534497
added support for replaceable documents
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
0
diff
changeset
|
394 | evt.document = event->obj->document; |
16
a499c8a72c15
added menu item lists (GTK)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
2
diff
changeset
|
395 | evt.eventdata = NULL; |
0 | 396 | evt.intval = gtk_check_menu_item_get_active(ci); |
397 | event->callback(&evt, event->user_data); | |
398 | } | |
399 | ||
400 | int ui_checkitem_get(UiInteger *i) { | |
401 | int state = gtk_check_menu_item_get_active(i->obj); | |
402 | i->value = state; | |
403 | return state; | |
404 | } | |
405 | ||
406 | void ui_checkitem_set(UiInteger *i, int value) { | |
407 | i->value = value; | |
408 | gtk_check_menu_item_set_active(i->obj, value); | |
409 | } |