]> err.no Git - mapper/blob - src/settings-gui.c
Get rid of generated files
[mapper] / src / settings-gui.c
1 #include <config.h>
2
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <strings.h>
7 #include <stddef.h>
8 #include <locale.h>
9 #include <math.h>
10 #include <errno.h>
11 #include <sys/wait.h>
12 #include <glib/gstdio.h>
13 #include <gtk/gtk.h>
14 #include <fcntl.h>
15 #include <libintl.h>
16 #include <locale.h>
17 #include <sqlite3.h>
18
19 #include "hildon-mapper.h"
20
21 #include "utils.h"
22 #include "poi.h"
23 #include "gps.h"
24 #include "mapper-types.h"
25 #include "latlon.h"
26 #include "ui-common.h"
27 #include "settings.h"
28 #include "db.h"
29 #include "bluetooth-scan.h"
30 #include "osm-db.h"
31 #include "settings-gui.h"
32 #include "config-gconf.h"
33 #include "hildon-wrappers.h"
34 #include "help.h"
35 #include "dialogs.h"
36
37 typedef struct _KeysDialogInfo KeysDialogInfo;
38 struct _KeysDialogInfo {
39         GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
40 };
41
42 typedef struct _ColorsDialogInfo ColorsDialogInfo;
43 struct _ColorsDialogInfo {
44         GtkWidget *col[COLORABLE_ENUM_COUNT];
45 };
46
47 typedef struct _GpsDialogInfo GpsDialogInfo;
48 struct _GpsDialogInfo {
49         GtkWidget *cmb_gps_type;
50         GtkWidget *txt_rcvr_mac;
51         GtkWidget *spn_rcvr_port;
52         GtkWidget *btn_scan;
53         GtkTreeIter active;
54         GtkListStore *store;
55         GtkTreeIter iter;
56 };
57
58 #define UPDATE_GC(gc) gdk_gc_set_line_attributes(gc, _draw_width, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND);
59
60 void 
61 update_gcs(void)
62 {
63 #if 0
64 gint i;
65
66 for (i=0; i < COLORABLE_ENUM_COUNT; i++) {
67         gdk_color_alloc(gtk_widget_get_colormap(_map_widget), &_color[i]);
68         if (_gc[i])
69                 g_object_unref(_gc[i]);
70         _gc[i]=gdk_gc_new(gtk_map_pixmap_get());
71         gdk_gc_set_foreground(_gc[i], &_color[i]);
72         gdk_gc_set_line_attributes(_gc[i], _draw_width, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND);
73 }
74 #endif
75 }
76
77 static gboolean
78 settings_dialog_browse_forfile(GtkWidget *widget, BrowseInfo *browse_info)
79 {
80 GtkWidget *dialog;
81 gint res;
82
83 dialog=GTK_WIDGET(hildon_file_chooser_dialog_new(GTK_WINDOW(browse_info->dialog),GTK_FILE_CHOOSER_ACTION_OPEN));
84
85 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
86 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), gtk_entry_get_text(GTK_ENTRY(browse_info->txt)));
87
88 res=gtk_dialog_run(GTK_DIALOG(dialog));
89 if (res==GTK_RESPONSE_OK || res==GTK_RESPONSE_ACCEPT) {
90         gchar *filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
91         gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
92         g_free(filename);
93 }
94
95 gtk_widget_destroy(dialog);
96
97 return TRUE;
98 }
99
100 static gboolean
101 settings_dialog_hardkeys_reset(GtkWidget *widget, KeysDialogInfo *cdi)
102 {
103 GtkWidget *confirm;
104
105 confirm=hildon_note_new_confirmation(GTK_WINDOW(_window), _("Reset all hardware keys to their original defaults?"));
106
107 if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
108         gint i;
109         for (i=0; i < CUSTOM_KEY_ENUM_COUNT; i++)
110                 gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]), CUSTOM_KEY_DEFAULT[i]);
111 }
112 gtk_widget_destroy(confirm);
113 return TRUE;
114 }
115
116 gboolean 
117 settings_dialog_hardkeys(void)
118 {
119 gint i;
120 GtkWidget *dialog;
121 GtkWidget *table;
122 GtkWidget *label;
123 KeysDialogInfo bdi;
124 GtkWidget *btn_defaults;
125
126 dialog=gtk_dialog_new_with_buttons(_("Hardware Keys"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
127
128 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), btn_defaults=gtk_button_new_with_label(_("Reset...")));
129 g_signal_connect(G_OBJECT(btn_defaults), "clicked",     G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
130
131 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
132 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table=gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
133
134 for (i=0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
135         gint j;
136         gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(""), 0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
137         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
138 #ifdef WITH_HILDON
139         gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
140 #endif
141         gtk_table_attach(GTK_TABLE(table), bdi.cmb[i]=gtk_combo_box_new_text(), 1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
142                 for (j=0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
143                         gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]), CUSTOM_ACTION_TEXT[j]);
144                 gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
145 }
146
147 gtk_widget_show_all(dialog);
148
149 OUTER_WHILE:
150 while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
151         /* Check for duplicates. */
152         for (i=0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
153                 gint j;
154                 for (j=i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++) {
155                         if (gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i])) == gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[j]))) {
156                                 GtkWidget *confirm;
157                                 gchar *buffer=g_strdup_printf("%s:\n    %s\n%s", _("The following action is mapped to multiple keys"),
158                                                     CUSTOM_ACTION_TEXT[gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]))], _("Continue?"));
159                                 confirm=hildon_note_new_confirmation(GTK_WINDOW(_window), buffer);
160
161                                 if (GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(confirm)))
162                                 {
163                                         gtk_widget_destroy(confirm);
164                                         goto OUTER_WHILE;
165                                 }
166                                 gtk_widget_destroy(confirm);
167                         }
168                 }
169         }
170         for (i=0; i < CUSTOM_KEY_ENUM_COUNT; i++)
171                 _action[i]=gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
172         break;
173 }
174
175 gtk_widget_destroy(dialog);
176
177 return TRUE;
178 }
179
180 static gboolean
181 settings_dialog_colors_reset(GtkWidget *widget, ColorsDialogInfo *cdi)
182 {
183 GtkWidget *confirm;
184
185 confirm=hildon_note_new_confirmation(GTK_WINDOW(_window), _("Reset all colors to their original defaults?"));
186
187 if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
188         gint i;
189         for (i=0; i < COLORABLE_ENUM_COUNT; i++) {
190                 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi->col[i]), &COLORABLE_DEFAULT[i]);
191         }
192 }
193 gtk_widget_destroy(confirm);
194
195 return TRUE;
196 }
197
198 gboolean 
199 settings_dialog_colors(void)
200 {
201 GtkWidget *dialog;
202 GtkWidget *table;
203 GtkWidget *label;
204 GtkWidget *btn_defaults;
205 ColorsDialogInfo cdi;
206
207 dialog=gtk_dialog_new_with_buttons(_("Colors"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
208
209 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), btn_defaults=gtk_button_new_with_label(_("Reset...")));
210 g_signal_connect(G_OBJECT(btn_defaults), "clicked", G_CALLBACK(settings_dialog_colors_reset), &cdi);
211
212 gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
213 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table=gtk_table_new(4, 3, TRUE), TRUE, TRUE, 0);
214
215 /* GPS. */
216 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("GPS")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
217 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
218 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK]=gtk_color_button_new(), 1, 2, 0, 1, 0, 0, 2, 4);
219 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_MARK]), &_color[COLORABLE_MARK]);
220 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK_VELOCITY]=gtk_color_button_new(), 2, 3, 0, 1, 0, 0, 2, 4);
221 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]), &_color[COLORABLE_MARK_VELOCITY]);
222 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK_OLD]=gtk_color_button_new(), 3, 4, 0, 1, 0, 0, 2, 4);
223 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]), &_color[COLORABLE_MARK_OLD]);
224
225 /* Track. */
226 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Track")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
227 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
228 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK]=gtk_color_button_new(), 1, 2, 1, 2, 0, 0, 2, 4);
229 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]), &_color[COLORABLE_TRACK]);
230 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK_MARK]=gtk_color_button_new(), 2, 3, 1, 2, 0, 0, 2, 4);
231 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]), &_color[COLORABLE_TRACK_MARK]);
232 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK_BREAK]=gtk_color_button_new(), 3, 4, 1, 2, 0, 0, 2, 4);
233 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]), &_color[COLORABLE_TRACK_BREAK]);
234
235 /* Route. */
236 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Route")), 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
237 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
238 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE]=gtk_color_button_new(), 1, 2, 2, 3, 0, 0, 2, 4);
239 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]), &_color[COLORABLE_ROUTE]);
240 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE_WAY]=gtk_color_button_new(), 2, 3, 2, 3, 0, 0, 2, 4);
241 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]), &_color[COLORABLE_ROUTE_WAY]);
242 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE_BREAK]=gtk_color_button_new(), 3, 4, 2, 3, 0, 0, 2, 4);
243 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]), &_color[COLORABLE_ROUTE_BREAK]);
244
245 /* POI. */
246 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("POI")), 0, 1, 3, 4, GTK_FILL, 0, 2, 4);
247 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
248 gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_POI]=gtk_color_button_new(), 1, 2, 3, 4, 0, 0, 2, 4);
249 gtk_color_button_set_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_POI]), &_color[COLORABLE_POI]);
250
251 gtk_widget_show_all(dialog);
252 if (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
253         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_MARK]), &_color[COLORABLE_MARK]);
254         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]), &_color[COLORABLE_MARK_VELOCITY]);
255         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]), &_color[COLORABLE_MARK_OLD]);
256         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]), &_color[COLORABLE_TRACK]);
257         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]), &_color[COLORABLE_TRACK_MARK]);
258         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),&_color[COLORABLE_TRACK_BREAK]);
259         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),&_color[COLORABLE_ROUTE]);
260         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),&_color[COLORABLE_ROUTE_WAY]);
261         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),&_color[COLORABLE_ROUTE_BREAK]);
262         gtk_color_button_get_color(GTK_COLOR_BUTTON(cdi.col[COLORABLE_POI]),&_color[COLORABLE_POI]);
263         update_gcs();
264 }
265
266 gtk_widget_destroy(dialog);
267
268 return TRUE;
269 }
270
271 static void
272 gtk_widget_hideshow(GtkWidget *widget, gboolean show)
273 {
274 g_assert(widget);
275 if (show==TRUE)
276         gtk_widget_show(widget);
277 else
278         gtk_widget_hide(widget);
279 }
280
281 static gboolean
282 gps_type_changed_cb(GtkWidget *widget, gpointer data)
283 {
284 GpsDialogInfo *gdi=(GpsDialogInfo *)data;
285 gboolean scan, port, address;
286 GpsIOSourceType type;
287 guint dport;
288
289 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(gdi->cmb_gps_type), &gdi->iter)==FALSE)
290         return TRUE;
291
292 gtk_tree_model_get(GTK_TREE_MODEL(gdi->store), &gdi->iter, 0, &type, 2, &scan, 3, &address, 4, &port, 5, &dport, -1);
293 g_debug("GPS: %d", type);
294
295 gtk_widget_hideshow(gdi->btn_scan, scan);
296 gtk_widget_hideshow(gdi->txt_rcvr_mac, address);
297 gtk_widget_hideshow(gdi->spn_rcvr_port, port);
298 if (port && dport!=0 && (guint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(gdi->spn_rcvr_port))==0)
299         gtk_spin_button_set_value(GTK_SPIN_BUTTON(gdi->spn_rcvr_port), (guint)dport);
300
301 return TRUE;
302 }
303
304 gboolean
305 settings_dialog_gps(Gps *gps)
306 {
307 GtkWidget *dialog;
308 GtkWidget *notebook;
309 GtkWidget *vbox;
310 GtkWidget *hbox;
311 GtkWidget *label;
312 GtkCellRenderer *renderer;
313 GpsDialogInfo gdi;
314 ScanInfo scan_info={ 0 };
315 gboolean rcvr_changed=TRUE, settype=FALSE;
316 GpsTypes *gpstypes;
317 gint i=0;
318
319 /* Don't allow configuring GPS if it's connected */
320 if (gps->io.conn!=RCVR_OFF) {
321         popup_error(_window, "Disable GPS before re-configuring.");
322         return FALSE;
323 }
324
325 dialog=gtk_dialog_new_with_buttons(_("GPS Settings"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, 
326         GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
327 help_dialog_help_enable(GTK_DIALOG(dialog), HELP_ID_SETTINGS_GPS);
328
329 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook=gtk_notebook_new(), TRUE, TRUE, 0);
330
331 /* Receiver page. */
332 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox=gtk_vbox_new(FALSE, 4), label=gtk_label_new(_("GPS")));
333
334 /* Type */
335 hbox=gtk_hbox_new(FALSE, 3);
336 gtk_box_pack_start(GTK_BOX(hbox), label=gtk_label_new(_("GPS Type")), TRUE, TRUE, 0);
337 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
338
339 gdi.cmb_gps_type=gtk_combo_box_new_with_model(
340         GTK_TREE_MODEL(gtk_list_store_new(6, G_TYPE_INT, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_INT)));
341
342 gtk_box_pack_start(GTK_BOX(hbox), gdi.cmb_gps_type, TRUE, FALSE, 0);
343 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
344
345 /* Add GPS types */
346 renderer=gtk_cell_renderer_text_new();
347 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(gdi.cmb_gps_type), renderer, TRUE);
348 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(gdi.cmb_gps_type), renderer, "text", 1, NULL);
349
350 /* Receiver MAC/File/IP Address. */
351 hbox=gtk_hbox_new(FALSE, 3);
352 gtk_box_pack_start(GTK_BOX(hbox), label=gtk_label_new(_("Address: (MAC/IP/Device)")), TRUE, TRUE, 0);
353 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
354 gtk_box_pack_start(GTK_BOX(hbox), gdi.txt_rcvr_mac=gtk_entry_new(), TRUE, TRUE, 0);
355 gtk_box_pack_start(GTK_BOX(hbox), gdi.spn_rcvr_port=gtk_spin_button_new_with_range(0, 65535, 1), TRUE, TRUE, 0);
356 gtk_box_pack_start(GTK_BOX(hbox), gdi.btn_scan=gtk_button_new_with_label(_("Scan...")), FALSE, FALSE, 0);
357 gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
358
359 /* Set up the view for the combo box. */
360 gdi.store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(gdi.cmb_gps_type)));
361 gtk_list_store_clear(gdi.store);
362 gpstypes=gps_get_supported_types();
363 while (gpstypes->type!=0) {
364         gtk_list_store_append(gdi.store, &gdi.iter);
365         gtk_list_store_set(gdi.store, &gdi.iter, 
366                 0, gpstypes->type, 
367                 1, gpstypes->name, 
368                 2, gpstypes->scan, 
369                 3, gpstypes->address, 
370                 4, gpstypes->port, 
371                 5, gpstypes->port_def, 
372                 -1);
373         if (gps->io.type==gpstypes->type) {
374                 gdi.active=gdi.iter;
375                 settype=TRUE;
376         } else if (settype==FALSE && gps->io.type==GPS_IO_SIMULATION) {
377                 gdi.active=gdi.iter;
378                 settype=TRUE;
379         }
380         gpstypes++;
381 }
382
383 /* Connect signals. */
384 scan_info.settings_dialog=dialog;
385 scan_info.txt_rcvr_mac=gdi.txt_rcvr_mac;
386
387 g_signal_connect(G_OBJECT(gdi.btn_scan), "clicked", G_CALLBACK(scan_bluetooth), &scan_info);
388 g_signal_connect(G_OBJECT(gdi.cmb_gps_type), "changed", G_CALLBACK(gps_type_changed_cb), &gdi);
389
390 gtk_entry_set_text(GTK_ENTRY(gdi.txt_rcvr_mac), gps->io.address ? gps->io.address : "");
391 gtk_spin_button_set_value(GTK_SPIN_BUTTON(gdi.spn_rcvr_port), gps->io.port);
392
393 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, -1);
394 gtk_widget_show_all(dialog);
395
396 if (settype==FALSE)
397         gtk_tree_model_get_iter_first(GTK_TREE_MODEL(gdi.store), &gdi.active);
398 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(gdi.cmb_gps_type), &gdi.active);
399
400 while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
401         /* Set _rcvr_mac if necessary. */
402         if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(gdi.cmb_gps_type), &gdi.iter)==TRUE) {
403                 gtk_tree_model_get(GTK_TREE_MODEL(gdi.store), &gdi.iter, 0, &(gps->io.type), -1);
404                 g_debug("GPS: %d", gps->io.type);
405         } else {
406                 popup_error(dialog, _("Please select GPS type"));
407                 continue;
408         }
409
410         if (!*gtk_entry_get_text(GTK_ENTRY(gdi.txt_rcvr_mac))) {
411                 /* User specified no rcvr mac - set _rcvr_mac to NULL. */
412                 if (gps->io.address) {
413                         g_free(gps->io.address);
414                         gps->io.address=NULL;
415                         rcvr_changed=TRUE;
416                         set_action_sensitive("gps_details", FALSE);
417                 }
418                 gps->io.type=GPS_IO_SIMULATION;
419                 if (gps->io.type!=GPS_IO_SIMULATION) {
420                         set_action_activate("gps_details", FALSE);
421                         popup_error(dialog, _("No GPS Receiver MAC provided.\nGPS will be disabled."));
422                         rcvr_changed=TRUE;
423                         set_action_sensitive("gps_details", FALSE);
424                 }
425         } else if (!gps->io.address || strcmp(gps->io.address, gtk_entry_get_text(GTK_ENTRY(gdi.txt_rcvr_mac)))) {
426                 /* User specified a new rcvr mac. */
427                 g_free(gps->io.address);
428                 gps->io.address=g_strdup(gtk_entry_get_text(GTK_ENTRY(gdi.txt_rcvr_mac)));
429                 gps->io.port=(guint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(gdi.spn_rcvr_port));
430                 rcvr_changed=TRUE;
431         }
432
433         config_save();
434         break;
435 }
436 gtk_widget_destroy(dialog);     
437 return rcvr_changed;
438 }
439
440 /* XXX: Find a better place for this */
441 static void
442 reinit_database(gchar *newdb)
443 {
444 if (_db) {
445         poi_deinit(_db);
446         osm_deinit();
447         db_close(&_db);
448         _db=NULL;
449 }
450 if (_mapper_db) {
451         g_free(_mapper_db);
452         _mapper_db=NULL;
453 }
454 _mapper_db=newdb;
455 if (_mapper_db==NULL)
456         return;
457 db_connect(&_db, _mapper_db);
458 poi_init(&_db);
459 osm_init(&_db);
460 }
461
462 gboolean 
463 settings_dialog_osm(void)
464 {
465 GtkWidget *dialog;
466 GtkWidget *notebook;
467 GtkWidget *table;
468 GtkWidget *hbox;
469 GtkWidget *label;
470 GtkWidget *txt_mapper_db;
471 GtkWidget *btn_browsedb;
472 GtkWidget *num_sens;
473 BrowseInfo browse_info={ 0, 0 };
474
475 dialog=gtk_dialog_new_with_buttons(_("OSM Settings"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, 
476                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
477 help_dialog_help_enable(GTK_DIALOG(dialog), HELP_ID_SETTINGS_OSM);
478
479 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook=gtk_notebook_new(), TRUE, TRUE, 0);
480
481 /* Database page */
482 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("Database")));
483
484 /* Database. */
485 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Database")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
486 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
487 gtk_table_attach(GTK_TABLE(table), hbox=gtk_hbox_new(FALSE, 4), 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
488 gtk_box_pack_start(GTK_BOX(hbox), txt_mapper_db=gtk_entry_new(), TRUE, TRUE, 0);
489 gtk_box_pack_start(GTK_BOX(hbox), btn_browsedb=gtk_button_new_with_label(_("Browse...")), FALSE, FALSE, 0);
490
491 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("Advanced")));
492
493 /* Advanced */
494 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Sensitivity")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
495 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
496 gtk_table_attach(GTK_TABLE(table), num_sens=hildon_controlbar_new(), 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
497 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_sens), 1, 10);
498 force_min_visible_bars(HILDON_CONTROLBAR(num_sens), 1);
499
500 gtk_entry_set_text(GTK_ENTRY(txt_mapper_db), _mapper_db ? _mapper_db : "");
501 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_sens), _map_location_sens);
502
503 browse_info.dialog=dialog;
504 browse_info.txt=txt_mapper_db;
505 g_signal_connect(G_OBJECT(btn_browsedb), "clicked", G_CALLBACK(settings_dialog_browse_forfile), &browse_info);
506
507 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
508 gtk_widget_show_all(dialog);
509
510 if (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
511         _map_location_sens=hildon_controlbar_get_value(HILDON_CONTROLBAR(num_sens));
512         if (strlen(gtk_entry_get_text(GTK_ENTRY(txt_mapper_db)))>0) {
513                 gchar *tmp;
514                 tmp=g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_mapper_db)));
515                 if (tmp && _mapper_db && strcmp(tmp, _mapper_db)!=0) {
516                         reinit_database(tmp);
517                 }
518         } else {
519                 reinit_database(NULL);
520         }
521         config_save();
522 }
523 gtk_widget_destroy(dialog);     
524
525 /* Sensitize menus based on whether we have a database conn. */
526 gtk_widget_set_sensitive(_cmenu_loc_add_poi, _db != NULL);
527 gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
528 gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
529
530 return TRUE;
531 }
532
533 /**
534  * Bring up the Settings dialog.
535  */
536 gboolean 
537 settings_dialog()
538 {
539 GtkWidget *dialog;
540 GtkWidget *notebook;
541 GtkWidget *table;
542 GtkWidget *hbox;
543 GtkWidget *vbox;
544 GtkWidget *hbox2;
545 GtkWidget *label;
546 GtkWidget *num_center_ratio;
547 GtkWidget *num_lead_ratio;
548 GtkWidget *num_announce_notice;
549 GtkWidget *chk_enable_voice;
550 GtkWidget *num_voice_speed;
551 GtkWidget *num_voice_pitch;
552 GtkWidget *lbl_voice_speed;
553 GtkWidget *lbl_voice_pitch;
554 GtkWidget *num_draw_width;
555 GtkWidget *chk_always_keep_on;
556 GtkWidget *cmb_units;
557 GtkWidget *cmb_degformat;
558 GtkWidget *btn_buttons;
559 GtkWidget *num_poi_zoom;
560 GtkWidget *chk_speed_on;
561 GtkWidget *num_speed;
562 GtkWidget *cmb_info_font_size;
563
564 GtkWidget *announce_destination;
565 GtkWidget *announce_overspeed;
566 GtkWidget *announce_waypoints;
567 guint i;
568
569 dialog=gtk_dialog_new_with_buttons(_("Settings"), GTK_WINDOW(_window), GTK_DIALOG_MODAL, 
570         GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL);
571 help_dialog_help_enable(GTK_DIALOG(dialog), HELP_ID_SETTINGS);
572
573 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook=gtk_notebook_new(), TRUE, TRUE, 0);
574
575 /* Auto-Center page. */
576 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 2, FALSE), label=gtk_label_new(_("Auto-Center")));
577
578 /* Auto-Center Sensitivity. */
579 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Sensitivity")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
580 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
581 gtk_table_attach(GTK_TABLE(table), num_center_ratio=hildon_controlbar_new(), 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
582 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1, 10);
583 force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
584
585 /* Lead Amount. */
586 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Lead Amount")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
587 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
588
589 gtk_table_attach(GTK_TABLE(table), num_lead_ratio=hildon_controlbar_new(), 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
590 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
591 force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
592
593 /* Announcement page */
594 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("Announce")));
595
596 /* Announcement Advance Notice. */
597 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Advance Notice")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
598 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
599 gtk_table_attach(GTK_TABLE(table), num_announce_notice=hildon_controlbar_new(), 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
600 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_announce_notice), 1, 20);
601 force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
602
603 gtk_table_attach(GTK_TABLE(table), vbox=gtk_vbox_new(FALSE, 4), 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 6);
604 gtk_box_pack_start(GTK_BOX(vbox), announce_waypoints=gtk_check_button_new_with_label(_("Enable waypoint announcements")), TRUE, TRUE, 4);
605 gtk_box_pack_start(GTK_BOX(vbox), announce_destination=gtk_check_button_new_with_label(_("Enable destination announcements")), TRUE, TRUE, 4);
606 gtk_box_pack_start(GTK_BOX(vbox), announce_overspeed=gtk_check_button_new_with_label(_("Enable overspeed announcements")), TRUE, TRUE, 4);
607
608 /* Voice page */
609 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("Voice")));
610
611 /* Enable Voice. */
612 gtk_table_attach(GTK_TABLE(table), chk_enable_voice=gtk_check_button_new_with_label(_("Enable Voice Synthesis")), 0, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
613 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice), _enable_voice);
614
615 /* Voice Speed and Pitch. */
616 gtk_table_attach(GTK_TABLE(table), hbox=gtk_hbox_new(FALSE, 4), 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 6);
617 gtk_box_pack_start(GTK_BOX(hbox), hbox2=gtk_hbox_new(FALSE, 4), TRUE, TRUE, 4);
618 gtk_box_pack_start(GTK_BOX(hbox2), lbl_voice_speed=gtk_label_new(_("Speed (words/minute)")), TRUE, TRUE, 0);
619 gtk_box_pack_start(GTK_BOX(hbox2), num_voice_speed=hildon_number_editor_new(80, 370), TRUE, TRUE, 0);
620 gtk_box_pack_start(GTK_BOX(hbox), hbox2=gtk_hbox_new(FALSE, 4), TRUE, TRUE, 4);
621 gtk_box_pack_start(GTK_BOX(hbox2), lbl_voice_pitch=gtk_label_new(_("Pitch")), TRUE, TRUE, 0);
622 gtk_box_pack_start(GTK_BOX(hbox2), num_voice_pitch=hildon_number_editor_new(1, 99), TRUE, TRUE, 0);
623
624 #ifndef WITH_ESPEAK
625 gtk_widget_set_sensitive(chk_enable_voice, FALSE);
626 gtk_widget_set_sensitive(num_voice_speed, FALSE);
627 gtk_widget_set_sensitive(num_voice_pitch, FALSE);
628 #endif
629
630 /* Display settings page. */
631 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("Display")));
632
633 /* Line Width. */
634 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Line Width")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
635 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
636 gtk_table_attach(GTK_TABLE(table), num_draw_width=hildon_controlbar_new(), 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
637 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
638 force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
639
640 /* Keep Display On Only When Fullscreen. */
641 gtk_table_attach(GTK_TABLE(table), chk_always_keep_on=gtk_check_button_new_with_label(_("Keep Display On Only in Fullscreen Mode")), 0, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
642
643 /* Information Font Size. */
644 gtk_table_attach(GTK_TABLE(table), hbox=gtk_hbox_new(FALSE, 4), 0, 2, 2, 3, GTK_FILL, 0, 2, 4);
645 gtk_box_pack_start(GTK_BOX(hbox), label=gtk_label_new(_("Information Font Size")), FALSE, FALSE, 0);
646 gtk_box_pack_start(GTK_BOX(hbox), cmb_info_font_size=gtk_combo_box_new_text(), FALSE, FALSE, 0);
647 for (i=0; i < INFO_FONT_ENUM_COUNT; i++)
648         gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size), INFO_FONT_TEXT[i]);
649
650 /* Units page. */
651 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("Units")));
652
653 /* Units. */
654 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Units")), 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
655 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
656 gtk_table_attach(GTK_TABLE(table), cmb_units=gtk_combo_box_new_text(), 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
657 for (i=0; i < UNITS_ENUM_COUNT; i++)
658         gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_units), UNITS_TEXT[i]);
659
660 /* Degrees format */
661 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Degrees Format")), 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
662 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
663 gtk_table_attach(GTK_TABLE(table), label=gtk_alignment_new(0.f, 0.5f, 0.f, 0.f), 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
664 gtk_container_add(GTK_CONTAINER(label), cmb_degformat=gtk_combo_box_new_text());
665 for (i=0; i < DEG_FORMAT_ENUM_COUNT; i++)
666         gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat), DEG_FORMAT_TEXT[i]);
667 gtk_table_attach(GTK_TABLE(table), gtk_label_new(""), 2, 3, 0, 2, GTK_FILL | GTK_EXPAND, 0, 2, 4);
668
669 /* Speed warner. */
670 gtk_table_attach(GTK_TABLE(table), hbox=gtk_hbox_new(FALSE, 4), 0, 3, 2, 3, GTK_FILL, 0, 2, 4);
671 gtk_box_pack_start(GTK_BOX(hbox), chk_speed_on=gtk_check_button_new_with_label(_("Display Speed")), FALSE, FALSE, 0);
672 gtk_box_pack_start(GTK_BOX(hbox), label=gtk_alignment_new(0.f, 0.5f, 0.f, 0.f), FALSE, FALSE, 0);
673 gtk_container_add(GTK_CONTAINER(label), num_speed=hildon_number_editor_new(0, 999));
674
675 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table=gtk_table_new(2, 3, FALSE), label=gtk_label_new(_("POIs")));
676
677 /* Show POI below zoom. */
678 gtk_table_attach(GTK_TABLE(table), label=gtk_label_new(_("Show POI below zoom")), 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
679 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
680 gtk_table_attach(GTK_TABLE(table), label=gtk_alignment_new(0.f, 0.5f, 0.f, 0.f), 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
681 gtk_container_add(GTK_CONTAINER(label), num_poi_zoom=hildon_number_editor_new(0, 7));
682
683 /* Initialize fields. */
684 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom), _poi_zoom);
685 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio), _center_ratio);
686 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio), _lead_ratio);
687 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice), _announce_notice_ratio);
688 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_voice_speed), _voice_speed);
689 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_voice_pitch), _voice_pitch);
690 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width), _draw_width);
691 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_always_keep_on), !_always_keep_on);
692 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
693 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
694 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_on), _speed_on);
695 hildon_number_editor_set_range(HILDON_NUMBER_EDITOR(num_speed), 1, 300);
696 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed), _speed_limit);
697 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size), _info_font_size);
698
699 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
700 gtk_widget_show_all(dialog);
701
702 if (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
703         _center_ratio=hildon_controlbar_get_value(HILDON_CONTROLBAR(num_center_ratio));
704         _lead_ratio=hildon_controlbar_get_value(HILDON_CONTROLBAR(num_lead_ratio));
705         _draw_width=hildon_controlbar_get_value(HILDON_CONTROLBAR(num_draw_width));
706         _always_keep_on=!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_always_keep_on));
707         _units=gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
708         _degformat=gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
709         _speed_on=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_speed_on));
710         _speed_limit=hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_speed));
711         _info_font_size=gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_info_font_size));
712         _announce_notice_ratio=hildon_controlbar_get_value(HILDON_CONTROLBAR(num_announce_notice));
713         _voice_speed=hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_voice_speed));
714         _voice_pitch=hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_voice_pitch));
715         _enable_voice=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_enable_voice));
716         _poi_zoom=hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_poi_zoom));
717
718         speak_set_parameters(_voice_speed, _voice_pitch);
719         update_gcs();
720         config_save();
721 }
722
723 #ifndef WITH_HILDON
724 /* Destroying causes a crash (!?!?!??!)  huh? in hildon (770?) only, plain gtk is ok...*/
725 gtk_widget_destroy(dialog);     
726 #else
727 gtk_widget_hide(dialog);
728 #endif
729
730 return FALSE;
731 }