Parent Directory | Revision Log
Enabled api 0.6 support
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 | |
51 | g_assert((appdata->map->selected.object.type == NODE) || |
52 | (appdata->map->selected.object.type == WAY)); |
53 | |
54 | relation_add_dialog(appdata, &appdata->map->selected.object); |
55 | } |
56 | |
57 | static void on_trash_clicked(GtkButton *button, gpointer data) { |
58 | map_delete_selected((appdata_t*)data); |
59 | } |
60 | |
61 | static void on_ok_clicked(GtkButton *button, gpointer data) { |
62 | printf("User ok\n"); |
63 | map_action_ok((appdata_t*)data); |
64 | } |
65 | |
66 | static void on_cancel_clicked(GtkButton *button, gpointer data) { |
67 | printf("User cancel\n"); |
68 | map_action_cancel((appdata_t*)data); |
69 | } |
70 | |
71 | /* enable/disable ok and cancel button */ |
72 | void icon_bar_map_cancel_ok(appdata_t *appdata, |
73 | gboolean cancel, gboolean ok) { |
74 | iconbar_t *iconbar = appdata->iconbar; |
75 | gtk_widget_set_sensitive(iconbar->ok, ok); |
76 | gtk_widget_set_sensitive(iconbar->cancel, cancel); |
77 | } |
78 | |
79 | void icon_bar_map_item_selected(appdata_t *appdata, |
80 | map_item_t *map_item, gboolean selected) { |
81 | iconbar_t *iconbar = appdata->iconbar; |
82 | |
83 | /* one can't remove relations by clicking this while they are */ |
84 | /* selected. May change in the future */ |
85 | if(selected && (!map_item || map_item->object.type != RELATION)) |
86 | gtk_widget_set_sensitive(iconbar->trash, TRUE); |
87 | else |
88 | gtk_widget_set_sensitive(iconbar->trash, FALSE); |
89 | |
90 | gtk_widget_set_sensitive(iconbar->info, map_item && selected); |
91 | |
92 | gtk_widget_set_sensitive(iconbar->relation_add, map_item && selected); |
93 | |
94 | if(selected && map_item && map_item->object.type == WAY) { |
95 | gtk_widget_set_sensitive(iconbar->way_node_add, TRUE); |
96 | gtk_widget_set_sensitive(iconbar->way_cut, TRUE); |
97 | gtk_widget_set_sensitive(iconbar->way_reverse, TRUE); |
98 | } else { |
99 | gtk_widget_set_sensitive(iconbar->way_node_add, FALSE); |
100 | gtk_widget_set_sensitive(iconbar->way_cut, FALSE); |
101 | gtk_widget_set_sensitive(iconbar->way_reverse, FALSE); |
102 | } |
103 | } |
104 | |
105 | /* if a user action is on progress, then disable all buttons that */ |
106 | /* cause an action to take place or interfere with the action */ |
107 | void icon_bar_map_action_idle(appdata_t *appdata, gboolean idle) { |
108 | gint i; |
109 | |
110 | /* icons that are enabled in idle mode */ |
111 | GtkWidget *action_idle_widgets[] = { |
112 | appdata->iconbar->node_add, |
113 | appdata->iconbar->way_add, |
114 | NULL |
115 | }; |
116 | |
117 | /* icons that are disabled in idle mode */ |
118 | GtkWidget *action_disable_widgets[] = { |
119 | appdata->iconbar->trash, |
120 | appdata->iconbar->info, |
121 | appdata->iconbar->relation_add, |
122 | NULL |
123 | }; |
124 | |
125 | for(i=0;action_idle_widgets[i];i++) |
126 | gtk_widget_set_sensitive(action_idle_widgets[i], idle); |
127 | |
128 | for(i=0;action_disable_widgets[i];i++) |
129 | gtk_widget_set_sensitive(action_disable_widgets[i], FALSE); |
130 | |
131 | /* special handling for icons that depend on further state */ |
132 | if(!idle) { |
133 | gtk_widget_set_sensitive(appdata->iconbar->way_node_add, FALSE); |
134 | gtk_widget_set_sensitive(appdata->iconbar->way_cut, FALSE); |
135 | gtk_widget_set_sensitive(appdata->iconbar->way_reverse, FALSE); |
136 | } else { |
137 | if(appdata->map->selected.object.type == WAY) { |
138 | gtk_widget_set_sensitive(appdata->iconbar->way_node_add, TRUE); |
139 | gtk_widget_set_sensitive(appdata->iconbar->way_cut, TRUE); |
140 | gtk_widget_set_sensitive(appdata->iconbar->way_reverse, TRUE); |
141 | } else { |
142 | gtk_widget_set_sensitive(appdata->iconbar->way_node_add, FALSE); |
143 | gtk_widget_set_sensitive(appdata->iconbar->way_cut, FALSE); |
144 | gtk_widget_set_sensitive(appdata->iconbar->way_reverse, FALSE); |
145 | } |
146 | } |
147 | } |
148 | |
149 | GtkWidget *icon_add(GtkWidget *vbox, appdata_t *appdata, |
150 | char *icon_str, |
151 | void(*func)(GtkButton*, gpointer)) { |
152 | GtkWidget *but = gtk_button_new(); |
153 | GtkWidget *icon = gtk_image_new_from_pixbuf( |
154 | icon_load(&appdata->icon, icon_str)); |
155 | gtk_button_set_image(GTK_BUTTON(but), icon); |
156 | gtk_signal_connect(GTK_OBJECT(but), "clicked", |
157 | (GtkSignalFunc)func, appdata); |
158 | |
159 | gtk_box_pack_start(GTK_BOX(vbox), but, FALSE, FALSE, 0); |
160 | return but; |
161 | } |
162 | |
163 | static GtkWidget *tool_add(GtkWidget *toolbar, appdata_t *appdata, |
164 | char *icon_str, |
165 | char *tooltip_str, |
166 | void(*func)(GtkButton*, gpointer)) { |
167 | GtkWidget *item = |
168 | GTK_WIDGET(gtk_tool_button_new( |
169 | icon_widget_load(&appdata->icon, icon_str), NULL)); |
170 | |
171 | #ifndef USE_HILDON |
172 | gtk_widget_set_tooltip_text(item, tooltip_str); |
173 | #endif |
174 | |
175 | if(func) |
176 | gtk_signal_connect(GTK_OBJECT(item), "clicked", |
177 | (GtkSignalFunc)func, appdata); |
178 | |
179 | gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), -1); |
180 | |
181 | #ifdef USE_HILDON |
182 | #if MAEMO_VERSION_MAJOR == 5 |
183 | gtk_widget_set_size_request(GTK_WIDGET(item), -1, 40); |
184 | #endif |
185 | #endif |
186 | |
187 | return item; |
188 | } |
189 | |
190 | GtkWidget *iconbar_new(appdata_t *appdata) { |
191 | appdata->iconbar = g_new0(iconbar_t, 1); |
192 | iconbar_t *iconbar = appdata->iconbar; |
193 | |
194 | iconbar->toolbar = gtk_toolbar_new(); |
195 | |
196 | #ifndef PORTRAIT |
197 | GtkWidget *box = gtk_vbox_new(FALSE, 0); |
198 | gtk_toolbar_set_orientation(GTK_TOOLBAR(iconbar->toolbar), |
199 | GTK_ORIENTATION_VERTICAL); |
200 | #else |
201 | GtkWidget *box = gtk_hbox_new(FALSE, 0); |
202 | #endif |
203 | |
204 | gtk_toolbar_set_style(GTK_TOOLBAR(iconbar->toolbar), GTK_TOOLBAR_ICONS); |
205 | |
206 | /* -------------------------------------------------------- */ |
207 | iconbar->trash = tool_add(iconbar->toolbar, appdata, |
208 | "trash", _("Delete item"), on_trash_clicked); |
209 | |
210 | /* -------------------------------------------------------- */ |
211 | gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar), |
212 | gtk_separator_tool_item_new(),-1); |
213 | iconbar->info = tool_add(iconbar->toolbar, appdata, |
214 | "info", _("Properties"), on_info_clicked); |
215 | |
216 | /* -------------------------------------------------------- */ |
217 | gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar), |
218 | gtk_separator_tool_item_new(),-1); |
219 | |
220 | iconbar->node_add = tool_add(iconbar->toolbar, appdata, "node_add", |
221 | _("Add node"), on_node_add_clicked); |
222 | |
223 | /* -------------------------------------------------------- */ |
224 | gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar), |
225 | gtk_separator_tool_item_new(),-1); |
226 | |
227 | iconbar->way_add = tool_add(iconbar->toolbar, appdata, "way_add", |
228 | _("Add way"), on_way_add_clicked); |
229 | iconbar->way_node_add = tool_add(iconbar->toolbar, appdata, |
230 | "way_node_add", _("Add a node to a way"), on_way_node_add_clicked); |
231 | iconbar->way_cut = tool_add(iconbar->toolbar, appdata, |
232 | "way_cut", _("Split a way"), on_way_cut_clicked); |
233 | iconbar->way_reverse = tool_add(iconbar->toolbar, appdata, |
234 | "way_reverse", _("Reverse way"), on_way_reverse_clicked); |
235 | |
236 | /* -------------------------------------------------------- */ |
237 | gtk_toolbar_insert(GTK_TOOLBAR(iconbar->toolbar), |
238 | gtk_separator_tool_item_new(),-1); |
239 | |
240 | iconbar->relation_add = tool_add(iconbar->toolbar, appdata, |
241 | "relation_add", _("Edit item's relations"), on_relation_add_clicked); |
242 | |
243 | gtk_box_pack_start(GTK_BOX(box), iconbar->toolbar, TRUE, TRUE, 0); |
244 | |
245 | /* -------------------------------------------------------- */ |
246 | |
247 | GtkWidget *hbox = gtk_hbox_new(FALSE, 0); |
248 | |
249 | #ifdef USE_HILDON |
250 | gtk_widget_set_size_request(GTK_WIDGET(hbox), -1, 32); |
251 | #endif |
252 | |
253 | iconbar->ok = icon_add(hbox, appdata, "ok", on_ok_clicked); |
254 | // gtk_button_set_relief(GTK_BUTTON(iconbar->ok), GTK_RELIEF_NONE); |
255 | #ifdef USE_HILDON |
256 | #if MAEMO_VERSION_MAJOR == 5 |
257 | g_object_set(iconbar->ok, "border-width", 0, NULL ); |
258 | gtk_widget_set_size_request(GTK_WIDGET(iconbar->ok), 32, -1); |
259 | #endif |
260 | #endif |
261 | |
262 | iconbar->cancel = icon_add(hbox, appdata, "cancel", on_cancel_clicked); |
263 | // gtk_button_set_relief(GTK_BUTTON(iconbar->cancel), GTK_RELIEF_NONE); |
264 | #ifdef USE_HILDON |
265 | #if MAEMO_VERSION_MAJOR == 5 |
266 | g_object_set(iconbar->cancel, "border-width", 0, NULL ); |
267 | gtk_widget_set_size_request(GTK_WIDGET(iconbar->cancel), 32, -1); |
268 | #endif |
269 | #endif |
270 | |
271 | gtk_box_pack_end(GTK_BOX(box), hbox, FALSE, FALSE, 0); |
272 | |
273 | /* --------------------------------------------------------- */ |
274 | |
275 | icon_bar_map_item_selected(appdata, NULL, FALSE); |
276 | icon_bar_map_cancel_ok(appdata, FALSE, FALSE); |
277 | |
278 | return box; |
279 | } |
280 | |
281 | void iconbar_free(iconbar_t *iconbar) { |
282 | if(iconbar) |
283 | g_free(iconbar); |
284 | } |