diff -r 9a5f47fbc5c3 -r 458831c574f4 ui/gtk/toolbar.c --- 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); + } +}