Contents of /trunk/src/iconbar.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 22 - (show annotations)
Wed Dec 17 16:43:46 2008 UTC (15 years, 4 months ago) by harbaum
File MIME type: text/plain
File size: 8749 byte(s)
Color system cleaned up, desktop fullscreen
1 /*
2 * Copyright (C) 2008 Till Harbaum <till@harbaum.org>.
3 *
4 * This file is part of OSM2Go.
5 *
6 * OSM2Go is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * OSM2Go is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with OSM2Go. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "appdata.h"
21
22 static void on_info_clicked(GtkButton *button, gpointer data) {
23 appdata_t *appdata = (appdata_t*)data;
24
25 info_dialog(GTK_WIDGET(appdata->window), appdata, NULL);
26 }
27
28 static void on_node_add_clicked(GtkButton *button, gpointer data) {
29 map_action_set((appdata_t*)data, MAP_ACTION_NODE_ADD);
30 }
31
32 static void on_way_add_clicked(GtkButton *button, gpointer data) {
33 map_action_set((appdata_t*)data, MAP_ACTION_WAY_ADD);
34 }
35
36 static void on_way_node_add_clicked(GtkButton *button, gpointer data) {
37 map_action_set((appdata_t*)data, MAP_ACTION_WAY_NODE_ADD);
38 }
39
40 static void on_way_reverse_clicked(GtkButton *button, gpointer data) {
41 map_edit_way_reverse((appdata_t*)data);
42 }
43
44 static void on_way_cut_clicked(GtkButton *button, gpointer data) {
45 map_action_set((appdata_t*)data, MAP_ACTION_WAY_CUT);
46 }
47
48 static void on_relation_add_clicked(GtkButton *button, gpointer data) {
49 appdata_t *appdata = (appdata_t*)data;
50 relation_item_t relitem;
51
52 switch(appdata->map->selected.type) {
53 case MAP_TYPE_NODE:
54 relitem.type = NODE;
55 relitem.node = appdata->map->selected.node;
56 break;
57
58 case MAP_TYPE_WAY:
59 relitem.type = WAY;
60 relitem.way = appdata->map->selected.way;
61 break;
62
63 default:
64 break;
65 }
66
67 relation_add_dialog(appdata, &relitem);
68 }
69
70 static void on_trash_clicked(GtkButton *button, gpointer data) {
71 map_delete_selected((appdata_t*)data);
72 }
73
74 static void on_ok_clicked(GtkButton *button, gpointer data) {
75 printf("User ok\n");
76 map_action_ok((appdata_t*)data);
77 }
78
79 static void on_cancel_clicked(GtkButton *button, gpointer data) {
80 printf("User cancel\n");
81 map_action_cancel((appdata_t*)data);
82 }
83
84 /* enable/disable ok and cancel button */
85 void icon_bar_map_cancel_ok(appdata_t *appdata,
86 gboolean cancel, gboolean ok) {
87 iconbar_t *iconbar = appdata->iconbar;
88 gtk_widget_set_sensitive(iconbar->ok, ok);
89 gtk_widget_set_sensitive(iconbar->cancel, cancel);
90 }
91
92 void icon_bar_map_item_selected(appdata_t *appdata,
93 map_item_t *map_item, gboolean selected) {
94 iconbar_t *iconbar = appdata->iconbar;
95
96 gtk_widget_set_sensitive(iconbar->info, selected);
97 gtk_widget_set_sensitive(iconbar->trash, selected);
98
99 gtk_widget_set_sensitive(iconbar->relation_add, selected);
100
101 if(selected && map_item && map_item->type == MAP_TYPE_WAY) {
102 gtk_widget_set_sensitive(iconbar->way_node_add, TRUE);
103 gtk_widget_set_sensitive(iconbar->way_cut, TRUE);
104 gtk_widget_set_sensitive(iconbar->way_reverse, TRUE);
105 } else {
106 gtk_widget_set_sensitive(iconbar->way_node_add, FALSE);
107 gtk_widget_set_sensitive(iconbar->way_cut, FALSE);
108 gtk_widget_set_sensitive(iconbar->way_reverse, FALSE);
109 }
110 }
111
112 /* if a user action is on progress, then disable all buttons that */
113 /* cause an action to take place or interfere with the action */
114 void icon_bar_map_action_idle(appdata_t *appdata, gboolean idle) {
115 gint i;
116
117 /* icons that are enabled in idle mode */
118 GtkWidget *action_idle_widgets[] = {
119 appdata->iconbar->node_add,
120 appdata->iconbar->way_add,
121 NULL
122 };
123
124 /* icons that are disabled in idle mode */
125 GtkWidget *action_disable_widgets[] = {
126 appdata->iconbar->trash,
127 appdata->iconbar->info,
128 appdata->iconbar->relation_add,
129 NULL
130 };
131
132 for(i=0;action_idle_widgets[i];i++)
133 gtk_widget_set_sensitive(action_idle_widgets[i], idle);
134
135 for(i=0;action_disable_widgets[i];i++)
136 gtk_widget_set_sensitive(action_disable_widgets[i], FALSE);
137
138 /* special handling for icons that depend on further state */
139 if(!idle) {
140 gtk_widget_set_sensitive(appdata->iconbar->way_node_add, FALSE);
141 gtk_widget_set_sensitive(appdata->iconbar->way_cut, FALSE);
142 gtk_widget_set_sensitive(appdata->iconbar->way_reverse, FALSE);
143 } else {
144 if(appdata->map->selected.type == MAP_TYPE_WAY) {
145 gtk_widget_set_sensitive(appdata->iconbar->way_node_add, TRUE);
146 gtk_widget_set_sensitive(appdata->iconbar->way_cut, TRUE);
147 gtk_widget_set_sensitive(appdata->iconbar->way_reverse, TRUE);
148 } else {
149 gtk_widget_set_sensitive(appdata->iconbar->way_node_add, FALSE);
150 gtk_widget_set_sensitive(appdata->iconbar->way_cut, FALSE);
151 gtk_widget_set_sensitive(appdata->iconbar->way_reverse, FALSE);
152 }
153 }
154 }
155
156 GtkWidget *icon_add(GtkWidget *vbox, appdata_t *appdata,
157 char *icon_str,
158 void(*func)(GtkButton*, gpointer)) {
159 GtkWidget *but = gtk_button_new();
160 GtkWidget *icon = gtk_image_new_from_pixbuf(
161 icon_load(&appdata->icon, icon_str));
162 gtk_button_set_image(GTK_BUTTON(but), icon);
163 gtk_signal_connect(GTK_OBJECT(but), "clicked",
164 (GtkSignalFunc)func, appdata);
165
166 gtk_box_pack_start(GTK_BOX(vbox), but, FALSE, FALSE, 0);
167 return but;
168 }
169
170 static GtkWidget *tool_add(GtkWidget *toolbar, appdata_t *appdata,
171 char *icon_str,
172 char *tooltip_str,
173 void(*func)(GtkButton*, gpointer)) {
174 GtkWidget *item =
175 GTK_WIDGET(gtk_tool_button_new(
176 icon_widget_load(&appdata->icon, icon_str), NULL));
177
178 #ifndef USE_HILDON
179 gtk_widget_set_tooltip_text(item, tooltip_str);
180 #endif
181
182 if(func)
183 gtk_signal_connect(GTK_OBJECT(item), "clicked",
184 (GtkSignalFunc)func, appdata);
185
186 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1);
187
188 return item;
189 }
190
191 GtkWidget *iconbar_new(appdata_t *appdata) {
192 appdata->iconbar = g_new0(iconbar_t, 1);
193 iconbar_t *iconbar = appdata->iconbar;
194
195 iconbar->toolbar = gtk_toolbar_new();
196
197 #ifndef PORTRAIT
198 GtkWidget *box = gtk_vbox_new(FALSE, 0);
199 gtk_toolbar_set_orientation(GTK_TOOLBAR(iconbar->toolbar),
200 GTK_ORIENTATION_VERTICAL);
201 #else
202 GtkWidget *box = gtk_hbox_new(FALSE, 0);
203 #endif
204
205 gtk_toolbar_set_style(GTK_TOOLBAR(iconbar->toolbar), GTK_TOOLBAR_ICONS);
206
207 /* -------------------------------------------------------- */
208 iconbar->trash = tool_add(iconbar->toolbar, appdata,
209 "trash", _("Delete item"), on_trash_clicked);
210
211 /* -------------------------------------------------------- */
212 gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar),
213 gtk_separator_tool_item_new(),-1);
214 iconbar->info = tool_add(iconbar->toolbar, appdata,
215 "info", _("Properties"), on_info_clicked);
216
217 /* -------------------------------------------------------- */
218 gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar),
219 gtk_separator_tool_item_new(),-1);
220
221 iconbar->node_add = tool_add(iconbar->toolbar, appdata, "node_add",
222 _("Add node"), on_node_add_clicked);
223
224 /* -------------------------------------------------------- */
225 gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar),
226 gtk_separator_tool_item_new(),-1);
227
228 iconbar->way_add = tool_add(iconbar->toolbar, appdata, "way_add",
229 _("Add way"), on_way_add_clicked);
230 iconbar->way_node_add = tool_add(iconbar->toolbar, appdata,
231 "way_node_add", _("Add a node to a way"), on_way_node_add_clicked);
232 iconbar->way_cut = tool_add(iconbar->toolbar, appdata,
233 "way_cut", _("Split a way"), on_way_cut_clicked);
234 iconbar->way_reverse = tool_add(iconbar->toolbar, appdata,
235 "way_reverse", _("Reverse way"), on_way_reverse_clicked);
236
237 /* -------------------------------------------------------- */
238 gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar),
239 gtk_separator_tool_item_new(),-1);
240
241 iconbar->relation_add = tool_add(iconbar->toolbar, appdata,
242 "relation_add", _("Edit items relations"), on_relation_add_clicked);
243
244 gtk_box_pack_start(GTK_BOX(box), iconbar->toolbar, TRUE, TRUE, 0);
245
246 /* -------------------------------------------------------- */
247
248 GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
249 iconbar->ok = icon_add(hbox, appdata, "ok", on_ok_clicked);
250 iconbar->cancel = icon_add(hbox, appdata, "cancel", on_cancel_clicked);
251 gtk_box_pack_end(GTK_BOX(box), hbox, FALSE, FALSE, 0);
252
253 /* --------------------------------------------------------- */
254
255 icon_bar_map_item_selected(appdata, NULL, FALSE);
256 icon_bar_map_cancel_ok(appdata, FALSE, FALSE);
257
258 return box;
259 }
260
261 void iconbar_free(iconbar_t *iconbar) {
262 if(iconbar)
263 g_free(iconbar);
264 }