ui/gtk/toolbar.c

changeset 33
458831c574f4
parent 27
77b09bb52ca0
child 42
29b2821d1262
--- a/ui/gtk/toolbar.c	Sat Apr 12 13:44:53 2014 +0200
+++ b/ui/gtk/toolbar.c	Sat May 10 15:43:22 2014 +0200
@@ -32,6 +32,7 @@
 
 #include "toolbar.h"
 #include "button.h"
+#include "image.h"
 #include "../../ucx/mempool.h"
 #include "../common/context.h"
 
@@ -43,29 +44,85 @@
 }
 
 void ui_toolitem(char *name, char *label, ui_callback f, void *udata) {
-    UiToolItem *item = malloc(sizeof(UiToolItem));
-    item->item.add_to = (ui_toolbar_add_f)add_toolitem_widget;
-    item->label = label;
-    item->callback = f;
-    item->userdata = udata;
-    
-    ucx_map_cstr_put(toolbar_items, name, item);
+    ui_toolitem_img(name, label, NULL, f, udata);
 }
 
 void ui_toolitem_st(char *name, char *stockid, ui_callback f, void *userdata) {
     ui_toolitem_stgr(name, stockid, f, userdata, -1);
 }
 
+void ui_toolitem_sti(char *name, char *stockid, ui_callback f, void *userdata) {
+    ui_toolitem_stgri(name, stockid, f, userdata, -1);
+}
+
 void ui_toolitem_stgr(char *name, char *stockid, ui_callback f, void *userdata, ...) {
+    va_list ap;
+    va_start(ap, userdata);
+    ui_toolitem_vstgr(name, stockid, 0, f, userdata, ap);
+    va_end(ap);
+}
+
+void ui_toolitem_stgri(char *name, char *stockid, ui_callback f, void *userdata, ...) {
+    va_list ap;
+    va_start(ap, userdata);
+    ui_toolitem_vstgr(name, stockid, 1, f, userdata, ap);
+    va_end(ap);
+}
+
+void ui_toolitem_img(char *name, char *label, char *img, ui_callback f, void *udata) {
+    UiToolItem *item = malloc(sizeof(UiToolItem));
+    item->item.add_to = (ui_toolbar_add_f)add_toolitem_widget;
+    item->label = label;
+    item->image = img;
+    item->callback = f;
+    item->userdata = udata;
+    item->isimportant = 0;
+    item->groups = NULL;
+    
+    ucx_map_cstr_put(toolbar_items, name, item);
+}
+
+void ui_toolitem_vstgr(
+        char *name,
+        char *stockid,
+        int isimportant,
+        ui_callback f,
+        void *userdata,
+        va_list ap)
+{
     UiStToolItem *item = malloc(sizeof(UiStToolItem));
     item->item.add_to = (ui_toolbar_add_f)add_toolitem_st_widget;
     item->stockid = stockid;
     item->callback = f;
     item->userdata = userdata;
+    item->groups = NULL;
+    item->isimportant = isimportant;
+    
+    // add groups
+    int group;
+    while((group = va_arg(ap, int)) != -1) {
+        item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
+    }
+    
+    ucx_map_cstr_put(toolbar_items, name, item);
+}
+
+void ui_toolitem_toggle_st(char *name, char *stockid, ui_callback f, void *udata, ...) {
+    ui_toolitem_toggle_stgr(name, stockid, f, udata, -1);
+}
+
+void ui_toolitem_toggle_stgr(char *name, char *stockid, ui_callback f, void *udata, ...) {
+    UiStToolItem *item = malloc(sizeof(UiStToolItem));
+    item->item.add_to = (ui_toolbar_add_f)add_toolitem_toggle_st_widget;
+    item->stockid = stockid;
+    item->callback = f;
+    item->userdata = udata;
+    item->groups = NULL;
+    item->isimportant = 0;
     
     // add groups
     va_list ap;
-    va_start(ap, userdata);
+    va_start(ap, udata);
     int group;
     while((group = va_arg(ap, int)) != -1) {
         item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
@@ -75,6 +132,29 @@
     ucx_map_cstr_put(toolbar_items, name, item);
 }
 
+void ui_toolitem_toggle_imggr(char *name, char *label, char *img, ui_callback f, void *udata, ...) {
+    UiToolItem *item = malloc(sizeof(UiToolItem));
+    item->item.add_to = (ui_toolbar_add_f)add_toolitem_toggle_widget;
+    item->label = label;
+    item->image = img;
+    item->callback = f;
+    item->userdata = udata;
+    item->groups = NULL;
+    item->isimportant = 0;
+    
+    // add groups
+    va_list ap;
+    va_start(ap, udata);
+    int group;
+    while((group = va_arg(ap, int)) != -1) {
+        item->groups = ucx_list_append(item->groups, (void*)(intptr_t)group);
+    }
+    va_end(ap);
+    
+    ucx_map_cstr_put(toolbar_items, name, item);
+}
+
+
 void ui_toolbar_add_default(char *name) {
     char *s = strdup(name);
     defaults = ucx_list_append(defaults, s);
@@ -110,6 +190,11 @@
 void add_toolitem_widget(GtkToolbar *tb, UiToolItem *item, UiObject *obj) {
     GtkToolItem *button = gtk_tool_button_new(NULL, item->label);
     gtk_tool_item_set_homogeneous(button, FALSE);
+    if(item->image) {
+        GdkPixbuf *pixbuf = ui_get_image(item->image);
+        GtkWidget *image = gtk_image_new_from_pixbuf(pixbuf);
+        gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(button), image);
+    }
     
     if(item->callback) {
         UiEventData *event = ucx_mempool_malloc(
@@ -136,6 +221,9 @@
 void add_toolitem_st_widget(GtkToolbar *tb, UiStToolItem *item, UiObject *obj) {
     GtkToolItem *button = gtk_tool_button_new_from_stock(item->stockid);
     gtk_tool_item_set_homogeneous(button, FALSE);
+    if(item->isimportant) {
+        gtk_tool_item_set_is_important(button, TRUE);
+    }
     
     if(item->callback) {
         UiEventData *event = ucx_mempool_malloc(
@@ -158,3 +246,63 @@
         uic_add_group_widget(obj->ctx, button, item->groups);
     }
 }
+
+void add_toolitem_toggle_widget(GtkToolbar *tb, UiToolItem *item, UiObject *obj) {
+    GtkToolItem *button = gtk_toggle_tool_button_new();
+    gtk_tool_item_set_homogeneous(button, FALSE);
+    if(item->label) {
+        gtk_tool_button_set_label(GTK_TOOL_BUTTON(button), item->label);
+    }
+    if(item->image) {
+        GdkPixbuf *pixbuf = ui_get_image(item->image);
+        GtkWidget *image = gtk_image_new_from_pixbuf(pixbuf);
+        gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(button), image);
+    }    
+    
+    if(item->callback) {
+        UiEventData *event = ucx_mempool_malloc(
+                obj->ctx->mempool,
+                sizeof(UiEventData));
+        event->obj = obj;
+        event->user_data = item->userdata;
+        event->callback = item->callback;
+        
+        g_signal_connect(
+                button,
+                "toggled",
+                G_CALLBACK(ui_button_toggled),
+                event);
+    }
+    
+    gtk_toolbar_insert(tb, button, -1);
+    
+    if(item->groups) {
+        uic_add_group_widget(obj->ctx, button, item->groups);
+    }
+}
+
+void add_toolitem_toggle_st_widget(GtkToolbar *tb, UiStToolItem *item, UiObject *obj) {
+    GtkToolItem *button = gtk_toggle_tool_button_new_from_stock(item->stockid);
+    gtk_tool_item_set_homogeneous(button, FALSE);
+    
+    if(item->callback) {
+        UiEventData *event = ucx_mempool_malloc(
+                obj->ctx->mempool,
+                sizeof(UiEventData));
+        event->obj = obj;
+        event->user_data = item->userdata;
+        event->callback = item->callback;
+        
+        g_signal_connect(
+                button,
+                "toggled",
+                G_CALLBACK(ui_button_toggled),
+                event);
+    }
+    
+    gtk_toolbar_insert(tb, button, -1);
+    
+    if(item->groups) {
+        uic_add_group_widget(obj->ctx, button, item->groups);
+    }
+}

mercurial