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