ui/gtk/menu.c

changeset 21
012418e7dc90
parent 18
06be29a56f8b
child 30
34513f76d5a8
--- a/ui/gtk/menu.c	Wed Apr 02 20:31:47 2014 +0200
+++ b/ui/gtk/menu.c	Thu Apr 03 11:12:22 2014 +0200
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <inttypes.h>
+#include <stdarg.h>
 
 #include "menu.h"
 #include "toolkit.h"
@@ -80,6 +81,14 @@
 }
 
 void ui_menuitem(char *label, ui_callback f, void *userdata) {
+    ui_menuitem_gr(label, f, userdata, -1);
+}
+
+void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) {
+    ui_menuitem_stgr(stockid, f, userdata, -1);
+}
+
+void ui_menuitem_gr(char *label, ui_callback f, void *userdata, ...) {
     if(!current) {
         return;
     }
@@ -90,12 +99,22 @@
     item->label = label;
     item->userdata = userdata;
     item->callback = f;
+    item->groups = NULL;
+    
+    // add groups
+    va_list ap;
+    va_start(ap, userdata);
+    int group;
+    while((group = va_arg(ap, int)) != -1) {
+        item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
+    }
+    va_end(ap);
     
     UiMenu *cm = current->data;
     cm->items = ucx_list_append(cm->items, item);
 }
 
-void ui_menuitem_st(char *stockid, ui_callback f, void *userdata) {
+void ui_menuitem_stgr(char *stockid, ui_callback f, void *userdata, ...) {
     if(!current) {
         return;
     }
@@ -106,6 +125,16 @@
     item->stockid = stockid;
     item->userdata = userdata;
     item->callback = f;
+    item->groups = NULL;
+    
+    // add groups
+    va_list ap;
+    va_start(ap, userdata);
+    int group;
+    while((group = va_arg(ap, int)) != -1) {
+        item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
+    }
+    va_end(ap);
     
     UiMenu *cm = current->data;
     cm->items = ucx_list_append(cm->items, item);
@@ -224,9 +253,18 @@
                 "activate",
                 G_CALLBACK(ui_menu_event_wrapper),
                 event);
+        g_signal_connect(
+                widget,
+                "destroy",
+                G_CALLBACK(ui_destroy_userdata),
+                event);
     }
     
     gtk_menu_shell_append(GTK_MENU_SHELL(parent), widget);
+    
+    if(i->groups) {
+        uic_add_group_widget(obj->ctx, widget, i->groups);
+    }
 }
 
 void add_menuitem_st_widget(
@@ -251,9 +289,18 @@
                 "activate",
                 G_CALLBACK(ui_menu_event_wrapper),
                 event);
+        g_signal_connect(
+                widget,
+                "destroy",
+                G_CALLBACK(ui_destroy_userdata),
+                event);
     }
     
     gtk_menu_shell_append(GTK_MENU_SHELL(parent), widget);
+    
+    if(i->groups) {
+        uic_add_group_widget(obj->ctx, widget, i->groups);
+    }
 }
 
 void add_menuseparator_widget(
@@ -284,6 +331,11 @@
                 "toggled",
                 G_CALLBACK(ui_menu_event_toggled),
                 event);
+        g_signal_connect(
+                widget,
+                "destroy",
+                G_CALLBACK(ui_destroy_userdata),
+                event);
     }
 }
 
@@ -336,7 +388,8 @@
         GList *mi = gtk_container_get_children(GTK_CONTAINER(list->menu));
         while(mi) {
             if(i >= list->index && i < list->index + list->oldcount) {
-                gtk_container_remove(GTK_CONTAINER(list->menu), mi->data);
+                //gtk_container_remove(GTK_CONTAINER(list->menu), mi->data);
+                gtk_widget_destroy(mi->data);
             }
             mi = mi->next;
             i++;
@@ -368,6 +421,11 @@
                 "activate",
                 G_CALLBACK(ui_menu_event_wrapper),
                 event);
+            g_signal_connect(
+                widget,
+                "destroy",
+                G_CALLBACK(ui_destroy_userdata),
+                event);
         }
         
         str = ui_list_next(list->list);

mercurial