ui/gtk/toolbar.c

changeset 3
c1a75454b444
child 27
77b09bb52ca0
equal deleted inserted replaced
2:eeb50c534497 3:c1a75454b444
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>
31 #include <string.h>
32
33 #include "toolbar.h"
34 #include "button.h"
35 #include "../../ucx/mempool.h"
36 #include "../common/context.h"
37
38 static UcxMap *toolbar_items;
39 static UcxList *defaults;
40
41 void ui_toolbar_init() {
42 toolbar_items = ucx_map_new(16);
43 }
44
45 void ui_toolitem(char *name, char *label, ui_callback f, void *udata) {
46 UiToolItem *item = malloc(sizeof(UiToolItem));
47 item->item.add_to = (ui_toolbar_add_f)add_toolitem_widget;
48 item->label = label;
49 item->callback = f;
50 item->userdata = udata;
51
52 ucx_map_cstr_put(toolbar_items, name, item);
53 }
54
55 void ui_toolitem_st(char *name, char *stockid, ui_callback f, void *ud) {
56 UiStToolItem *item = malloc(sizeof(UiStToolItem));
57 item->item.add_to = (ui_toolbar_add_f)add_toolitem_st_widget;
58 item->stockid = stockid;
59 item->callback = f;
60 item->userdata = ud;
61
62 ucx_map_cstr_put(toolbar_items, name, item);
63 }
64
65 void ui_toolbar_add_default(char *name) {
66 char *s = strdup(name);
67 defaults = ucx_list_append(defaults, s);
68 }
69
70 GtkWidget* ui_create_toolbar(UiObject *obj) {
71 if(!defaults) {
72 return NULL;
73 }
74
75 GtkWidget *toolbar = gtk_toolbar_new();
76 #ifdef UI_GTK3
77 gtk_style_context_add_class(
78 gtk_widget_get_style_context(toolbar),
79 GTK_STYLE_CLASS_PRIMARY_TOOLBAR);
80 #endif
81
82 GtkToolbar *tb = GTK_TOOLBAR(toolbar);
83 UCX_FOREACH(elm, defaults) {
84 UiToolItemI *item = ucx_map_cstr_get(toolbar_items, elm->data);
85 if(item) {
86 item->add_to(tb, item, obj);
87 } else if(!strcmp(elm->data, "@separator")) {
88 gtk_toolbar_insert(tb, gtk_separator_tool_item_new(), -1);
89 } else {
90 fprintf(stderr, "UI Error: Unknown toolbar item: %s\n", elm->data);
91 }
92 }
93
94 return toolbar;
95 }
96
97 void add_toolitem_widget(GtkToolbar *tb, UiToolItem *item, UiObject *obj) {
98 GtkToolItem *button = gtk_tool_button_new(NULL, item->label);
99 gtk_tool_item_set_homogeneous(button, FALSE);
100
101 if(item->callback) {
102 UiEventData *event = ucx_mempool_malloc(
103 obj->ctx->mempool,
104 sizeof(UiEventData));
105 event->obj = obj;
106 event->user_data = item->userdata;
107 event->callback = item->callback;
108
109 g_signal_connect(
110 button,
111 "clicked",
112 G_CALLBACK(ui_button_clicked),
113 event);
114 }
115
116 gtk_toolbar_insert(tb, button, -1);
117 }
118
119 void add_toolitem_st_widget(GtkToolbar *tb, UiStToolItem *item, UiObject *obj) {
120 GtkToolItem *button = gtk_tool_button_new_from_stock(item->stockid);
121 gtk_tool_item_set_homogeneous(button, FALSE);
122
123 if(item->callback) {
124 UiEventData *event = ucx_mempool_malloc(
125 obj->ctx->mempool,
126 sizeof(UiEventData));
127 event->obj = obj;
128 event->user_data = item->userdata;
129 event->callback = item->callback;
130
131 g_signal_connect(
132 button,
133 "clicked",
134 G_CALLBACK(ui_button_clicked),
135 event);
136 }
137
138 gtk_toolbar_insert(tb, button, -1);
139 }

mercurial