Diff of /trunk/src/main.c

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

revision 24 by harbaum, Sun Dec 21 11:49:35 2008 UTC revision 68 by harbaum, Tue Feb 10 12:29:09 2009 UTC
# Line 22  Line 22 
22  #include <gdk/gdkkeysyms.h>  #include <gdk/gdkkeysyms.h>
23    
24  #include "appdata.h"  #include "appdata.h"
25    #include "banner.h"
26    
27  /* disable/enable main screen control dependant on presence of open project */  /* disable/enable main screen control dependant on presence of open project */
28  static void main_ui_enable(appdata_t *appdata) {  static void main_ui_enable(appdata_t *appdata) {
# Line 55  static void main_ui_enable(appdata_t *ap Line 56  static void main_ui_enable(appdata_t *ap
56    /* disable all menu entries related to map */    /* disable all menu entries related to map */
57    gtk_widget_set_sensitive(appdata->menu_osm, project_valid);    gtk_widget_set_sensitive(appdata->menu_osm, project_valid);
58    gtk_widget_set_sensitive(appdata->menu_item_osm_upload, osm_valid);    gtk_widget_set_sensitive(appdata->menu_item_osm_upload, osm_valid);
59    gtk_widget_set_sensitive(appdata->menu_item_osm_diff, osm_valid);    if(appdata->menu_item_osm_undo)
60        gtk_widget_set_sensitive(appdata->menu_item_osm_undo, osm_valid);
61      gtk_widget_set_sensitive(appdata->menu_item_osm_save_changes, osm_valid);
62    gtk_widget_set_sensitive(appdata->menu_item_osm_undo_changes, osm_valid);    gtk_widget_set_sensitive(appdata->menu_item_osm_undo_changes, osm_valid);
63    gtk_widget_set_sensitive(appdata->track.menu_track, osm_valid);    gtk_widget_set_sensitive(appdata->track.menu_track, osm_valid);
64    gtk_widget_set_sensitive(appdata->menu_view, osm_valid);    gtk_widget_set_sensitive(appdata->menu_view, osm_valid);
# Line 69  static void main_ui_enable(appdata_t *ap Line 72  static void main_ui_enable(appdata_t *ap
72    
73  /******************** begin of menu *********************/  /******************** begin of menu *********************/
74    
 #if 0 // simplify menu  
 static struct {  
   enum { MENU_END, MENU_ITEM, MENU_SUB, MENU_SUB_END, MENU_SEP }  type;  
   
   char *title;  
   GCallback c_handler;  
 } menu[] = {  
   { MENU_SUB, "_OSM", NULL },  
   
   { MENU_END,  NULL, NULL },  
 };  
 #endif  
   
75  static void  static void
76  cb_menu_project_open(GtkWidget *window, gpointer data) {  cb_menu_project_open(GtkWidget *window, gpointer data) {
77    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
# Line 106  cb_menu_about(GtkWidget *window, gpointe Line 96  cb_menu_about(GtkWidget *window, gpointe
96    
97    const gchar *authors[] = {    const gchar *authors[] = {
98      "Till Harbaum <till@harbaum.org>",      "Till Harbaum <till@harbaum.org>",
99      "Andrew Chadwick",      "Andrew Chadwick <andrewc-osm2go@piffle.org>",
100      NULL };      NULL };
101    
102    gtk_about_dialog_set_authors(about, authors);    gtk_about_dialog_set_authors(about, authors);
# Line 155  cb_menu_download(GtkWidget *window, gpoi Line 145  cb_menu_download(GtkWidget *window, gpoi
145    
146    // download    // download
147    if(osm_download(GTK_WIDGET(appdata->window), appdata->project)) {    if(osm_download(GTK_WIDGET(appdata->window), appdata->project)) {
148        banner_busy_start(appdata, 1, "Redrawing...");
149      appdata->osm = osm_parse(appdata->project->osm);      appdata->osm = osm_parse(appdata->project->osm);
150      diff_restore(appdata, appdata->project, appdata->osm);      diff_restore(appdata, appdata->project, appdata->osm);
151      map_paint(appdata);      map_paint(appdata);
152        banner_busy_stop(appdata); //"Redrawing..."
153    }    }
154    
155    main_ui_enable(appdata);    main_ui_enable(appdata);
# Line 203  cb_menu_redraw(GtkWidget *window, gpoint Line 195  cb_menu_redraw(GtkWidget *window, gpoint
195    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
196    
197    /* redraw the entire map by destroying all map items and redrawing them */    /* redraw the entire map by destroying all map items and redrawing them */
198      banner_busy_start(appdata, 1, "Redrawing...");
199    track_save(appdata->project, appdata->track.track);    track_save(appdata->project, appdata->track.track);
200    diff_save(appdata->project, appdata->osm);    diff_save(appdata->project, appdata->osm);
201    map_clear(appdata, MAP_LAYER_ALL);    map_clear(appdata, MAP_LAYER_ALL);
# Line 217  cb_menu_redraw(GtkWidget *window, gpoint Line 210  cb_menu_redraw(GtkWidget *window, gpoint
210      map_track_draw(appdata->map, appdata->track.track);      map_track_draw(appdata->map, appdata->track.track);
211    
212    wms_load(appdata);    wms_load(appdata);
213      banner_busy_stop(appdata); //"Redrawing..."
214  }  }
215  #endif  #endif
216    
# Line 231  static void Line 225  static void
225  cb_menu_map_no_icons(GtkWidget *widget, gpointer data) {  cb_menu_map_no_icons(GtkWidget *widget, gpointer data) {
226    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
227    
228      banner_busy_start(appdata, 1, "Redrawing...");
229    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
230    appdata->settings->no_icons =    appdata->settings->no_icons =
231      gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));      gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
232    map_paint(appdata);    map_paint(appdata);
233      banner_busy_stop(appdata); //"Redrawing..."
234  }  }
235    
236  static void  static void
237  cb_menu_map_no_antialias(GtkWidget *widget, gpointer data) {  cb_menu_map_no_antialias(GtkWidget *widget, gpointer data) {
238    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
239    
240      banner_busy_start(appdata, 1, "Redrawing...");
241    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
242    appdata->settings->no_antialias =    appdata->settings->no_antialias =
243      gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));      gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
244    map_paint(appdata);    map_paint(appdata);
245      banner_busy_stop(appdata); //"Redrawing..."
246    }
247    
248    static void
249    cb_menu_undo(GtkWidget *widget, gpointer data) {
250      appdata_t *appdata = (appdata_t*)data;
251    
252      undo(appdata);
253    
254      // the banner will be displayed from within undo with more details
255  }  }
256    
257  static void  static void
# Line 252  cb_menu_save_changes(GtkWidget *widget, Line 259  cb_menu_save_changes(GtkWidget *widget,
259    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
260    
261    diff_save(appdata->project, appdata->osm);    diff_save(appdata->project, appdata->osm);
262    statusbar_set(appdata, _("Saved all changes made "    banner_show_info(appdata, _("Saved local changes"));
                            "to this project so far"), FALSE);  
263  }  }
264    
265  static void  static void
# Line 261  cb_menu_undo_changes(GtkWidget *widget, Line 267  cb_menu_undo_changes(GtkWidget *widget,
267    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
268    
269    if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0,    if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0,
270                 _("Undo all changes?"),                 _("Discard local changes?"),
271                 _("Do you really want to undo all your changes "                 _("Throw away all the changes you've not uploaded yet? This can't be undone.")))
                  "not uploaded so far? This cannot be undone!")))  
272      return;      return;
273    
274      banner_busy_start(appdata, 1, _("Redrawing..."));
275    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
276    osm_free(&appdata->icon, appdata->osm);    osm_free(&appdata->icon, appdata->osm);
277    diff_remove(appdata->project);    diff_remove(appdata->project);
278    appdata->osm = osm_parse(appdata->project->osm);    appdata->osm = osm_parse(appdata->project->osm);
279    map_paint(appdata);    map_paint(appdata);
280      banner_busy_stop(appdata);  //"Redrawing..."
281    
282    statusbar_set(appdata, _("All changes made "    banner_show_info(appdata, _("Discarded local changes"));
                            "so far have been reset"), FALSE);  
283  }  }
284    
285  static void  static void
# Line 376  cb_menu_track_clear(GtkWidget *window, g Line 382  cb_menu_track_clear(GtkWidget *window, g
382    track_do(appdata, TRACK_NONE, NULL);    track_do(appdata, TRACK_NONE, NULL);
383  }  }
384    
385    
386    
387    
388    /*
389     *  Platform-specific UI tweaks.
390     */
391    
392    
393    #ifndef USE_HILDON
394    #ifdef PORTRAIT
395    
396    // Portrait mode, for openmoko-like systems
397    #define uispecific_main_menu_new gtk_menu_new
398    
399    #else
400    
401    // Regular desktop builds
402    #define uispecific_main_menu_new gtk_menu_bar_new
403    #define UISPECIFIC_MAIN_MENU_IS_MENU_BAR
404    #define UISPECIFIC_MENU_HAS_ICONS
405    #define UISPECIFIC_MENU_HAS_ACCELS
406    
407    #endif //PORTRAIT
408    #else//USE_HILDON
409    
410    // Maemo/Hildon builds
411    #define uispecific_main_menu_new gtk_menu_new
412    
413    #endif
414    
415    
416    
417    // Half-arsed slapdash common menu item constructor. Let's use GtkBuilder
418    // instead so we have some flexibility.
419    
420    static GtkWidget *
421    menu_append_new_item(appdata_t *appdata,
422                         GtkWidget *menu_shell,
423                         GtkSignalFunc activate_cb,
424                         char *label,
425                         const gchar *stock_id, // overridden by label, accels
426                         const gchar *accel_path,
427                         guint accel_key,      // from gdk/gdkkeysyms.h
428                         GdkModifierType accel_mods, // e.g. GDK_CONTROL_MASK
429                         gboolean is_check, gboolean check_status)
430    {
431      GtkWidget *item = NULL;
432      GtkStockItem stock_item;
433      gboolean stock_item_known = FALSE;
434      if (stock_id != NULL) {
435        stock_item_known = gtk_stock_lookup(stock_id, &stock_item);
436      }
437    
438      // Icons
439    #ifndef UISPECIFIC_MENU_HAS_ICONS
440      item = is_check ? gtk_check_menu_item_new_with_mnemonic (label)
441                      : gtk_menu_item_new_with_mnemonic       (label);
442    #else
443      if (is_check || !stock_item_known) {
444        item = is_check ? gtk_check_menu_item_new_with_mnemonic (label)
445                        : gtk_menu_item_new_with_mnemonic       (label);
446      }
447      else {
448        item = gtk_image_menu_item_new_with_mnemonic(label);
449        GtkWidget *stock_image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
450        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), stock_image);
451      }
452    #endif
453    
454    #ifdef UISPECIFIC_MENU_HAS_ACCELS
455      // Accelerators
456      // Default
457      if (accel_path != NULL) {
458        gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
459        if (accel_key != 0) {
460          gtk_accel_map_add_entry( accel_path, accel_key, accel_mods );
461        }
462        else if (stock_item_known) {
463          gtk_accel_map_add_entry( accel_path, stock_item.keyval,
464                                   stock_item.modifier );
465        }
466      }
467    #endif
468    
469      gtk_menu_shell_append(GTK_MENU_SHELL(menu_shell), GTK_WIDGET(item));
470      if (is_check) {
471        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), check_status);
472      }
473      g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(activate_cb),
474                       appdata);
475      return item;
476    }
477    
478    
479  void menu_create(appdata_t *appdata) {  void menu_create(appdata_t *appdata) {
480    GtkWidget *menu, *item, *submenu;    GtkWidget *menu, *item, *submenu;
481    menu = gtk_menu_new();    GtkWidget *about_quit_items_menu;
482    
483      if (g_module_supported()) {
484        printf("*** can use GModule: consider using GtkUIManager / GtkBuilder\n");
485      }
486    
487      menu = uispecific_main_menu_new();
488      about_quit_items_menu = menu;
489    
490    /* -------------------- Project submenu -------------------- */    /* -------------------- Project submenu -------------------- */
491    
492    item = gtk_menu_item_new_with_label( _("Project") );    GtkAccelGroup *accel_grp = gtk_accel_group_new();
493    gtk_menu_append(GTK_MENU_SHELL(menu), item);    item = gtk_menu_item_new_with_mnemonic( _("_Project") );
494      gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
495    submenu = gtk_menu_new();    submenu = gtk_menu_new();
496      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
497    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
498    #ifdef UISPECIFIC_MAIN_MENU_IS_MENU_BAR
499      about_quit_items_menu = submenu;
500    #endif
501    
502    item = gtk_menu_item_new_with_label( _("Open...") );    menu_append_new_item(
503    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open..."),
504    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_open),      GTK_STOCK_OPEN, "<OSM2Go-Main>/Project/Open",
505                     appdata);      0, 0, FALSE, FALSE
506      );
507    appdata->menu_item_project_close = item =  
508      gtk_menu_item_new_with_label( _("Close") );    appdata->menu_item_project_close = menu_append_new_item(
509    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_close), _("_Close"),
510    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_close),      GTK_STOCK_CLOSE, "<OSM2Go-Main>/Project/Close",
511                     appdata);      0, 0, FALSE, FALSE
512      );
513    
514    /* --------------- view menu ------------------- */    /* --------------- view menu ------------------- */
515    
516    gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());  #ifndef UISPECIFIC_MENU_IS_MENU_BAR
517      gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
518    #endif
519    
520    appdata->menu_view = item =    appdata->menu_view = item = gtk_menu_item_new_with_mnemonic( _("_View") );
521      gtk_menu_item_new_with_label( _("View") );    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
   gtk_menu_append(GTK_MENU_SHELL(menu), item);  
522    submenu = gtk_menu_new();    submenu = gtk_menu_new();
523      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
524    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
525    
526    appdata->menu_item_view_fullscreen =    appdata->menu_item_view_fullscreen = menu_append_new_item(
527      item = gtk_check_menu_item_new_with_label( _("Fullscreen") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_fullscreen), _("_Fullscreen"),
528    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_FULLSCREEN, "<OSM2Go-Main>/View/Fullscreen",
529    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_fullscreen),      0, 0, TRUE, FALSE
530                     appdata);    );
531    
532    item = gtk_menu_item_new_with_label( _("Zoom +" ));    menu_append_new_item(
533    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomin), _("Zoom _in"),
534    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_zoomin), appdata);      GTK_STOCK_ZOOM_IN, "<OSM2Go-Main>/View/ZoomIn",
535        GDK_comma, GDK_CONTROL_MASK, FALSE, FALSE
536    item = gtk_menu_item_new_with_label( _("Zoom -") );    );
537    gtk_menu_append(GTK_MENU_SHELL(submenu), item);  
538    g_signal_connect(item, "activate",    menu_append_new_item(
539                     GTK_SIGNAL_FUNC(cb_menu_zoomout), appdata);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomout), _("Zoom _out"),
540        GTK_STOCK_ZOOM_OUT, "<OSM2Go-Main>/View/ZoomOut",
541        GDK_period, GDK_CONTROL_MASK, FALSE, FALSE
542      );
543    
544    /* -------------------- OSM submenu -------------------- */    /* -------------------- OSM submenu -------------------- */
545    
546    appdata->menu_osm = item = gtk_menu_item_new_with_label( _("OSM") );    appdata->menu_osm = item = gtk_menu_item_new_with_mnemonic( _("_OSM") );
547    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
548    submenu = gtk_menu_new();    submenu = gtk_menu_new();
549      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
550    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
551    
552    appdata->menu_item_osm_upload = item =    appdata->menu_item_osm_upload = menu_append_new_item(
553      gtk_menu_item_new_with_label( _("Upload...") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload..."),
554    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/OSM/Upload",
555    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_upload), appdata);      GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE
556      );
557    item = gtk_menu_item_new_with_label( _("Download...") );  
558    gtk_menu_append(GTK_MENU_SHELL(submenu), item);    menu_append_new_item(
559    g_signal_connect(item, "activate",      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_Download..."),
560                     GTK_SIGNAL_FUNC(cb_menu_download), appdata);      NULL, "<OSM2Go-Main>/OSM/Download",
561        GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE
562    gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    );
563    
564    appdata->menu_item_osm_diff = item =    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
565      gtk_menu_item_new_with_label( _("Save diff file") );  
566    gtk_menu_append(GTK_MENU_SHELL(submenu), item);    if(getenv("OSM2GO_UNDO_TEST")) {
567    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_save_changes),      appdata->menu_item_osm_undo = menu_append_new_item(
568                     appdata);                 appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo), _("_Undo"),
569                   GTK_STOCK_UNDO, "<OSM2Go-Main>/OSM/Undo",
570    appdata->menu_item_osm_undo_changes = item =                 GDK_z, GDK_CONTROL_MASK, FALSE, FALSE
571      gtk_menu_item_new_with_label( _("Undo all changes...") );                 );
572    gtk_menu_append(GTK_MENU_SHELL(submenu), item);    } else
573    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_undo_changes),      printf("set environment variable OSM2GO_UNDO_TEST to enable undo framework tests\n");
574                     appdata);  
575      appdata->menu_item_osm_save_changes = menu_append_new_item(
576        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_save_changes), _("_Save local changes"),
577        GTK_STOCK_SAVE, "<OSM2Go-Main>/OSM/SaveChanges",
578        GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE
579      );
580    
581      appdata->menu_item_osm_undo_changes = menu_append_new_item(
582        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes..."),
583        GTK_STOCK_DELETE, "<OSM2Go-Main>/OSM/DiscardChanges",
584        0, 0, FALSE, FALSE
585      );
586    
587    /* -------------------- wms submenu -------------------- */    /* -------------------- wms submenu -------------------- */
588    
589    appdata->menu_wms = item = gtk_menu_item_new_with_label( _("WMS") );    appdata->menu_wms = item = gtk_menu_item_new_with_mnemonic( _("_WMS") );
590    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
591    submenu = gtk_menu_new();    submenu = gtk_menu_new();
592      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
593    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
594    
595    item = gtk_menu_item_new_with_label( _("Import...") );    menu_append_new_item(
596    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import..."),
597    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_import),      GTK_STOCK_INDEX, "<OSM2Go-Main>/WMS/Import",
598                     appdata);      0, 0, FALSE, FALSE
599      );
600    appdata->menu_item_wms_clear = item =  
601      gtk_menu_item_new_with_label( _("Clear") );    appdata->menu_item_wms_clear = menu_append_new_item(
602    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_clear), _("_Clear"),
603    gtk_widget_set_sensitive(item, FALSE);      GTK_STOCK_CLEAR, "<OSM2Go-Main>/WMS/Clear",
604    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_clear),      0, 0, FALSE, FALSE
605                     appdata);    );
606      gtk_widget_set_sensitive(appdata->menu_item_wms_clear, FALSE);
607    appdata->menu_item_wms_adjust = item =  
608      gtk_menu_item_new_with_label( _("Adjust") );    appdata->menu_item_wms_adjust = menu_append_new_item(
609    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_adjust), _("_Adjust"),
610    gtk_widget_set_sensitive(item, FALSE);      NULL, "<OSM2Go-Main>/WMS/Adjust",
611    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_adjust),      0, 0, FALSE, FALSE
612                     appdata);    );
613      gtk_widget_set_sensitive(appdata->menu_item_wms_adjust, FALSE);
614    
615    /* -------------------- map submenu -------------------- */    /* -------------------- map submenu -------------------- */
616    
617    appdata->menu_map = item = gtk_menu_item_new_with_label( _("Map") );    appdata->menu_map = item = gtk_menu_item_new_with_mnemonic( _("_Map") );
618    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
619    submenu = gtk_menu_new();    submenu = gtk_menu_new();
620      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
621    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
622    
623    appdata->menu_item_map_hide_sel = item =    appdata->menu_item_map_hide_sel = menu_append_new_item(
624      gtk_menu_item_new_with_label( _("Hide selected") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), _("_Hide selected"),
625    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_REMOVE, "<OSM2Go-Main>/Map/HideSelected",
626    gtk_widget_set_sensitive(item, FALSE);      0, 0, FALSE, FALSE
627    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_hide_sel),    );
628                     appdata);    gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, FALSE);
629    
630    appdata->menu_item_map_show_all = item =    appdata->menu_item_map_show_all = menu_append_new_item(
631      gtk_menu_item_new_with_label( _("Show all") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_show_all), _("_Show all"),
632    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_ADD, "<OSM2Go-Main>/Map/ShowAll",
633    gtk_widget_set_sensitive(item, FALSE);      0, 0, FALSE, FALSE
634    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_show_all),    );
635                     appdata);    gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE);
636    
637    gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
638    
639    item = gtk_menu_item_new_with_label( _("Style...") );    menu_append_new_item(
640    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_style), _("St_yle..."),
641    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_style), appdata);      GTK_STOCK_SELECT_COLOR, "<OSM2Go-Main>/Map/Style",
642        0, 0, FALSE, FALSE
643      );
644    
645    gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
646    
647    /* switches mainly intended for testing/debugging */    /* switches mainly intended for testing/debugging */
648    item = gtk_menu_item_new_with_label( _("Redraw") );    menu_append_new_item(
649    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_redraw), _("_Redraw"),
650    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_redraw), appdata);      NULL, "<OSM2Go-Main>/Map/Redraw",
651        GDK_r, GDK_CONTROL_MASK, FALSE, FALSE
652    appdata->menu_item_map_no_icons =    );
653      item = gtk_check_menu_item_new_with_label( _("No Icons") );  
654    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),    appdata->menu_item_map_no_icons = menu_append_new_item(
655                                   appdata->settings->no_icons);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_icons), _("No _icons"),
656    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/Map/NoIcons",
657    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_no_icons),      0, 0, TRUE, appdata->settings->no_icons
658                     appdata);    );
659    
660    appdata->menu_item_map_no_antialias =    appdata->menu_item_map_no_antialias = menu_append_new_item(
661      item = gtk_check_menu_item_new_with_label( _("No Antialias") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_antialias),
662    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),      _("No _antialias"),
663                                   appdata->settings->no_antialias);      NULL, "<OSM2Go-Main>/Map/NoAntialias",
664    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      0, 0, TRUE, appdata->settings->no_antialias
665    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_no_antialias),    );
                    appdata);  
666    
667    /* -------------------- track submenu -------------------- */    /* -------------------- track submenu -------------------- */
668    
669    appdata->track.menu_track = item = gtk_menu_item_new_with_label(_("Track"));    appdata->track.menu_track = item = gtk_menu_item_new_with_mnemonic(_("_Track"));
670    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
671    submenu = gtk_menu_new();    submenu = gtk_menu_new();
672      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
673    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
674    
675    appdata->track.menu_item_import =    appdata->track.menu_item_import = menu_append_new_item(
676      item = gtk_menu_item_new_with_label( _("Import...") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import..."),
677    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/Track/Import",
678    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_import),      0, 0, FALSE, FALSE
679                     appdata);    );
680    
681    appdata->track.menu_item_export =    appdata->track.menu_item_export = menu_append_new_item(
682      item = gtk_menu_item_new_with_label( _("Export...") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export..."),
683    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/Track/Export",
684    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_export),      0, 0, FALSE, FALSE
685                     appdata);    );
686    
687    appdata->track.menu_item_clear =    appdata->track.menu_item_clear = menu_append_new_item(
688      item = gtk_menu_item_new_with_label( _("Clear") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_clear), _("_Clear"),
689    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_CLEAR, "<OSM2Go-Main>/Track/Clear",
690    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_clear),      0, 0, FALSE, FALSE
691                     appdata);    );
692    
693    appdata->track.menu_item_gps =  
694      item = gtk_check_menu_item_new_with_label( _("GPS") );    appdata->track.menu_item_gps = menu_append_new_item(
695    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_gps), _("_GPS"),
696    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_gps),      NULL, "<OSM2Go-Main>/Track/GPS",
697                     appdata);      GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, FALSE
698      );
699    
700    /* ------------------------------------------------------- */    /* ------------------------------------------------------- */
701    
702    gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(about_quit_items_menu),
703                            gtk_separator_menu_item_new());
704    
705    item = gtk_menu_item_new_with_label( _("About...") );    menu_append_new_item(
706    gtk_menu_append(GTK_MENU_SHELL(menu), item);      appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About..."),
707    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_about), appdata);      GTK_STOCK_ABOUT, "<OSM2Go-Main>/About",
708        0, 0, FALSE, FALSE
709      );
710    
711      menu_append_new_item(
712        appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_quit), _("_Quit"),
713        GTK_STOCK_QUIT, "<OSM2Go-Main>/Quit",
714        0, 0, FALSE, FALSE
715      );
716    
717      gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp);
   item = gtk_menu_item_new_with_label( _("Quit") );  
   gtk_menu_append(GTK_MENU_SHELL(menu), item);  
   g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_quit), appdata);  
718    
719  #ifdef USE_HILDON  #ifdef USE_HILDON
720    hildon_window_set_menu(appdata->window, GTK_MENU(menu));    hildon_window_set_menu(appdata->window, GTK_MENU(menu));
721  #else  #else
722    /* attach ordinary gtk menu */    GtkWidget *menu_bar = menu;
723    GtkWidget *menu_bar = gtk_menu_bar_new();  
724    #ifndef UISPECIFIC_MAIN_MENU_IS_MENU_BAR
725      // we need to make one first
726      menu_bar = gtk_menu_bar_new();
727    
728    GtkWidget *root_menu = gtk_menu_item_new_with_label (_("Menu"));    GtkWidget *root_menu = gtk_menu_item_new_with_label (_("Menu"));
729    gtk_widget_show(root_menu);    gtk_widget_show(root_menu);
# Line 589  void menu_create(appdata_t *appdata) { Line 732  void menu_create(appdata_t *appdata) {
732    gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);
733    
734    gtk_widget_show(menu_bar);    gtk_widget_show(menu_bar);
735    #endif //UISPECIFIC_MAIN_MENU_IS_MENU_BAR
736    
737    gtk_box_pack_start(GTK_BOX(appdata->vbox), menu_bar, 0, 0, 0);    gtk_box_pack_start(GTK_BOX(appdata->vbox), menu_bar, 0, 0, 0);
738  #endif  
739    #endif //USE_HILDON
740  }  }
741    
742  /********************* end of menu **********************/  /********************* end of menu **********************/
743    
744    #ifdef UISPECIFIC_MENU_HAS_ACCELS
745    #define ACCELS_FILE "accels"
746    
747    static void menu_accels_load(appdata_t *appdata) {
748      char *accels_file = g_strdup_printf("%s/" ACCELS_FILE,
749                                          appdata->settings->base_path);
750      gtk_accel_map_load(accels_file);
751      g_free(accels_file);
752    }
753    
754    static void menu_accels_save(appdata_t *appdata) {
755      char *accels_file = g_strdup_printf("%s" ACCELS_FILE,
756                                          appdata->settings->base_path);
757      gtk_accel_map_save(accels_file);
758      g_free(accels_file);
759    }
760    
761    #endif
762    
763    
764  void cleanup(appdata_t *appdata) {  void cleanup(appdata_t *appdata) {
765    #ifdef UISPECIFIC_MENU_HAS_ACCELS
766      menu_accels_save(appdata);
767    #endif
768    
769    settings_save(appdata->settings);    settings_save(appdata->settings);
770    
771  #ifdef USE_HILDON  #ifdef USE_HILDON
# Line 640  void cleanup(appdata_t *appdata) { Line 809  void cleanup(appdata_t *appdata) {
809    
810    project_free(appdata->project);    project_free(appdata->project);
811    
812      undo_free(appdata->undo.state);
813    
814    puts("everything is gone");    puts("everything is gone");
815  }  }
816    
# Line 748  int main(int argc, char *argv[]) { Line 919  int main(int argc, char *argv[]) {
919    
920    appdata.vbox = gtk_vbox_new(FALSE,0);    appdata.vbox = gtk_vbox_new(FALSE,0);
921    menu_create(&appdata);    menu_create(&appdata);
922    #ifdef UISPECIFIC_MENU_HAS_ACCELS
923      menu_accels_load(&appdata);
924    #endif
925    
926    /* ----------------------- setup main window ---------------- */    /* ----------------------- setup main window ---------------- */
927    
# Line 810  int main(int argc, char *argv[]) { Line 984  int main(int argc, char *argv[]) {
984    
985    return 0;    return 0;
986  }  }
987    
988    // vim:et:ts=8:sw=2:sts=2:ai

Legend:
Removed from v.24  
changed lines
  Added in v.68