Diff of /trunk/src/main.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 79 by achadwick, Sun Feb 15 22:15:06 2009 UTC revision 185 by harbaum, Mon Jun 29 14:07:46 2009 UTC
# Line 1  Line 1 
1  /*  /*
2     * Copyright (C) 2008 Till Harbaum <till@harbaum.org>.
3     *
4   * This file is part of OSM2Go.   * This file is part of OSM2Go.
5   *   *
6   * OSM2Go is free software: you can redistribute it and/or modify   * OSM2Go is free software: you can redistribute it and/or modify
# Line 34  static void main_ui_enable(appdata_t *ap Line 36  static void main_ui_enable(appdata_t *ap
36      map_action_cancel(appdata);      map_action_cancel(appdata);
37    
38    /* ---- set project name as window title ----- */    /* ---- set project name as window title ----- */
39  #ifndef USE_HILDON  #if defined(USE_HILDON) && MAEMO_VERSION_MAJOR < 5
40      if(project_valid)
41        gtk_window_set_title(GTK_WINDOW(appdata->window), appdata->project->name);
42      else
43        gtk_window_set_title(GTK_WINDOW(appdata->window), "");
44    #else
45    char *str = NULL;    char *str = NULL;
46    if(project_valid)    if(project_valid)
47      str = g_strdup_printf("OSM2Go - %s", appdata->project->name);      str = g_strdup_printf("OSM2Go - %s", appdata->project->name);
# Line 43  static void main_ui_enable(appdata_t *ap Line 50  static void main_ui_enable(appdata_t *ap
50    
51    gtk_window_set_title(GTK_WINDOW(appdata->window), str);    gtk_window_set_title(GTK_WINDOW(appdata->window), str);
52    g_free(str);    g_free(str);
 #else  
   if(project_valid)  
     gtk_window_set_title(GTK_WINDOW(appdata->window), appdata->project->name);  
   else  
     gtk_window_set_title(GTK_WINDOW(appdata->window), "");  
53  #endif  #endif
54    
55    if(appdata->iconbar && appdata->iconbar->toolbar)    if(appdata->iconbar && appdata->iconbar->toolbar)
# Line 60  static void main_ui_enable(appdata_t *ap Line 62  static void main_ui_enable(appdata_t *ap
62      gtk_widget_set_sensitive(appdata->menu_item_osm_undo, osm_valid);      gtk_widget_set_sensitive(appdata->menu_item_osm_undo, osm_valid);
63    gtk_widget_set_sensitive(appdata->menu_item_osm_save_changes, osm_valid);    gtk_widget_set_sensitive(appdata->menu_item_osm_save_changes, osm_valid);
64    gtk_widget_set_sensitive(appdata->menu_item_osm_undo_changes, osm_valid);    gtk_widget_set_sensitive(appdata->menu_item_osm_undo_changes, osm_valid);
65      gtk_widget_set_sensitive(appdata->menu_item_osm_relations, osm_valid);
66    gtk_widget_set_sensitive(appdata->track.menu_track, osm_valid);    gtk_widget_set_sensitive(appdata->track.menu_track, osm_valid);
67    gtk_widget_set_sensitive(appdata->menu_view, osm_valid);    gtk_widget_set_sensitive(appdata->menu_view, osm_valid);
68    gtk_widget_set_sensitive(appdata->menu_wms, osm_valid);    gtk_widget_set_sensitive(appdata->menu_wms, osm_valid);
69    gtk_widget_set_sensitive(appdata->menu_map, osm_valid);    gtk_widget_set_sensitive(appdata->menu_map, osm_valid);
   gtk_widget_set_sensitive(appdata->menu_item_project_close, project_valid);  
70    
71    if(!project_valid)    if(!project_valid)
72      statusbar_set(appdata, _("Please load or create a project"), FALSE);      statusbar_set(appdata, _("Please load or create a project"), FALSE);
# Line 73  static void main_ui_enable(appdata_t *ap Line 75  static void main_ui_enable(appdata_t *ap
75  /******************** begin of menu *********************/  /******************** begin of menu *********************/
76    
77  static void  static void
78  cb_menu_project_open(GtkWidget *window, gpointer data) {  cb_menu_project_open(GtkMenuItem *item, gpointer data) {
79    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
80    project_load(appdata, NULL);    project_load(appdata, NULL);
81    main_ui_enable(appdata);    main_ui_enable(appdata);
82  }  }
83    
84  static void  static void
85  cb_menu_project_close(GtkWidget *window, gpointer data) {  cb_menu_project_wizard(GtkMenuItem *item, gpointer data) {
86    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
87    project_close(appdata);    project_wizard(appdata);
   main_ui_enable(appdata);  
88  }  }
89    
90  static void  static void
91  cb_menu_about(GtkWidget *window, gpointer data) {  cb_menu_about(GtkMenuItem *item, gpointer data) {
92    GtkAboutDialog *about = GTK_ABOUT_DIALOG(gtk_about_dialog_new());    appdata_t *appdata = (appdata_t*)data;
   
   gtk_about_dialog_set_name(about, "OSM2Go");  
   gtk_about_dialog_set_version(about, VERSION);  
   gtk_about_dialog_set_copyright(about, _("Copyright 2008"));  
93    
94    const gchar *authors[] = {    const gchar *authors[] = {
95      "Till Harbaum <till@harbaum.org>",      "Till Harbaum <till@harbaum.org>",
96      "Andrew Chadwick <andrewc-osm2go@piffle.org>",      "Andrew Chadwick <andrewc-osm2go@piffle.org>",
97      NULL };      NULL };
98    
99    gtk_about_dialog_set_authors(about, authors);    const gchar *artists[] = {
100        "Andrew Zhilin <drew.zhilin@gmail.com>",
101    gtk_about_dialog_set_website(about,      NULL };
        _("http://www.harbaum.org/till/maemo"));  
   
   gtk_about_dialog_set_comments(about,  
        _("Mobile OSM Editor"));  
102    
103    gtk_widget_show_all(GTK_WIDGET(about));    gtk_show_about_dialog(GTK_WINDOW(appdata->window),
104    gtk_dialog_run(GTK_DIALOG(about));                          "name", "OSM2Go",
105    gtk_widget_destroy(GTK_WIDGET(about));                          "version", VERSION,
106                            "copyright", _("Copyright 2008-2009"),
107                            "authors", authors,
108                            "artists", artists,
109                            "website", _("http://www.harbaum.org/till/maemo"),
110                            "comments", _("Mobile OSM Editor"),
111                            NULL);
112  }  }
113    
114  void on_window_destroy (GtkWidget *widget, gpointer data);  void on_window_destroy (GtkWidget *widget, gpointer data);
115    
116  static void  static void
117  cb_menu_quit(GtkWidget *window, gpointer data) {  cb_menu_quit(GtkMenuItem *item, gpointer data) {
118    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
119    gtk_widget_destroy(GTK_WIDGET(appdata->window));    gtk_widget_destroy(GTK_WIDGET(appdata->window));
120  }  }
121    
122  static void  static void
123  cb_menu_upload(GtkWidget *window, gpointer data) {  cb_menu_upload(GtkMenuItem *item, gpointer data) {
124    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
125    if(!appdata->osm || !appdata->project) return;    if(!appdata->osm || !appdata->project) return;
126    
127      if(project_check_demo(GTK_WIDGET(appdata->window), appdata->project))
128        return;
129    
130    osm_upload(appdata, appdata->osm, appdata->project);    osm_upload(appdata, appdata->osm, appdata->project);
131  }  }
132    
133  static void  static void
134  cb_menu_download(GtkWidget *window, gpointer data) {  cb_menu_download(GtkMenuItem *item, gpointer data) {
135    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
136    if(!appdata->project) return;    if(!appdata->project) return;
137    
138      if(project_check_demo(GTK_WIDGET(appdata->window), appdata->project))
139        return;
140    
141    /* if we have valid osm data loaded: save state first */    /* if we have valid osm data loaded: save state first */
142    if(appdata->osm) {    if(appdata->osm) {
143      /* redraw the entire map by destroying all map items and redrawing them */      /* redraw the entire map by destroying all map items and redrawing them */
# Line 144  cb_menu_download(GtkWidget *window, gpoi Line 149  cb_menu_download(GtkWidget *window, gpoi
149    }    }
150    
151    // download    // download
152    if(osm_download(GTK_WIDGET(appdata->window), appdata->project)) {    if(osm_download(GTK_WIDGET(appdata->window), appdata->settings,
153      banner_busy_start(appdata, 1, "Redrawing...");                    appdata->project)) {
154      appdata->osm = osm_parse(appdata->project->osm);      banner_busy_start(appdata, 1, "Redrawing");
155        appdata->osm = osm_parse(appdata->project->path, appdata->project->osm);
156      diff_restore(appdata, appdata->project, appdata->osm);      diff_restore(appdata, appdata->project, appdata->osm);
157      map_paint(appdata);      map_paint(appdata);
158      banner_busy_stop(appdata); //"Redrawing..."      banner_busy_stop(appdata); //"Redrawing"
159    }    }
160    
161    main_ui_enable(appdata);    main_ui_enable(appdata);
162  }  }
163    
164  static void  static void
165  cb_menu_wms_import(GtkWidget *window, gpointer data) {  cb_menu_wms_import(GtkMenuItem *item, gpointer data) {
166    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
167    wms_import(appdata);    wms_import(appdata);
168  }  }
169    
170  static void  static void
171  cb_menu_wms_clear(GtkWidget *window, gpointer data) {  cb_menu_wms_clear(GtkMenuItem *item, gpointer data) {
172    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
173    wms_remove(appdata);    wms_remove(appdata);
174  }  }
175    
176  static void  static void
177  cb_menu_wms_adjust(GtkWidget *window, gpointer data) {  cb_menu_wms_adjust(GtkMenuItem *item, gpointer data) {
178    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
179    map_action_set(appdata, MAP_ACTION_BG_ADJUST);    map_action_set(appdata, MAP_ACTION_BG_ADJUST);
180  }  }
# Line 176  cb_menu_wms_adjust(GtkWidget *window, gp Line 182  cb_menu_wms_adjust(GtkWidget *window, gp
182  /* ----------- hide objects for performance reasons ----------- */  /* ----------- hide objects for performance reasons ----------- */
183    
184  static void  static void
185  cb_menu_map_hide_sel(GtkWidget *window, gpointer data) {  cb_menu_map_hide_sel(GtkMenuItem *item, gpointer data) {
186    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
187    map_hide_selected(appdata);    map_hide_selected(appdata);
188  }  }
189    
190  static void  static void
191  cb_menu_map_show_all(GtkWidget *window, gpointer data) {  cb_menu_map_show_all(GtkMenuItem *item, gpointer data) {
192    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
193    map_show_all(appdata);    map_show_all(appdata);
194  }  }
# Line 191  cb_menu_map_show_all(GtkWidget *window, Line 197  cb_menu_map_show_all(GtkWidget *window,
197    
198  #if 1  // mainly for testing  #if 1  // mainly for testing
199  static void  static void
200  cb_menu_redraw(GtkWidget *window, gpointer data) {  cb_menu_redraw(GtkMenuItem *item, gpointer data) {
201    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
202    
203    /* redraw the entire map by destroying all map items and redrawing them */    /* redraw the entire map by destroying all map items and redrawing them */
204    banner_busy_start(appdata, 1, "Redrawing...");    banner_busy_start(appdata, 1, "Redrawing");
205    track_save(appdata->project, appdata->track.track);    track_save(appdata->project, appdata->track.track);
206    diff_save(appdata->project, appdata->osm);    diff_save(appdata->project, appdata->osm);
207    map_clear(appdata, MAP_LAYER_ALL);    map_clear(appdata, MAP_LAYER_ALL);
208    osm_free(&appdata->icon, appdata->osm);    osm_free(&appdata->icon, appdata->osm);
209    
210    appdata->osm = osm_parse(appdata->project->osm);    appdata->osm = osm_parse(appdata->project->path, appdata->project->osm);
211    diff_restore(appdata, appdata->project, appdata->osm);    diff_restore(appdata, appdata->project, appdata->osm);
212    map_paint(appdata);    map_paint(appdata);
213    
# Line 210  cb_menu_redraw(GtkWidget *window, gpoint Line 216  cb_menu_redraw(GtkWidget *window, gpoint
216      map_track_draw(appdata->map, appdata->track.track);      map_track_draw(appdata->map, appdata->track.track);
217    
218    wms_load(appdata);    wms_load(appdata);
219    banner_busy_stop(appdata); //"Redrawing..."    banner_busy_stop(appdata); //"Redrawing"
220  }  }
221  #endif  #endif
222    
223  static void  static void
224  cb_menu_style(GtkWidget *widget, gpointer data) {  cb_menu_map_no_icons(GtkCheckMenuItem *item, gpointer data) {
225    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
226    
227    style_select(GTK_WIDGET(appdata->window), appdata);    banner_busy_start(appdata, 1, "Redrawing");
228      map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
229      appdata->settings->no_icons = gtk_check_menu_item_get_active(item);
230      map_paint(appdata);
231      banner_busy_stop(appdata); //"Redrawing"
232  }  }
233    
234  static void  static void
235  cb_menu_map_no_icons(GtkWidget *widget, gpointer data) {  cb_menu_map_no_antialias(GtkCheckMenuItem *item, gpointer data) {
236    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
237    
238    banner_busy_start(appdata, 1, "Redrawing...");    banner_busy_start(appdata, 1, "Redrawing");
239    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
240    appdata->settings->no_icons =    appdata->settings->no_antialias = gtk_check_menu_item_get_active(item);
     gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));  
241    map_paint(appdata);    map_paint(appdata);
242    banner_busy_stop(appdata); //"Redrawing..."    banner_busy_stop(appdata); //"Redrawing"
243  }  }
244    
245  static void  static void
246  cb_menu_map_no_antialias(GtkWidget *widget, gpointer data) {  cb_menu_style(GtkMenuItem *item, gpointer data) {
247    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
248    
249    banner_busy_start(appdata, 1, "Redrawing...");    style_select(GTK_WIDGET(appdata->window), appdata);
   map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);  
   appdata->settings->no_antialias =  
     gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));  
   map_paint(appdata);  
   banner_busy_stop(appdata); //"Redrawing..."  
250  }  }
251    
252  static void  static void
253  cb_menu_undo(GtkWidget *widget, gpointer data) {  cb_menu_undo(GtkMenuItem *item, gpointer data) {
254    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
255    
256    undo(appdata);    undo(appdata);
# Line 255  cb_menu_undo(GtkWidget *widget, gpointer Line 259  cb_menu_undo(GtkWidget *widget, gpointer
259  }  }
260    
261  static void  static void
262  cb_menu_save_changes(GtkWidget *widget, gpointer data) {  cb_menu_save_changes(GtkMenuItem *item, gpointer data) {
263    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
264    
265    diff_save(appdata->project, appdata->osm);    diff_save(appdata->project, appdata->osm);
# Line 263  cb_menu_save_changes(GtkWidget *widget, Line 267  cb_menu_save_changes(GtkWidget *widget,
267  }  }
268    
269  static void  static void
270  cb_menu_undo_changes(GtkWidget *widget, gpointer data) {  cb_menu_undo_changes(GtkMenuItem *item, gpointer data) {
271    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
272    
273    if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0,    if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0,
# Line 272  cb_menu_undo_changes(GtkWidget *widget, Line 276  cb_menu_undo_changes(GtkWidget *widget,
276                   "uploaded yet? This can't be undone.")))                   "uploaded yet? This can't be undone.")))
277      return;      return;
278    
279    banner_busy_start(appdata, 1, _("Redrawing..."));    banner_busy_start(appdata, 1, _("Redrawing"));
280    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
281    osm_free(&appdata->icon, appdata->osm);    osm_free(&appdata->icon, appdata->osm);
282    diff_remove(appdata->project);    diff_remove(appdata->project);
283    appdata->osm = osm_parse(appdata->project->osm);    appdata->osm = osm_parse(appdata->project->path, appdata->project->osm);
284    map_paint(appdata);    map_paint(appdata);
285    banner_busy_stop(appdata);  //"Redrawing..."    banner_busy_stop(appdata);  //"Redrawing"
286    
287    banner_show_info(appdata, _("Discarded local changes"));    banner_show_info(appdata, _("Discarded local changes"));
288  }  }
289    
290  static void  static void
291  cb_menu_osm_relations(GtkWidget *widget, gpointer data) {  cb_menu_osm_relations(GtkMenuItem *item, gpointer data) {
292    relation_list((appdata_t*)data);    relation_list((appdata_t*)data);
293  }  }
294    
295    #if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5)
296  static void  static void
297  cb_menu_fullscreen(GtkWidget *widget, gpointer data) {  cb_menu_fullscreen(GtkCheckMenuItem *item, gpointer data) {
298    appdata_t *appdata = (appdata_t *)data;    appdata_t *appdata = (appdata_t *)data;
299    
300    if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))    if(gtk_check_menu_item_get_active(item))
301      gtk_window_fullscreen(GTK_WINDOW(appdata->window));      gtk_window_fullscreen(GTK_WINDOW(appdata->window));
302    else    else
303      gtk_window_unfullscreen(GTK_WINDOW(appdata->window));      gtk_window_unfullscreen(GTK_WINDOW(appdata->window));
304  }  }
305    #endif
306    
307  static void  static void
308  cb_menu_zoomin(GtkWidget *widget, appdata_t *appdata) {  cb_menu_zoomin(GtkMenuItem *item, appdata_t *appdata) {
309    if(!appdata || !appdata->map) return;    if(!appdata || !appdata->map) return;
310    
311    map_set_zoom(appdata->map, appdata->map->state->zoom*ZOOM_FACTOR_MENU, TRUE);    map_set_zoom(appdata->map, appdata->map->state->zoom*ZOOM_FACTOR_MENU, TRUE);
# Line 307  cb_menu_zoomin(GtkWidget *widget, appdat Line 313  cb_menu_zoomin(GtkWidget *widget, appdat
313  }  }
314    
315  static void  static void
316  cb_menu_zoomout(GtkWidget *widget, appdata_t *appdata) {  cb_menu_zoomout(GtkMenuItem *item, appdata_t *appdata) {
317    if(!appdata || !appdata->map) return;    if(!appdata || !appdata->map) return;
318    
319    map_set_zoom(appdata->map, appdata->map->state->zoom/ZOOM_FACTOR_MENU, TRUE);    map_set_zoom(appdata->map, appdata->map->state->zoom/ZOOM_FACTOR_MENU, TRUE);
# Line 315  cb_menu_zoomout(GtkWidget *widget, appda Line 321  cb_menu_zoomout(GtkWidget *widget, appda
321  }  }
322    
323  static void  static void
324  cb_menu_track_import(GtkWidget *window, appdata_t *appdata) {  cb_menu_view_detail_inc(GtkMenuItem *item, gpointer data) {
325      appdata_t *appdata = (appdata_t*)data;
326    
327      printf("detail level increase\n");
328      map_detail_increase(appdata->map);
329    }
330    
331    static void
332    cb_menu_view_detail_normal(GtkMenuItem *item, gpointer data) {
333      appdata_t *appdata = (appdata_t*)data;
334    
335      printf("detail level normal\n");
336      map_detail_normal(appdata->map);
337    }
338    
339    static void
340    cb_menu_view_detail_dec(GtkMenuItem *item, gpointer data) {
341      appdata_t *appdata = (appdata_t*)data;
342    
343      printf("detail level decrease\n");
344      map_detail_decrease(appdata->map);
345    }
346    
347    static void
348    cb_menu_track_import(GtkMenuItem *item, appdata_t *appdata) {
349      g_assert(appdata->settings);
350    
351    /* open a file selector */    /* open a file selector */
352    GtkWidget *dialog;    GtkWidget *dialog;
# Line 332  cb_menu_track_import(GtkWidget *window, Line 363  cb_menu_track_import(GtkWidget *window,
363                          NULL);                          NULL);
364  #endif  #endif
365    
366    /* use path if one is present */    if(appdata->settings->track_path) {
367    if(appdata->track.import_path)      if(!g_file_test(appdata->settings->track_path, G_FILE_TEST_EXISTS)) {
368      gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),        char *last_sep = strrchr(appdata->settings->track_path, '/');
369                                          appdata->track.import_path);        if(last_sep) {
370            *last_sep = 0;  // seperate path from file
371    
372            /* the user just created a new document */
373            gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
374                                        appdata->settings->track_path);
375            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
376                                              last_sep+1);
377    
378            /* restore full filename */
379            *last_sep = '/';
380          }
381        } else
382          gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
383                                        appdata->settings->track_path);
384      }
385    
386    gtk_widget_show_all (GTK_WIDGET(dialog));    gtk_widget_show_all (GTK_WIDGET(dialog));
387    if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {    if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {
388      char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));      char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
389    
390      /* load a track */      /* load a track */
391      track_do(appdata, TRACK_IMPORT, filename);      appdata->track.track = track_import(appdata, filename);
392      if(appdata->track.track) {      if(appdata->track.track) {
393          if(appdata->settings->track_path) g_free(appdata->settings->track_path);
394        /* save path if gpx was successfully loaded */        appdata->settings->track_path = g_strdup(filename);
       char *r = strrchr(filename, '/');  
   
       /* there is a delimiter, use everything left of it as path */  
       if(r) {  
         *r = 0;  
         if(appdata->track.import_path) g_free(appdata->track.import_path);  
         appdata->track.import_path = g_strdup(filename);  
         /* restore path ... just in case ... */  
         *r = '/';  
       }  
395      }      }
396      g_free (filename);      g_free (filename);
397    }    }
# Line 364  cb_menu_track_import(GtkWidget *window, Line 400  cb_menu_track_import(GtkWidget *window,
400  }  }
401    
402  static void  static void
403  cb_menu_track_gps(GtkWidget *window, gpointer data) {  cb_menu_track_enable_gps(GtkMenuItem *item, gpointer data) {
404    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
405    
406    if(gtk_check_menu_item_get_active(    if(gtk_check_menu_item_get_active(
407      GTK_CHECK_MENU_ITEM(appdata->track.menu_item_gps))) {      GTK_CHECK_MENU_ITEM(appdata->track.menu_item_enable_gps))) {
408      track_do(appdata, TRACK_GPS, NULL);      track_enable_gps(appdata, TRUE);
409    } else {    } else
410      track_do(appdata, TRACK_NONE, NULL);      track_enable_gps(appdata, FALSE);
   }  
411  }  }
412    
413    
414  static void  static void
415  cb_menu_track_export(GtkWidget *window, gpointer data) {  cb_menu_track_follow_gps(GtkMenuItem *item, gpointer data) {
416    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
417    messagef(GTK_WIDGET(appdata->window), _("NIY"),  
418             _("Track export is not yet supported."));    if(gtk_check_menu_item_get_active(
419        GTK_CHECK_MENU_ITEM(appdata->track.menu_item_follow_gps))) {
420        appdata->settings->follow_gps = TRUE;
421      } else
422        appdata->settings->follow_gps = FALSE;
423    }
424    
425    
426    static void
427    cb_menu_track_export(GtkMenuItem *item, appdata_t *appdata) {
428      g_assert(appdata->settings);
429    
430      /* open a file selector */
431      GtkWidget *dialog;
432    
433    #ifdef USE_HILDON
434      dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(appdata->window),
435                                              GTK_FILE_CHOOSER_ACTION_SAVE);
436    #else
437      dialog = gtk_file_chooser_dialog_new(_("Export track file"),
438                                           GTK_WINDOW(appdata->window),
439                                           GTK_FILE_CHOOSER_ACTION_SAVE,
440                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
441                                           GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
442                                           NULL);
443    #endif
444    
445      printf("set filename <%s>\n", appdata->settings->track_path);
446    
447      if(appdata->settings->track_path) {
448        if(!g_file_test(appdata->settings->track_path, G_FILE_TEST_EXISTS)) {
449          char *last_sep = strrchr(appdata->settings->track_path, '/');
450          if(last_sep) {
451            *last_sep = 0;  // seperate path from file
452    
453            /* the user just created a new document */
454            gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
455                                                appdata->settings->track_path);
456            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
457                                              last_sep+1);
458    
459            /* restore full filename */
460            *last_sep = '/';
461          }
462        } else
463          gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
464                                        appdata->settings->track_path);
465      }
466    
467      if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_FM_OK) {
468        gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
469        if(filename) {
470          printf("export to %s\n", filename);
471    
472          if(!g_file_test(filename, G_FILE_TEST_EXISTS) ||
473             yes_no_f(dialog, appdata, MISC_AGAIN_ID_EXPORT_OVERWRITE,
474                      MISC_AGAIN_FLAG_DONT_SAVE_NO,
475                      "Overwrite existing file",
476                      "The file already exists. "
477                      "Do you really want to replace it?")) {
478            if(appdata->settings->track_path)
479              g_free(appdata->settings->track_path);
480            appdata->settings->track_path = g_strdup(filename);
481    
482            track_export(appdata, filename);
483          }
484        }
485      }
486    
487      gtk_widget_destroy (dialog);
488  }  }
489    
490    
491  static void  static void
492  cb_menu_track_clear(GtkWidget *window, gpointer data) {  cb_menu_track_clear(GtkMenuItem *item, gpointer data) {
493    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
494    track_do(appdata, TRACK_NONE, NULL);    track_clear(appdata, appdata->track.track);
495      appdata->track.track = NULL;
496  }  }
497    
498    
# Line 433  menu_append_new_item(appdata_t *appdata, Line 540  menu_append_new_item(appdata_t *appdata,
540                       const gchar *accel_path,                       const gchar *accel_path,
541                       guint accel_key,      // from gdk/gdkkeysyms.h                       guint accel_key,      // from gdk/gdkkeysyms.h
542                       GdkModifierType accel_mods, // e.g. GDK_CONTROL_MASK                       GdkModifierType accel_mods, // e.g. GDK_CONTROL_MASK
543                         gboolean enabled,
544                       gboolean is_check, gboolean check_status)                       gboolean is_check, gboolean check_status)
545  {  {
546    GtkWidget *item = NULL;    GtkWidget *item = NULL;
# Line 488  menu_append_new_item(appdata_t *appdata, Line 596  menu_append_new_item(appdata_t *appdata,
596  #endif  #endif
597    
598    gtk_menu_shell_append(GTK_MENU_SHELL(menu_shell), GTK_WIDGET(item));    gtk_menu_shell_append(GTK_MENU_SHELL(menu_shell), GTK_WIDGET(item));
599    if (is_check) {    gtk_widget_set_sensitive(GTK_WIDGET(item), enabled);
600      if (is_check)
601      gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), check_status);      gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), check_status);
602    }  
603    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(activate_cb),    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(activate_cb),
604                     appdata);                     appdata);
605    return item;    return item;
# Line 521  void menu_create(appdata_t *appdata) { Line 630  void menu_create(appdata_t *appdata) {
630  #endif  #endif
631    
632    menu_append_new_item(    menu_append_new_item(
633      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open"),
634      GTK_STOCK_OPEN, "<OSM2Go-Main>/Project/Open",      GTK_STOCK_OPEN, "<OSM2Go-Main>/Project/Open",
635      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
636    );    );
637    
638    appdata->menu_item_project_close = menu_append_new_item(    menu_append_new_item(
639      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_close), _("_Close"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_wizard), _("_Wizard"),
640      GTK_STOCK_CLOSE, "<OSM2Go-Main>/Project/Close",      GTK_STOCK_NEW, "<OSM2Go-Main>/Project/Wizard",
641      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
642    );    );
643    
644    /* --------------- view menu ------------------- */    /* --------------- view menu ------------------- */
# Line 544  void menu_create(appdata_t *appdata) { Line 653  void menu_create(appdata_t *appdata) {
653    gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);    gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
654    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
655    
656    #if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5)
657    appdata->menu_item_view_fullscreen = menu_append_new_item(    appdata->menu_item_view_fullscreen = menu_append_new_item(
658      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_fullscreen), _("_Fullscreen"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_fullscreen), _("_Fullscreen"),
659      GTK_STOCK_FULLSCREEN, "<OSM2Go-Main>/View/Fullscreen",      GTK_STOCK_FULLSCREEN, "<OSM2Go-Main>/View/Fullscreen",
660      0, 0, TRUE, FALSE      0, 0, TRUE, TRUE, FALSE
661    );    );
662    #endif
663    
664    menu_append_new_item(    menu_append_new_item(
665      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomin), _("Zoom _in"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomin), _("Zoom _in"),
666      GTK_STOCK_ZOOM_IN, "<OSM2Go-Main>/View/ZoomIn",      GTK_STOCK_ZOOM_IN, "<OSM2Go-Main>/View/ZoomIn",
667      GDK_comma, GDK_CONTROL_MASK, FALSE, FALSE      GDK_comma, GDK_CONTROL_MASK, TRUE, FALSE, FALSE
668    );    );
669    
670    menu_append_new_item(    menu_append_new_item(
671      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomout), _("Zoom _out"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomout), _("Zoom _out"),
672      GTK_STOCK_ZOOM_OUT, "<OSM2Go-Main>/View/ZoomOut",      GTK_STOCK_ZOOM_OUT, "<OSM2Go-Main>/View/ZoomOut",
673      GDK_period, GDK_CONTROL_MASK, FALSE, FALSE      GDK_period, GDK_CONTROL_MASK, TRUE, FALSE, FALSE
674      );
675    
676      gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
677    
678      menu_append_new_item(
679        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_view_detail_inc), _("More details"),
680        NULL, "<OSM2Go-Main>/View/DetailInc",
681        GDK_period, GDK_MOD1_MASK, TRUE, FALSE, FALSE
682      );
683    
684      menu_append_new_item(
685        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_view_detail_normal), _("Normal details"),
686        NULL, "<OSM2Go-Main>/View/DetailNormal",
687        0, 0, TRUE, FALSE, FALSE
688      );
689    
690      menu_append_new_item(
691        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_view_detail_dec), _("Less details"),
692        NULL, "<OSM2Go-Main>/View/DetailDec",
693        GDK_comma, GDK_MOD1_MASK, TRUE, FALSE, FALSE
694    );    );
695    
696    /* -------------------- OSM submenu -------------------- */    /* -------------------- OSM submenu -------------------- */
# Line 571  void menu_create(appdata_t *appdata) { Line 702  void menu_create(appdata_t *appdata) {
702    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
703    
704    appdata->menu_item_osm_upload = menu_append_new_item(    appdata->menu_item_osm_upload = menu_append_new_item(
705      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload"),
706      "upload.16", "<OSM2Go-Main>/OSM/Upload",      "upload.16", "<OSM2Go-Main>/OSM/Upload",
707      GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE      GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE
708    );    );
709    
710    menu_append_new_item(    menu_append_new_item(
711      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_Download..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_Download"),
712      "download.16", "<OSM2Go-Main>/OSM/Download",      "download.16", "<OSM2Go-Main>/OSM/Download",
713      GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE      GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE
714    );    );
715    
716    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
# Line 588  void menu_create(appdata_t *appdata) { Line 719  void menu_create(appdata_t *appdata) {
719      appdata->menu_item_osm_undo = menu_append_new_item(      appdata->menu_item_osm_undo = menu_append_new_item(
720                 appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo), _("_Undo"),                 appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo), _("_Undo"),
721                 GTK_STOCK_UNDO, "<OSM2Go-Main>/OSM/Undo",                 GTK_STOCK_UNDO, "<OSM2Go-Main>/OSM/Undo",
722                 GDK_z, GDK_CONTROL_MASK, FALSE, FALSE                 GDK_z, GDK_CONTROL_MASK, TRUE, FALSE, FALSE
723                 );                 );
724    } else    } else
725      printf("set environment variable OSM2GO_UNDO_TEST to enable undo framework tests\n");      printf("set environment variable OSM2GO_UNDO_TEST to enable undo framework tests\n");
# Line 596  void menu_create(appdata_t *appdata) { Line 727  void menu_create(appdata_t *appdata) {
727    appdata->menu_item_osm_save_changes = menu_append_new_item(    appdata->menu_item_osm_save_changes = menu_append_new_item(
728      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_save_changes), _("_Save local changes"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_save_changes), _("_Save local changes"),
729      GTK_STOCK_SAVE, "<OSM2Go-Main>/OSM/SaveChanges",      GTK_STOCK_SAVE, "<OSM2Go-Main>/OSM/SaveChanges",
730      GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE      GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE
731    );    );
732    
733    appdata->menu_item_osm_undo_changes = menu_append_new_item(    appdata->menu_item_osm_undo_changes = menu_append_new_item(
734      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes"),
735      GTK_STOCK_DELETE, "<OSM2Go-Main>/OSM/DiscardChanges",      GTK_STOCK_DELETE, "<OSM2Go-Main>/OSM/DiscardChanges",
736      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
737    );    );
738    
739    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
740    appdata->menu_item_osm_relations = menu_append_new_item(    appdata->menu_item_osm_relations = menu_append_new_item(
741      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_osm_relations), _("_Relations..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_osm_relations), _("_Relations"),
742      NULL, "<OSM2Go-Main>/OSM/Relations",      NULL, "<OSM2Go-Main>/OSM/Relations",
743      GDK_r, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE      GDK_r, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE
744    );    );
745    
746    /* -------------------- wms submenu -------------------- */    /* -------------------- wms submenu -------------------- */
# Line 621  void menu_create(appdata_t *appdata) { Line 752  void menu_create(appdata_t *appdata) {
752    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
753    
754    menu_append_new_item(    menu_append_new_item(
755      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import"),
756      GTK_STOCK_INDEX, "<OSM2Go-Main>/WMS/Import",      GTK_STOCK_INDEX, "<OSM2Go-Main>/WMS/Import",
757      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
758    );    );
759    
760    appdata->menu_item_wms_clear = menu_append_new_item(    appdata->menu_item_wms_clear = menu_append_new_item(
761      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_clear), _("_Clear"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_clear), _("_Clear"),
762      GTK_STOCK_CLEAR, "<OSM2Go-Main>/WMS/Clear",      GTK_STOCK_CLEAR, "<OSM2Go-Main>/WMS/Clear",
763      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
764    );    );
765    gtk_widget_set_sensitive(appdata->menu_item_wms_clear, FALSE);    gtk_widget_set_sensitive(appdata->menu_item_wms_clear, FALSE);
766    
767    appdata->menu_item_wms_adjust = menu_append_new_item(    appdata->menu_item_wms_adjust = menu_append_new_item(
768      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_adjust), _("_Adjust"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_adjust), _("_Adjust"),
769      NULL, "<OSM2Go-Main>/WMS/Adjust",      NULL, "<OSM2Go-Main>/WMS/Adjust",
770      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
771    );    );
772    gtk_widget_set_sensitive(appdata->menu_item_wms_adjust, FALSE);    gtk_widget_set_sensitive(appdata->menu_item_wms_adjust, FALSE);
773    
# Line 651  void menu_create(appdata_t *appdata) { Line 782  void menu_create(appdata_t *appdata) {
782    appdata->menu_item_map_hide_sel = menu_append_new_item(    appdata->menu_item_map_hide_sel = menu_append_new_item(
783      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), _("_Hide selected"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), _("_Hide selected"),
784      GTK_STOCK_REMOVE, "<OSM2Go-Main>/Map/HideSelected",      GTK_STOCK_REMOVE, "<OSM2Go-Main>/Map/HideSelected",
785      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
786    );    );
787    gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, FALSE);    gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, FALSE);
788    
789    appdata->menu_item_map_show_all = menu_append_new_item(    appdata->menu_item_map_show_all = menu_append_new_item(
790      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_show_all), _("_Show all"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_show_all), _("_Show all"),
791      GTK_STOCK_ADD, "<OSM2Go-Main>/Map/ShowAll",      GTK_STOCK_ADD, "<OSM2Go-Main>/Map/ShowAll",
792      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
793    );    );
794    gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE);    gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE);
795    
796    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
797    
798    menu_append_new_item(    menu_append_new_item(
799      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_style), _("St_yle..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_style), _("St_yle"),
800      GTK_STOCK_SELECT_COLOR, "<OSM2Go-Main>/Map/Style",      GTK_STOCK_SELECT_COLOR, "<OSM2Go-Main>/Map/Style",
801      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
802    );    );
803    
804    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
# Line 676  void menu_create(appdata_t *appdata) { Line 807  void menu_create(appdata_t *appdata) {
807    menu_append_new_item(    menu_append_new_item(
808      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_redraw), _("_Redraw"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_redraw), _("_Redraw"),
809      NULL, "<OSM2Go-Main>/Map/Redraw",      NULL, "<OSM2Go-Main>/Map/Redraw",
810      GDK_r, GDK_CONTROL_MASK, FALSE, FALSE      GDK_r, GDK_CONTROL_MASK, TRUE, FALSE, FALSE
811    );    );
812    
813    appdata->menu_item_map_no_icons = menu_append_new_item(    appdata->menu_item_map_no_icons = menu_append_new_item(
814      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_icons), _("No _icons"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_icons), _("No _icons"),
815      NULL, "<OSM2Go-Main>/Map/NoIcons",      NULL, "<OSM2Go-Main>/Map/NoIcons",
816      0, 0, TRUE, appdata->settings->no_icons      0, 0, TRUE, TRUE, appdata->settings->no_icons
817    );    );
818    
819    appdata->menu_item_map_no_antialias = menu_append_new_item(    appdata->menu_item_map_no_antialias = menu_append_new_item(
820      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_antialias),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_antialias),
821      _("No _antialias"),      _("No _antialias"),
822      NULL, "<OSM2Go-Main>/Map/NoAntialias",      NULL, "<OSM2Go-Main>/Map/NoAntialias",
823      0, 0, TRUE, appdata->settings->no_antialias      0, 0, TRUE, TRUE, appdata->settings->no_antialias
824    );    );
825    
826    /* -------------------- track submenu -------------------- */    /* -------------------- track submenu -------------------- */
# Line 701  void menu_create(appdata_t *appdata) { Line 832  void menu_create(appdata_t *appdata) {
832    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
833    
834    appdata->track.menu_item_import = menu_append_new_item(    appdata->track.menu_item_import = menu_append_new_item(
835      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import"),
836      NULL, "<OSM2Go-Main>/Track/Import",      NULL, "<OSM2Go-Main>/Track/Import",
837      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
838    );    );
839    
840    appdata->track.menu_item_export = menu_append_new_item(    appdata->track.menu_item_export = menu_append_new_item(
841      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export..."),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export"),
842      NULL, "<OSM2Go-Main>/Track/Export",      NULL, "<OSM2Go-Main>/Track/Export",
843      0, 0, FALSE, FALSE      0, 0, FALSE, FALSE, FALSE
844    );    );
845    
846    appdata->track.menu_item_clear = menu_append_new_item(    appdata->track.menu_item_clear = menu_append_new_item(
847      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_clear), _("_Clear"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_clear), _("_Clear"),
848      GTK_STOCK_CLEAR, "<OSM2Go-Main>/Track/Clear",      GTK_STOCK_CLEAR, "<OSM2Go-Main>/Track/Clear",
849      0, 0, FALSE, FALSE      0, 0, FALSE, FALSE, FALSE
850    );    );
851    
852    
853    appdata->track.menu_item_gps = menu_append_new_item(    appdata->track.menu_item_enable_gps = menu_append_new_item(
854      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_gps), _("_GPS"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_enable_gps),_("_GPS enable"),
855      NULL, "<OSM2Go-Main>/Track/GPS",      NULL, "<OSM2Go-Main>/Track/GPS",
856      GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, FALSE      GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, TRUE,
857        appdata->settings->enable_gps
858      );
859    
860      appdata->track.menu_item_follow_gps = menu_append_new_item(
861        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_follow_gps), _("GPS follow"),
862        NULL, "<OSM2Go-Main>/Track/Follow",
863        0, 0, appdata->settings->enable_gps, TRUE,
864        appdata->settings->follow_gps
865    );    );
866    
867    /* ------------------------------------------------------- */    /* ------------------------------------------------------- */
# Line 731  void menu_create(appdata_t *appdata) { Line 870  void menu_create(appdata_t *appdata) {
870                          gtk_separator_menu_item_new());                          gtk_separator_menu_item_new());
871    
872    menu_append_new_item(    menu_append_new_item(
873      appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About..."),      appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About"),
874      GTK_STOCK_ABOUT, "<OSM2Go-Main>/About",      GTK_STOCK_ABOUT, "<OSM2Go-Main>/About",
875      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
876    );    );
877    
878    menu_append_new_item(    menu_append_new_item(
879      appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_quit), _("_Quit"),      appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_quit), _("_Quit"),
880      GTK_STOCK_QUIT, "<OSM2Go-Main>/Quit",      GTK_STOCK_QUIT, "<OSM2Go-Main>/Quit",
881      0, 0, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
882    );    );
883    
884    gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp);    gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp);
# Line 904  int main(int argc, char *argv[]) { Line 1043  int main(int argc, char *argv[]) {
1043    
1044    g_thread_init(NULL);    g_thread_init(NULL);
1045    
   gps_init(&appdata);  
   
1046    gtk_init (&argc, &argv);    gtk_init (&argc, &argv);
1047    
1048      gps_init(&appdata);
1049    
1050  #ifdef USE_HILDON  #ifdef USE_HILDON
1051    printf("Installing osso context for \"org.harbaum." PACKAGE "\"\n");    printf("Installing osso context for \"org.harbaum." PACKAGE "\"\n");
1052    appdata.osso_context = osso_initialize("org.harbaum."PACKAGE,    appdata.osso_context = osso_initialize("org.harbaum."PACKAGE,
# Line 974  int main(int argc, char *argv[]) { Line 1113  int main(int argc, char *argv[]) {
1113  #ifndef PORTRAIT  #ifndef PORTRAIT
1114    gtk_box_pack_start(GTK_BOX(hbox), iconbar_new(&appdata), FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(hbox), iconbar_new(&appdata), FALSE, FALSE, 0);
1115  #endif  #endif
1116    gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 0);    //  gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 0);
1117    gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);    gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
1118    
1119    gtk_box_pack_start(GTK_BOX(appdata.vbox), hbox, TRUE, TRUE, 0);    gtk_box_pack_start(GTK_BOX(appdata.vbox), hbox, TRUE, TRUE, 0);
# Line 987  int main(int argc, char *argv[]) { Line 1126  int main(int argc, char *argv[]) {
1126    
1127    /* let gtk do its thing before loading the data, */    /* let gtk do its thing before loading the data, */
1128    /* so the user sees something */    /* so the user sees something */
1129    while(gtk_events_pending()) {    while(gtk_events_pending())
     putchar('.');  
1130      gtk_main_iteration();      gtk_main_iteration();
   }  
1131    
1132    /* load project if one is specified in the settings */    /* load project if one is specified in the settings */
1133    if(appdata.settings->project)    if(appdata.settings->project)
# Line 998  int main(int argc, char *argv[]) { Line 1135  int main(int argc, char *argv[]) {
1135    
1136    main_ui_enable(&appdata);    main_ui_enable(&appdata);
1137    
1138    /* ------------ jump into main loop ---------------- */    /* start GPS if enabled by config */
1139      if(appdata.settings && appdata.settings->enable_gps)
1140        track_enable_gps(&appdata, TRUE);
1141    
1142      /* again let the ui do its thing */
1143      while(gtk_events_pending())
1144        gtk_main_iteration();
1145    
1146      /* start to interact with the user now that the gui is running */
1147      if(appdata.settings->first_run_demo) {
1148        messagef(GTK_WIDGET(appdata.window), _("Welcome to OSM2Go"),
1149                 _("This is the first time you run OSM2Go. "
1150                   "A demo project has been loaded to get you "
1151                   "started. You can play around with this demo as much "
1152                   "as you like. However, you cannot upload or download "
1153                   "the demo project.\n\n"
1154                   "In order to start working on real data you'll have "
1155                   "to setup a new project and enter your OSM user name "
1156                   "and password. You'll then be able to download the "
1157                   "latest data from OSM and upload your changes into "
1158                   "the OSM main database."
1159                   ));
1160      }
1161    
1162      /* ------------ jump into main loop ---------------- */
1163    gtk_main();    gtk_main();
1164    
1165    puts("gtk_main() left");    puts("gtk_main() left");
1166    
1167    track_save(appdata.project, appdata.track.track);    track_save(appdata.project, appdata.track.track);
1168      track_clear(&appdata, appdata.track.track);
1169      appdata.track.track = NULL;
1170    
1171    /* save a diff if there are dirty entries */    /* save a diff if there are dirty entries */
1172    diff_save(appdata.project, appdata.osm);    diff_save(appdata.project, appdata.osm);

Legend:
Removed from v.79  
changed lines
  Added in v.185