]> err.no Git - mapper/blob - src/settings-gui.c
Remove more references to POIs in variables
[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 "utils.h"
26 #include "poi.h"
27 #include "gps.h"
28 #include "map.h"
29 #include "mapper-types.h"
30 #include "bt.h"
31 #include "ui-common.h"
32 #include "settings.h"
33 #include "db.h"
34
35 #include "hildon-wrappers.h"
36
37 gboolean
38 settings_dialog_browse_forfile(GtkWidget * widget, BrowseInfo * browse_info)
39 {
40         GtkWidget *dialog;
41         gint res;
42         printf("%s()\n", __PRETTY_FUNCTION__);
43
44         dialog =
45             GTK_WIDGET(hildon_file_chooser_dialog_new
46                        (GTK_WINDOW(browse_info->dialog),
47                         GTK_FILE_CHOOSER_ACTION_OPEN));
48
49         gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
50         gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
51                                             gtk_entry_get_text(GTK_ENTRY
52                                                                (browse_info->
53                                                                 txt)));
54
55         res=gtk_dialog_run(GTK_DIALOG(dialog));
56         if (res==GTK_RESPONSE_OK || res==GTK_RESPONSE_ACCEPT) {
57                 gchar *filename =
58                     gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
59                 gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
60                 g_free(filename);
61         }
62
63         gtk_widget_destroy(dialog);
64
65         vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
66         return TRUE;
67 }
68
69 typedef struct _KeysDialogInfo KeysDialogInfo;
70 struct _KeysDialogInfo {
71         GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
72 };
73
74 gboolean
75 settings_dialog_hardkeys_reset(GtkWidget * widget, KeysDialogInfo * cdi)
76 {
77         GtkWidget *confirm;
78         printf("%s()\n", __PRETTY_FUNCTION__);
79
80         confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
81                                                _
82                                                ("Reset all hardware keys to their original defaults?"));
83
84         if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
85                 gint i;
86                 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
87                         gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]),
88                                                  CUSTOM_KEY_DEFAULT[i]);
89         }
90         gtk_widget_destroy(confirm);
91
92         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
93         return TRUE;
94 }
95
96 gboolean settings_dialog_hardkeys(GtkWidget * widget, GtkWidget * parent)
97 {
98         gint i;
99         GtkWidget *dialog;
100         GtkWidget *table;
101         GtkWidget *label;
102         KeysDialogInfo bdi;
103         GtkWidget *btn_defaults;
104         printf("%s()\n", __PRETTY_FUNCTION__);
105
106         dialog = gtk_dialog_new_with_buttons(_("Hardware Keys"),
107                                              GTK_WINDOW(parent),
108                                              GTK_DIALOG_MODAL, GTK_STOCK_OK,
109                                              GTK_RESPONSE_ACCEPT, NULL);
110
111         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
112                           btn_defaults =
113                           gtk_button_new_with_label(_("Reset...")));
114         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
115                          G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
116
117         gtk_dialog_add_button(GTK_DIALOG(dialog),
118                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
119
120         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
121                            table = gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
122
123         for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
124                 gint j;
125                 gtk_table_attach(GTK_TABLE(table),
126                                  label = gtk_label_new(""),
127                                  0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
128                 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
129 #if 0
130                 gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
131 #endif
132                 gtk_table_attach(GTK_TABLE(table),
133                                  bdi.cmb[i] = gtk_combo_box_new_text(),
134                                  1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
135                 for (j = 0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
136                         gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]),
137                                                   CUSTOM_ACTION_TEXT[j]);
138                 gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
139         }
140
141         gtk_widget_show_all(dialog);
142
143       OUTER_WHILE:
144         while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
145                 /* Check for duplicates. */
146                 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
147                         gint j;
148                         for (j = i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++) {
149                                 if (gtk_combo_box_get_active
150                                     (GTK_COMBO_BOX(bdi.cmb[i]))
151                                     ==
152                                     gtk_combo_box_get_active(GTK_COMBO_BOX
153                                                              (bdi.cmb[j]))) {
154                                         GtkWidget *confirm;
155                                         gchar *buffer =
156                                             g_strdup_printf("%s:\n    %s\n%s",
157                                                             _
158                                                             ("The following action is mapped to multiple keys"),
159                                                             CUSTOM_ACTION_TEXT
160                                                             [gtk_combo_box_get_active
161                                                              (GTK_COMBO_BOX
162                                                               (bdi.cmb[i]))],
163                                                             _("Continue?"));
164                                         confirm =
165                                             hildon_note_new_confirmation
166                                             (GTK_WINDOW(_window), buffer);
167
168                                         if (GTK_RESPONSE_OK !=
169                                             gtk_dialog_run(GTK_DIALOG(confirm)))
170                                         {
171                                                 gtk_widget_destroy(confirm);
172                                                 goto OUTER_WHILE;
173                                         }
174                                         gtk_widget_destroy(confirm);
175                                 }
176                         }
177                 }
178                 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
179                         _action[i] =
180                             gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
181                 break;
182         }
183
184         gtk_widget_destroy(dialog);
185
186         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
187         return TRUE;
188 }
189
190 typedef struct _ColorsDialogInfo ColorsDialogInfo;
191 struct _ColorsDialogInfo {
192         GtkWidget *col[COLORABLE_ENUM_COUNT];
193 };
194
195 gboolean
196 settings_dialog_colors_reset(GtkWidget * widget, ColorsDialogInfo * cdi)
197 {
198         GtkWidget *confirm;
199         printf("%s()\n", __PRETTY_FUNCTION__);
200
201         confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
202                                                _
203                                                ("Reset all colors to their original defaults?"));
204
205         if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
206                 gint i;
207                 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
208                         gtk_color_button_set_color(GTK_COLOR_BUTTON
209                                                       (cdi->col[i]),
210                                                       &COLORABLE_DEFAULT[i]);
211                 }
212         }
213         gtk_widget_destroy(confirm);
214
215         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
216         return TRUE;
217 }
218
219 gboolean settings_dialog_colors(GtkWidget * widget, GtkWidget * parent)
220 {
221         GtkWidget *dialog;
222         GtkWidget *table;
223         GtkWidget *label;
224         GtkWidget *btn_defaults;
225         ColorsDialogInfo cdi;
226         printf("%s()\n", __PRETTY_FUNCTION__);
227
228         dialog = gtk_dialog_new_with_buttons(_("Colors"),
229                                              GTK_WINDOW(parent),
230                                              GTK_DIALOG_MODAL, GTK_STOCK_OK,
231                                              GTK_RESPONSE_ACCEPT, NULL);
232
233         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
234                           btn_defaults = gtk_button_new_with_label(_("Reset...")));
235         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
236                          G_CALLBACK(settings_dialog_colors_reset), &cdi);
237
238         gtk_dialog_add_button(GTK_DIALOG(dialog),
239                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
240
241         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
242                            table = gtk_table_new(4, 3, TRUE), TRUE, TRUE, 0);
243
244         /* GPS. */
245         gtk_table_attach(GTK_TABLE(table),
246                          label = gtk_label_new(_("GPS")),
247                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
248         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
249         gtk_table_attach(GTK_TABLE(table),
250                          cdi.col[COLORABLE_MARK] = gtk_color_button_new(),
251                          1, 2, 0, 1, 0, 0, 2, 4);
252         gtk_color_button_set_color(GTK_COLOR_BUTTON
253                                       (cdi.col[COLORABLE_MARK]),
254                                       &_color[COLORABLE_MARK]);
255         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK_VELOCITY] =
256                          gtk_color_button_new(), 2, 3, 0, 1, 0, 0, 2, 4);
257         gtk_color_button_set_color(GTK_COLOR_BUTTON
258                                       (cdi.col[COLORABLE_MARK_VELOCITY]),
259                                       &_color[COLORABLE_MARK_VELOCITY]);
260         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK_OLD] =
261                          gtk_color_button_new(), 3, 4, 0, 1, 0, 0, 2, 4);
262         gtk_color_button_set_color(GTK_COLOR_BUTTON
263                                       (cdi.col[COLORABLE_MARK_OLD]),
264                                       &_color[COLORABLE_MARK_OLD]);
265
266         /* Track. */
267         gtk_table_attach(GTK_TABLE(table),
268                          label = gtk_label_new(_("Track")),
269                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
270         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
271         gtk_table_attach(GTK_TABLE(table),
272                          cdi.col[COLORABLE_TRACK] = gtk_color_button_new(),
273                          1, 2, 1, 2, 0, 0, 2, 4);
274         gtk_color_button_set_color(GTK_COLOR_BUTTON
275                                       (cdi.col[COLORABLE_TRACK]),
276                                       &_color[COLORABLE_TRACK]);
277         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK_MARK] =
278                          gtk_color_button_new(), 2, 3, 1, 2, 0, 0, 2, 4);
279         gtk_color_button_set_color(GTK_COLOR_BUTTON
280                                       (cdi.col[COLORABLE_TRACK_MARK]),
281                                       &_color[COLORABLE_TRACK_MARK]);
282         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK_BREAK] =
283                          gtk_color_button_new(), 3, 4, 1, 2, 0, 0, 2, 4);
284         gtk_color_button_set_color(GTK_COLOR_BUTTON
285                                       (cdi.col[COLORABLE_TRACK_BREAK]),
286                                       &_color[COLORABLE_TRACK_BREAK]);
287
288         /* Route. */
289         gtk_table_attach(GTK_TABLE(table),
290                          label = gtk_label_new(_("Route")),
291                          0, 1, 2, 3, GTK_FILL, 0, 2, 4);
292         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
293         gtk_table_attach(GTK_TABLE(table),
294                          cdi.col[COLORABLE_ROUTE] = gtk_color_button_new(),
295                          1, 2, 2, 3, 0, 0, 2, 4);
296         gtk_color_button_set_color(GTK_COLOR_BUTTON
297                                       (cdi.col[COLORABLE_ROUTE]),
298                                       &_color[COLORABLE_ROUTE]);
299         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE_WAY] =
300                          gtk_color_button_new(), 2, 3, 2, 3, 0, 0, 2, 4);
301         gtk_color_button_set_color(GTK_COLOR_BUTTON
302                                       (cdi.col[COLORABLE_ROUTE_WAY]),
303                                       &_color[COLORABLE_ROUTE_WAY]);
304         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE_BREAK] =
305                          gtk_color_button_new(), 3, 4, 2, 3, 0, 0, 2, 4);
306         gtk_color_button_set_color(GTK_COLOR_BUTTON
307                                       (cdi.col[COLORABLE_ROUTE_BREAK]),
308                                       &_color[COLORABLE_ROUTE_BREAK]);
309
310         /* POI. */
311         gtk_table_attach(GTK_TABLE(table),
312                          label = gtk_label_new(_("POI")),
313                          0, 1, 3, 4, GTK_FILL, 0, 2, 4);
314         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
315         gtk_table_attach(GTK_TABLE(table),
316                          cdi.col[COLORABLE_POI] = gtk_color_button_new(),
317                          1, 2, 3, 4, 0, 0, 2, 4);
318         gtk_color_button_set_color(GTK_COLOR_BUTTON
319                                       (cdi.col[COLORABLE_POI]),
320                                       &_color[COLORABLE_POI]);
321
322         gtk_widget_show_all(dialog);
323
324         while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
325                 GdkColor *color;
326
327                 gtk_color_button_get_color(GTK_COLOR_BUTTON
328                                                   (cdi.col[COLORABLE_MARK]),color);
329                 _color[COLORABLE_MARK] = *color;
330
331                 gtk_color_button_get_color(GTK_COLOR_BUTTON
332                                                   (cdi.col[COLORABLE_MARK_VELOCITY]) ,color);
333                 _color[COLORABLE_MARK_VELOCITY] = *color;
334
335                 gtk_color_button_get_color(GTK_COLOR_BUTTON
336                                                   (cdi.col[COLORABLE_MARK_OLD]),color);
337                 _color[COLORABLE_MARK_OLD] = *color;
338
339                 gtk_color_button_get_color(GTK_COLOR_BUTTON
340                                                   (cdi.col[COLORABLE_TRACK]),color);
341                 _color[COLORABLE_TRACK] = *color;
342
343                 gtk_color_button_get_color(GTK_COLOR_BUTTON
344                                                   (cdi.col[COLORABLE_TRACK_MARK]),color);
345                 _color[COLORABLE_TRACK_MARK] = *color;
346
347                 gtk_color_button_get_color(GTK_COLOR_BUTTON
348                                                   (cdi.col[COLORABLE_TRACK_BREAK]),color);
349                 _color[COLORABLE_TRACK_BREAK] = *color;
350
351                 gtk_color_button_get_color(GTK_COLOR_BUTTON
352                                                   (cdi.col[COLORABLE_ROUTE]),color);
353                 _color[COLORABLE_ROUTE] = *color;
354
355                 gtk_color_button_get_color(GTK_COLOR_BUTTON
356                                                   (cdi.col[COLORABLE_ROUTE_WAY]),color);
357                 _color[COLORABLE_ROUTE_WAY] = *color;
358
359                 gtk_color_button_get_color(GTK_COLOR_BUTTON
360                                                   (cdi.col[COLORABLE_ROUTE_BREAK]),color);
361                 _color[COLORABLE_ROUTE_BREAK] = *color;
362
363                 gtk_color_button_get_color(GTK_COLOR_BUTTON
364                                                   (cdi.col[COLORABLE_POI]),color);
365                 _color[COLORABLE_POI] = *color;
366
367                 update_gcs();
368                 break;
369         }
370
371         gtk_widget_destroy(dialog);
372
373         vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
374         return TRUE;
375 }
376
377 /**
378  * Bring up the Settings dialog.  Return TRUE if and only if the recever
379  * information has changed (MAC or channel).
380  */
381 gboolean settings_dialog()
382 {
383         GtkWidget *dialog;
384         GtkWidget *notebook;
385         GtkWidget *table;
386         GtkWidget *hbox;
387         GtkWidget *hbox2;
388         GtkWidget *label;
389         GtkWidget *txt_rcvr_mac;
390         GtkWidget *num_center_ratio;
391         GtkWidget *num_lead_ratio;
392         GtkWidget *num_announce_notice;
393         GtkWidget *chk_enable_voice;
394         GtkWidget *num_voice_speed;
395         GtkWidget *num_voice_pitch;
396         GtkWidget *lbl_voice_speed;
397         GtkWidget *lbl_voice_pitch;
398         GtkWidget *num_draw_width;
399         GtkWidget *chk_always_keep_on;
400         GtkWidget *cmb_units;
401         GtkWidget *cmb_degformat;
402         GtkWidget *btn_scan;
403         GtkWidget *btn_buttons;
404         GtkWidget *btn_colors;
405
406         GtkWidget *txt_mapper_db;
407         GtkWidget *btn_browsedb;
408         GtkWidget *num_poi_zoom;
409         GtkWidget *chk_speed_limit_on;
410         GtkWidget *num_speed;
411         GtkWidget *cmb_speed_location;
412         GtkWidget *cmb_info_font_size;
413
414         GtkWidget *chk_gps_filter;
415         GtkWidget *num_angle;
416         GtkWidget *num_hdop_ratio;
417         GtkWidget *num_vdop_ratio;
418         GtkWidget *num_osm_dist;
419
420         BrowseInfo browse_info = { 0, 0 };
421         ScanInfo scan_info = { 0 };
422         gboolean rcvr_changed = FALSE;
423         guint i;
424         printf("%s()\n", __PRETTY_FUNCTION__);
425
426         dialog = gtk_dialog_new_with_buttons(_("Settings"),
427                                              GTK_WINDOW(_window),
428                                              GTK_DIALOG_MODAL, GTK_STOCK_OK,
429                                              GTK_RESPONSE_ACCEPT, NULL);
430
431 #ifdef WITH_HILDON
432         /* Enable the help button. */
433         ossohelp_dialog_help_enable(GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
434 #endif
435
436         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
437                           btn_buttons = gtk_button_new_with_label(_("Hardware Keys...")));
438
439         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
440                           btn_colors = gtk_button_new_with_label(_("Colors...")));
441
442         gtk_dialog_add_button(GTK_DIALOG(dialog),
443                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
444
445         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
446                            notebook = gtk_notebook_new(), TRUE, TRUE, 0);
447
448         /* Receiver page. */
449         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
450                                  table = gtk_table_new(2, 3, FALSE),
451                                  label = gtk_label_new(_("GPS")));
452
453         /* Receiver MAC Address. */
454         gtk_table_attach(GTK_TABLE(table),
455                          label = gtk_label_new(_("MAC")),
456                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
457         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
458         gtk_table_attach(GTK_TABLE(table),
459                          hbox = gtk_hbox_new(FALSE, 4),
460                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
461         gtk_box_pack_start(GTK_BOX(hbox),
462                            txt_rcvr_mac = gtk_entry_new(), TRUE, TRUE, 0);
463         gtk_box_pack_start(GTK_BOX(hbox),
464                            btn_scan = gtk_button_new_with_label(_("Scan...")),
465                            FALSE, FALSE, 0);
466
467         /* Note!. */
468         gtk_table_attach(GTK_TABLE(table),
469                          label =
470                          gtk_label_new(_
471                                        ("Note: You can enter a device path\n"
472                                         "(e.g. \"/dev/rfcomm0\").")), 0, 2, 1,
473                          2, GTK_FILL, 0, 2, 4);
474         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
475         gtk_misc_set_alignment(GTK_MISC(label), 0.5f, 0.5f);
476
477         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
478                                  table = gtk_table_new(2, 5, FALSE),
479                                  label = gtk_label_new(_("Filter")));
480
481         gtk_table_attach(GTK_TABLE(table),
482                          chk_gps_filter = gtk_check_button_new_with_label(_("Enable GPS track filter")),
483                          0, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
484         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_gps_filter), _gps_filter);
485
486         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Horizontal")),
487                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
488         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
489         gtk_table_attach(GTK_TABLE(table), num_hdop_ratio = hildon_controlbar_new(),
490                          1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
491         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_hdop_ratio), 0, 200);
492         force_min_visible_bars(HILDON_CONTROLBAR(num_hdop_ratio), 1);
493
494         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Vertical")),
495                          0, 1, 2, 3, GTK_FILL, 0, 2, 4);
496         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
497         gtk_table_attach(GTK_TABLE(table), num_vdop_ratio = hildon_controlbar_new(),
498                          1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
499         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_vdop_ratio), 0, 200);
500         force_min_visible_bars(HILDON_CONTROLBAR(num_vdop_ratio), 1);
501
502         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Angle")),
503                          0, 1, 3, 4, GTK_FILL, 0, 2, 4);
504         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
505         gtk_table_attach(GTK_TABLE(table), num_angle = hildon_controlbar_new(),
506                          1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 4);
507         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_angle), 0, 45);
508         force_min_visible_bars(HILDON_CONTROLBAR(num_angle), 1);
509
510         /* Distance to OSM data */
511         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("OSM Data")),
512                          0, 1, 4, 5, GTK_FILL, 0, 2, 4);
513         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
514         gtk_table_attach(GTK_TABLE(table), num_osm_dist = hildon_controlbar_new(),
515                          1, 2, 4, 5, GTK_EXPAND | GTK_FILL, 0, 2, 4);
516         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_osm_dist), 0, 5000);
517         force_min_visible_bars(HILDON_CONTROLBAR(num_osm_dist), 1);
518
519         /* Auto-Center page. */
520         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
521                                  table = gtk_table_new(2, 2, FALSE),
522                                  label = gtk_label_new(_("Auto-Center")));
523
524         /* Auto-Center Sensitivity. */
525         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Sensitivity")),
526                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
527         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
528         gtk_table_attach(GTK_TABLE(table), num_center_ratio = hildon_controlbar_new(),
529                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
530         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1, 10);
531         force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
532
533         /* Lead Amount. */
534         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Lead Amount")),
535                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
536         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
537
538         gtk_table_attach(GTK_TABLE(table), num_lead_ratio = hildon_controlbar_new(),
539                          1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
540         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
541         force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
542
543         /* Announcement page */
544         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
545                                  table = gtk_table_new(2, 3, FALSE),
546                                  label = gtk_label_new(_("Announce")));
547
548         /* Announcement Advance Notice. */
549         gtk_table_attach(GTK_TABLE(table),
550                          label = gtk_label_new(_("Advance Notice")),
551                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
552         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
553         gtk_table_attach(GTK_TABLE(table), num_announce_notice = hildon_controlbar_new(),
554                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
555         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_announce_notice), 1, 20);
556         force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
557
558         /* Enable Voice. */
559         gtk_table_attach(GTK_TABLE(table),
560                          chk_enable_voice =
561                          gtk_check_button_new_with_label(_
562                                                          ("Enable Voice Synthesis (requires flite)")),
563                          0, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
564         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice),
565                                      _enable_voice);
566
567         /* Voice Speed and Pitch. */
568         gtk_table_attach(GTK_TABLE(table),
569                          hbox = gtk_hbox_new(FALSE, 12),
570                          0, 2, 2, 3, 0, 0, 2, 6);
571         gtk_box_pack_start(GTK_BOX(hbox),
572                            hbox2 = gtk_hbox_new(FALSE, 4), TRUE, TRUE, 4);
573         gtk_box_pack_start(GTK_BOX(hbox2),
574                            lbl_voice_speed = gtk_label_new(_("Speed")),
575                            TRUE, TRUE, 0);
576         gtk_box_pack_start(GTK_BOX(hbox2),
577                            num_voice_speed = hildon_controlbar_new(),
578                            TRUE, TRUE, 0);
579         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_voice_speed), 1, 10);
580         force_min_visible_bars(HILDON_CONTROLBAR(num_voice_speed), 1);
581
582         gtk_box_pack_start(GTK_BOX(hbox),
583                            hbox2 = gtk_hbox_new(FALSE, 4), TRUE, TRUE, 4);
584         gtk_box_pack_start(GTK_BOX(hbox2),
585                            lbl_voice_pitch = gtk_label_new(_("Pitch")),
586                            TRUE, TRUE, 0);
587         gtk_box_pack_start(GTK_BOX(hbox2),
588                            num_voice_pitch = hildon_controlbar_new(),
589                            TRUE, TRUE, 0);
590         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_voice_pitch), -2, 8);
591         force_min_visible_bars(HILDON_CONTROLBAR(num_voice_pitch), 1);
592
593         /* Display settings page. */
594         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
595                                  table = gtk_table_new(2, 3, FALSE),
596                                  label = gtk_label_new(_("Display")));
597
598         /* Line Width. */
599         gtk_table_attach(GTK_TABLE(table),
600                          label = gtk_label_new(_("Line Width")),
601                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
602         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
603         gtk_table_attach(GTK_TABLE(table),
604                          num_draw_width = hildon_controlbar_new(),
605                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
606         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
607         force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
608
609         /* Keep Display On Only When Fullscreen. */
610         gtk_table_attach(GTK_TABLE(table),
611                          chk_always_keep_on =
612                          gtk_check_button_new_with_label(_("Keep Display On Only in Fullscreen Mode")),
613                          0, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
614
615         /* Information Font Size. */
616         gtk_table_attach(GTK_TABLE(table),
617                          hbox = gtk_hbox_new(FALSE, 4),
618                          0, 2, 2, 3, GTK_FILL, 0, 2, 4);
619         gtk_box_pack_start(GTK_BOX(hbox),
620                            label = gtk_label_new(_("Information Font Size")),
621                            FALSE, FALSE, 0);
622         gtk_box_pack_start(GTK_BOX(hbox),
623                            cmb_info_font_size = gtk_combo_box_new_text(),
624                            FALSE, FALSE, 0);
625         for (i = 0; i < INFO_FONT_ENUM_COUNT; i++)
626                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size),
627                                           INFO_FONT_TEXT[i]);
628
629         /* Units page. */
630         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
631                                  table = gtk_table_new(2, 3, FALSE),
632                                  label = gtk_label_new(_("Units")));
633
634         /* Units. */
635         gtk_table_attach(GTK_TABLE(table),
636                          label = gtk_label_new(_("Units")),
637                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
638         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
639         gtk_table_attach(GTK_TABLE(table),
640                          cmb_units = gtk_combo_box_new_text(),
641                          1, 2, 0, 1, GTK_FILL, 0, 2, 4);
642         for (i = 0; i < UNITS_ENUM_COUNT; i++)
643                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_units),
644                                           UNITS_TEXT[i]);
645
646         /* Degrees format */
647         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Degrees Format")),
648                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
649         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
650         gtk_table_attach(GTK_TABLE(table), label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
651                          1, 2, 1, 2, GTK_FILL, 0, 2, 4);
652         gtk_container_add(GTK_CONTAINER(label),
653                           cmb_degformat = gtk_combo_box_new_text());
654         for (i = 0; i < DEG_FORMAT_ENUM_COUNT; i++)
655                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat),
656                                           DEG_FORMAT_TEXT[i]);
657
658         gtk_table_attach(GTK_TABLE(table),
659                          gtk_label_new(""),
660                          2, 3, 0, 2, GTK_FILL | GTK_EXPAND, 0, 2, 4);
661
662         /* Speed warner. */
663         gtk_table_attach(GTK_TABLE(table),
664                          hbox = gtk_hbox_new(FALSE, 4),
665                          0, 3, 2, 3, GTK_FILL, 0, 2, 4);
666
667         gtk_box_pack_start(GTK_BOX(hbox),
668                            chk_speed_limit_on =
669                            gtk_check_button_new_with_label(_("Speed Limit")),
670                            FALSE, FALSE, 0);
671
672         gtk_box_pack_start(GTK_BOX(hbox),
673                            label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
674                            FALSE, FALSE, 0);
675         gtk_container_add(GTK_CONTAINER(label),
676                           num_speed = hildon_number_editor_new(0, 999));
677
678         gtk_box_pack_start(GTK_BOX(hbox),
679                            label = gtk_label_new(_("Location")),
680                            FALSE, FALSE, 0);
681         gtk_box_pack_start(GTK_BOX(hbox),
682                            label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
683                            FALSE, FALSE, 0);
684         gtk_container_add(GTK_CONTAINER(label),
685                           cmb_speed_location = gtk_combo_box_new_text());
686         for (i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++)
687                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location),
688                                           SPEED_LOCATION_TEXT[i]);
689
690         /* Database page */
691         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
692                                  table = gtk_table_new(2, 3, FALSE),
693                                  label = gtk_label_new(_("Database")));
694
695         /* Database. */
696         gtk_table_attach(GTK_TABLE(table),
697                          label = gtk_label_new(_("Database")),
698                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
699         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
700         gtk_table_attach(GTK_TABLE(table),
701                          hbox = gtk_hbox_new(FALSE, 4),
702                          1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
703         gtk_box_pack_start(GTK_BOX(hbox),
704                            txt_mapper_db = gtk_entry_new(), TRUE, TRUE, 0);
705         gtk_box_pack_start(GTK_BOX(hbox),
706                            btn_browsedb =
707                            gtk_button_new_with_label(_("Browse...")), FALSE,
708                            FALSE, 0);
709
710         /* Show POI below zoom. */
711         gtk_table_attach(GTK_TABLE(table),
712                          label = gtk_label_new(_("Show POI below zoom")),
713                          0, 1, 2, 3, GTK_FILL, 0, 2, 4);
714         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
715         gtk_table_attach(GTK_TABLE(table),
716                          label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
717                          1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
718         gtk_container_add(GTK_CONTAINER(label),
719                           num_poi_zoom = hildon_number_editor_new(0, MAX_ZOOM));
720
721         /* Connect signals. */
722         scan_info.settings_dialog = dialog;
723         scan_info.txt_rcvr_mac = txt_rcvr_mac;
724         g_signal_connect(G_OBJECT(btn_scan), "clicked",
725                          G_CALLBACK(scan_bluetooth), &scan_info);
726         g_signal_connect(G_OBJECT(btn_buttons), "clicked",
727                          G_CALLBACK(settings_dialog_hardkeys), dialog);
728         g_signal_connect(G_OBJECT(btn_colors), "clicked",
729                          G_CALLBACK(settings_dialog_colors), dialog);
730
731         browse_info.dialog = dialog;
732         browse_info.txt = txt_mapper_db;
733         g_signal_connect(G_OBJECT(btn_browsedb), "clicked",
734                          G_CALLBACK(settings_dialog_browse_forfile),
735                          &browse_info);
736
737         /* Initialize fields. */
738         if (_rcvr_mac)
739                 gtk_entry_set_text(GTK_ENTRY(txt_rcvr_mac), _rcvr_mac);
740         if (_mapper_db)
741                 gtk_entry_set_text(GTK_ENTRY(txt_mapper_db), _mapper_db);
742
743         hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom),
744                                        _poi_zoom);
745         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio),
746                                     _center_ratio);
747         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio),
748                                     _lead_ratio);
749         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice),
750                                     _announce_notice_ratio);
751         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_voice_speed),
752                                     (gint) (_voice_speed * 3 + 0.5));
753         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_voice_pitch),
754                                     _voice_pitch);
755         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width),
756                                     _draw_width);
757         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_always_keep_on),
758                                      !_always_keep_on);
759         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
760         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
761         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on),
762                                      _speed_limit_on);
763         hildon_number_editor_set_range(HILDON_NUMBER_EDITOR(num_speed), 1, 300);
764         hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed), _speed_limit);
765         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location), _speed_location);
766         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size), _info_font_size);
767
768         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_hdop_ratio),(gint) _filter_hdop);
769         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_vdop_ratio),(gint) _filter_vdop);
770         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_angle),(gint) _filter_angle);
771
772         gtk_widget_show_all(dialog);
773
774         /* TODO: Uncomment the following hide function calls if moimart ever
775          * releases his dbus-based flite software. */
776         gtk_widget_hide(lbl_voice_speed);
777         gtk_widget_hide(num_voice_speed);
778         gtk_widget_hide(lbl_voice_pitch);
779         gtk_widget_hide(num_voice_pitch);
780
781         while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
782                 /* Set _rcvr_mac if necessary. */
783                 if (!*gtk_entry_get_text(GTK_ENTRY(txt_rcvr_mac))) {
784                         /* User specified no rcvr mac - set _rcvr_mac to NULL. */
785                         if (_rcvr_mac) {
786                                 g_free(_rcvr_mac);
787                                 _rcvr_mac = NULL;
788                                 rcvr_changed = TRUE;
789                                 gtk_widget_set_sensitive(GTK_WIDGET
790                                                          (_menu_gps_details_item),
791                                                          FALSE);
792                         }
793                         if (_enable_gps) {
794                                 gtk_check_menu_item_set_active
795                                     (GTK_CHECK_MENU_ITEM(_menu_enable_gps_item),
796                                      FALSE);
797                                 popup_error(dialog,
798                                             _("No GPS Receiver MAC provided.\n"
799                                               "GPS will be disabled."));
800                                 rcvr_changed = TRUE;
801                                 gtk_widget_set_sensitive(GTK_WIDGET
802                                                          (_menu_gps_details_item),
803                                                          FALSE);
804                         }
805                 } else if (!_rcvr_mac || strcmp(_rcvr_mac, gtk_entry_get_text(GTK_ENTRY(txt_rcvr_mac)))) {
806                         /* User specified a new rcvr mac. */
807                         g_free(_rcvr_mac);
808                         _rcvr_mac = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_rcvr_mac)));
809                         rcvr_changed = TRUE;
810                 }
811
812                 _center_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_center_ratio));
813                 _lead_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_lead_ratio));
814                 _draw_width = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_draw_width));
815                 _always_keep_on = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_always_keep_on));
816                 _units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
817                 _degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
818                 _speed_limit_on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on));
819                 _speed_limit = hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_speed));
820                 _speed_location = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_speed_location));
821                 _info_font_size = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_info_font_size));
822
823                 _announce_notice_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_announce_notice));
824
825                 _voice_speed = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_voice_speed)) / 3.0;
826                 _voice_pitch = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_voice_pitch));
827                 _enable_voice = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_enable_voice));
828
829                 _filter_angle =(gfloat)hildon_controlbar_get_value(HILDON_CONTROLBAR(num_angle));
830                 _filter_hdop =(gfloat)hildon_controlbar_get_value(HILDON_CONTROLBAR(num_hdop_ratio));
831                 _filter_vdop =(gfloat)hildon_controlbar_get_value(HILDON_CONTROLBAR(num_vdop_ratio));
832                 _gps_filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_gps_filter));
833
834                 if (_db) {
835                         mapper_db_disconnect(&_db);
836                         _db = NULL;
837                 }
838                 g_free(_mapper_db);
839                 if (strlen(gtk_entry_get_text(GTK_ENTRY(txt_mapper_db)))) {
840                         _mapper_db = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_mapper_db)));
841                         mapper_db_connect(&_db, _mapper_db);
842                 } else {
843                         _mapper_db = NULL;
844                 }
845
846                 /* Sensitize menus based on whether we have a database conn. */
847                 gtk_widget_set_sensitive(_cmenu_loc_add_poi, _db != NULL);
848                 gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
849                 gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
850                 gtk_widget_set_sensitive(_menu_poi_item, _db != NULL);
851
852                 _poi_zoom = hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_poi_zoom));
853
854                 update_gcs();
855
856                 config_save();
857                 break;
858         }
859
860         gtk_widget_destroy(dialog);     /* Destroying causes a crash (!?!?!??!)  huh?*/
861
862         vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
863         return rcvr_changed;
864 }