134 |
134 |
135 UiMenu *cm = current->data; |
135 UiMenu *cm = current->data; |
136 cm->items = ucx_list_append(cm->items, item); |
136 cm->items = ucx_list_append(cm->items, item); |
137 } |
137 } |
138 |
138 |
|
139 void ui_menuitem_list(UiList *items, ui_callback f, void *userdata) { |
|
140 if(!current) { |
|
141 return; |
|
142 } |
|
143 |
|
144 UiMenuItemList *item = malloc(sizeof(UiMenuItemList)); |
|
145 item->item.add_to = (ui_menu_add_f)add_menuitem_list_widget; |
|
146 item->callback = f; |
|
147 item->userdata = userdata; |
|
148 item->list = items; |
|
149 |
|
150 UiMenu *cm = current->data; |
|
151 cm->items = ucx_list_append(cm->items, item); |
|
152 } |
|
153 |
139 |
154 |
140 // private menu functions |
155 // private menu functions |
141 void ui_create_menubar(UiObject *obj) { |
156 void ui_create_menubar(UiObject *obj) { |
142 if(!menus) { |
157 if(!menus) { |
143 return; |
158 return; |
290 value->set = ui_toggle_button_set; |
306 value->set = ui_toggle_button_set; |
291 value = 0; |
307 value = 0; |
292 } else { |
308 } else { |
293 // TODO: error |
309 // TODO: error |
294 } |
310 } |
295 } |
311 |
296 |
312 return 1; |
|
313 } |
|
314 |
|
315 int add_menuitem_list_widget( |
|
316 Widget parent, |
|
317 int i, |
|
318 UiMenuItemI *item, |
|
319 UiObject *obj) |
|
320 { |
|
321 UiMenuItemList *il = (UiMenuItemList*)item; |
|
322 UcxMempool *mp = obj->ctx->mempool; |
|
323 |
|
324 UiActiveMenuItemList *ls = ucx_mempool_malloc( |
|
325 mp, |
|
326 sizeof(UiActiveMenuItemList)); |
|
327 |
|
328 ls->object = obj; |
|
329 ls->menu = parent; |
|
330 ls->index = i; |
|
331 ls->oldcount = 0; |
|
332 ls->list = il->list; |
|
333 ls->callback = il->callback; |
|
334 ls->userdata = il->userdata; |
|
335 |
|
336 ls->list->observers = ui_add_observer( |
|
337 ls->list->observers, |
|
338 (ui_callback)ui_update_menuitem_list, |
|
339 ls); |
|
340 |
|
341 ui_update_menuitem_list(NULL, ls); |
|
342 |
|
343 return 0; |
|
344 } |
|
345 |
|
346 void ui_update_menuitem_list(UiEvent *event, UiActiveMenuItemList *list) { |
|
347 Arg args[4]; |
|
348 |
|
349 // remove old items |
|
350 if(list->oldcount > 0) { |
|
351 Widget *children; |
|
352 int nc; |
|
353 |
|
354 XtVaGetValues( |
|
355 list->menu, |
|
356 XmNchildren, |
|
357 &children, |
|
358 XmNnumChildren, |
|
359 &nc, |
|
360 NULL); |
|
361 |
|
362 for(int i=0;i<list->oldcount;i++) { |
|
363 XtDestroyWidget(children[list->index + i]); |
|
364 } |
|
365 } |
|
366 |
|
367 char *str = ui_list_first(list->list); |
|
368 if(str) { |
|
369 // add separator |
|
370 XtSetArg(args[0], XmNpositionIndex, list->index); |
|
371 Widget s = XmCreateSeparatorGadget (list->menu, "menu_separator", args, 1); |
|
372 XtManageChild(s); |
|
373 } |
|
374 int i = 1; |
|
375 while(str) { |
|
376 XmString label = XmStringCreateLocalized(str); |
|
377 XtSetArg(args[0], XmNlabelString, label); |
|
378 XtSetArg(args[1], XmNpositionIndex, list->index + i); |
|
379 |
|
380 Widget mitem = XtCreateManagedWidget( |
|
381 "menubutton", |
|
382 xmPushButtonWidgetClass, |
|
383 list->menu, |
|
384 args, |
|
385 2); |
|
386 XmStringFree(label); |
|
387 |
|
388 if(list->callback) { |
|
389 // TODO: use mempool |
|
390 UiEventData *event = malloc(sizeof(UiEventData)); |
|
391 event->obj = list->object; |
|
392 event->user_data = list->userdata; |
|
393 event->callback = list->callback; |
|
394 event->value = i - 1; |
|
395 |
|
396 XtAddCallback( |
|
397 mitem, |
|
398 XmNactivateCallback, |
|
399 (XtCallbackProc)ui_push_button_callback, |
|
400 event); |
|
401 } |
|
402 |
|
403 str = ui_list_next(list->list); |
|
404 i++; |
|
405 } |
|
406 |
|
407 list->oldcount = i; |
|
408 } |
297 |
409 |
298 void ui_menu_event_wrapper(Widget widget, XtPointer udata, XtPointer cdata) { |
410 void ui_menu_event_wrapper(Widget widget, XtPointer udata, XtPointer cdata) { |
299 UiEventData *event = udata; |
411 UiEventData *event = udata; |
300 UiEvent e; |
412 UiEvent e; |
301 e.obj = event->obj; |
413 e.obj = event->obj; |