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