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