Diff of /trunk/src/main.c

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

revision 15 by harbaum, Tue Dec 16 17:00:20 2008 UTC revision 69 by harbaum, Wed Feb 11 12:44:48 2009 UTC
# Line 19  Line 19 
19  #include <string.h>  #include <string.h>
20    
21  #include <curl/curl.h>  #include <curl/curl.h>
22    #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 54  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 68  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 105  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 154  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 202  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 216  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 230  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
237    cb_menu_map_no_antialias(GtkWidget *widget, gpointer data) {
238      appdata_t *appdata = (appdata_t*)data;
239    
240      banner_busy_start(appdata, 1, "Redrawing...");
241      map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
242      appdata->settings->no_antialias =
243        gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
244      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 241  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 250  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 "
272                   "not uploaded so far? This cannot be undone!")))                   "uploaded yet? This can't be undone.")))
273      return;      return;
274    
275      banner_busy_start(appdata, 1, _("Redrawing..."));
276    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);    map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
277    osm_free(&appdata->icon, appdata->osm);    osm_free(&appdata->icon, appdata->osm);
278    diff_remove(appdata->project);    diff_remove(appdata->project);
279    appdata->osm = osm_parse(appdata->project->osm);    appdata->osm = osm_parse(appdata->project->osm);
280    map_paint(appdata);    map_paint(appdata);
281      banner_busy_stop(appdata);  //"Redrawing..."
282    
283    statusbar_set(appdata, _("All changes made "    banner_show_info(appdata, _("Discarded local changes"));
                            "so far have been reset"), FALSE);  
284  }  }
285    
   
 #ifdef USE_HILDON  
286  static void  static void
287  cb_menu_fullscreen(GtkWidget *widget, gpointer data) {  cb_menu_fullscreen(GtkWidget *widget, gpointer data) {
288    appdata_t *appdata = (appdata_t *)data;    appdata_t *appdata = (appdata_t *)data;
# Line 276  cb_menu_fullscreen(GtkWidget *widget, gp Line 292  cb_menu_fullscreen(GtkWidget *widget, gp
292    else    else
293      gtk_window_unfullscreen(GTK_WINDOW(appdata->window));      gtk_window_unfullscreen(GTK_WINDOW(appdata->window));
294  }  }
 #endif  
295    
296  static void  static void
297  cb_menu_zoomin(GtkWidget *widget, appdata_t *appdata) {  cb_menu_zoomin(GtkWidget *widget, appdata_t *appdata) {
# Line 368  cb_menu_track_clear(GtkWidget *window, g Line 383  cb_menu_track_clear(GtkWidget *window, g
383    track_do(appdata, TRACK_NONE, NULL);    track_do(appdata, TRACK_NONE, NULL);
384  }  }
385    
386    
387    
388    
389    /*
390     *  Platform-specific UI tweaks.
391     */
392    
393    
394    #ifndef USE_HILDON
395    #ifdef PORTRAIT
396    
397    // Portrait mode, for openmoko-like systems
398    #define uispecific_main_menu_new gtk_menu_new
399    
400    #else
401    
402    // Regular desktop builds
403    #define uispecific_main_menu_new gtk_menu_bar_new
404    #define UISPECIFIC_MAIN_MENU_IS_MENU_BAR
405    #define UISPECIFIC_MENU_HAS_ICONS
406    #define UISPECIFIC_MENU_HAS_ACCELS
407    
408    #endif //PORTRAIT
409    #else//USE_HILDON
410    
411    // Maemo/Hildon builds
412    #define uispecific_main_menu_new gtk_menu_new
413    
414    #endif
415    
416    
417    
418    // Half-arsed slapdash common menu item constructor. Let's use GtkBuilder
419    // instead so we have some flexibility.
420    
421    static GtkWidget *
422    menu_append_new_item(appdata_t *appdata,
423                         GtkWidget *menu_shell,
424                         GtkSignalFunc activate_cb,
425                         char *label,
426                         const gchar *stock_id, // overridden by label, accels
427                         const gchar *accel_path,
428                         guint accel_key,      // from gdk/gdkkeysyms.h
429                         GdkModifierType accel_mods, // e.g. GDK_CONTROL_MASK
430                         gboolean is_check, gboolean check_status)
431    {
432      GtkWidget *item = NULL;
433      GtkStockItem stock_item;
434      gboolean stock_item_known = FALSE;
435      if (stock_id != NULL) {
436        stock_item_known = gtk_stock_lookup(stock_id, &stock_item);
437      }
438    
439      // Icons
440    #ifndef UISPECIFIC_MENU_HAS_ICONS
441      item = is_check ? gtk_check_menu_item_new_with_mnemonic (label)
442                      : gtk_menu_item_new_with_mnemonic       (label);
443    #else
444      if (is_check || !stock_item_known) {
445        item = is_check ? gtk_check_menu_item_new_with_mnemonic (label)
446                        : gtk_menu_item_new_with_mnemonic       (label);
447      }
448      else {
449        item = gtk_image_menu_item_new_with_mnemonic(label);
450        GtkWidget *stock_image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
451        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), stock_image);
452      }
453    #endif
454    
455    #ifdef UISPECIFIC_MENU_HAS_ACCELS
456      // Accelerators
457      // Default
458      if (accel_path != NULL) {
459        gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
460        if (accel_key != 0) {
461          gtk_accel_map_add_entry( accel_path, accel_key, accel_mods );
462        }
463        else if (stock_item_known) {
464          gtk_accel_map_add_entry( accel_path, stock_item.keyval,
465                                   stock_item.modifier );
466        }
467      }
468    #endif
469    
470      gtk_menu_shell_append(GTK_MENU_SHELL(menu_shell), GTK_WIDGET(item));
471      if (is_check) {
472        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), check_status);
473      }
474      g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(activate_cb),
475                       appdata);
476      return item;
477    }
478    
479    
480  void menu_create(appdata_t *appdata) {  void menu_create(appdata_t *appdata) {
481    GtkWidget *menu, *item, *submenu;    GtkWidget *menu, *item, *submenu;
482    menu = gtk_menu_new();    GtkWidget *about_quit_items_menu;
483    
484      if (g_module_supported()) {
485        printf("*** can use GModule: consider using GtkUIManager / GtkBuilder\n");
486      }
487    
488      menu = uispecific_main_menu_new();
489      about_quit_items_menu = menu;
490    
491    /* -------------------- Project submenu -------------------- */    /* -------------------- Project submenu -------------------- */
492    
493    item = gtk_menu_item_new_with_label( _("Project") );    GtkAccelGroup *accel_grp = gtk_accel_group_new();
494    gtk_menu_append(GTK_MENU_SHELL(menu), item);    item = gtk_menu_item_new_with_mnemonic( _("_Project") );
495      gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
496    submenu = gtk_menu_new();    submenu = gtk_menu_new();
497      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
498    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
499    #ifdef UISPECIFIC_MAIN_MENU_IS_MENU_BAR
500      about_quit_items_menu = submenu;
501    #endif
502    
503    item = gtk_menu_item_new_with_label( _("Open...") );    menu_append_new_item(
504    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open..."),
505    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_open),      GTK_STOCK_OPEN, "<OSM2Go-Main>/Project/Open",
506                     appdata);      0, 0, FALSE, FALSE
507      );
508    appdata->menu_item_project_close = item =  
509      gtk_menu_item_new_with_label( _("Close") );    appdata->menu_item_project_close = menu_append_new_item(
510    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_close), _("_Close"),
511    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_close),      GTK_STOCK_CLOSE, "<OSM2Go-Main>/Project/Close",
512                     appdata);      0, 0, FALSE, FALSE
513      );
514    
515    /* --------------- view menu ------------------- */    /* --------------- view menu ------------------- */
516    
517    gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());  #ifndef UISPECIFIC_MENU_IS_MENU_BAR
518      gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
519    #endif
520    
521    appdata->menu_view = item =    appdata->menu_view = item = gtk_menu_item_new_with_mnemonic( _("_View") );
522      gtk_menu_item_new_with_label( _("View") );    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
   gtk_menu_append(GTK_MENU_SHELL(menu), item);  
523    submenu = gtk_menu_new();    submenu = gtk_menu_new();
524      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
525    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
526    
527  #ifdef USE_HILDON    appdata->menu_item_view_fullscreen = menu_append_new_item(
528    appdata->fullscreen_menu_item =      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_fullscreen), _("_Fullscreen"),
529      item = gtk_check_menu_item_new_with_label( _("Fullscreen") );      GTK_STOCK_FULLSCREEN, "<OSM2Go-Main>/View/Fullscreen",
530    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      0, 0, TRUE, FALSE
531    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_fullscreen),    );
532                     appdata);  
533  #endif    menu_append_new_item(
534        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomin), _("Zoom _in"),
535    item = gtk_menu_item_new_with_label( _("Zoom +" ));      GTK_STOCK_ZOOM_IN, "<OSM2Go-Main>/View/ZoomIn",
536    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GDK_comma, GDK_CONTROL_MASK, FALSE, FALSE
537    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_zoomin), appdata);    );
538    
539    item = gtk_menu_item_new_with_label( _("Zoom -") );    menu_append_new_item(
540    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomout), _("Zoom _out"),
541    g_signal_connect(item, "activate",      GTK_STOCK_ZOOM_OUT, "<OSM2Go-Main>/View/ZoomOut",
542                     GTK_SIGNAL_FUNC(cb_menu_zoomout), appdata);      GDK_period, GDK_CONTROL_MASK, FALSE, FALSE
543      );
544    
545    /* -------------------- OSM submenu -------------------- */    /* -------------------- OSM submenu -------------------- */
546    
547    appdata->menu_osm = item = gtk_menu_item_new_with_label( _("OSM") );    appdata->menu_osm = item = gtk_menu_item_new_with_mnemonic( _("_OSM") );
548    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
549    submenu = gtk_menu_new();    submenu = gtk_menu_new();
550      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
551    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
552    
553    appdata->menu_item_osm_upload = item =    appdata->menu_item_osm_upload = menu_append_new_item(
554      gtk_menu_item_new_with_label( _("Upload...") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload..."),
555    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/OSM/Upload",
556    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_upload), appdata);      GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE
557      );
558    item = gtk_menu_item_new_with_label( _("Download...") );  
559    gtk_menu_append(GTK_MENU_SHELL(submenu), item);    menu_append_new_item(
560    g_signal_connect(item, "activate",      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_Download..."),
561                     GTK_SIGNAL_FUNC(cb_menu_download), appdata);      NULL, "<OSM2Go-Main>/OSM/Download",
562        GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE
563    gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    );
564    
565    appdata->menu_item_osm_diff = item =    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
566      gtk_menu_item_new_with_label( _("Save diff file") );  
567    gtk_menu_append(GTK_MENU_SHELL(submenu), item);    if(getenv("OSM2GO_UNDO_TEST")) {
568    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_save_changes),      appdata->menu_item_osm_undo = menu_append_new_item(
569                     appdata);                 appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo), _("_Undo"),
570                   GTK_STOCK_UNDO, "<OSM2Go-Main>/OSM/Undo",
571    appdata->menu_item_osm_undo_changes = item =                 GDK_z, GDK_CONTROL_MASK, FALSE, FALSE
572      gtk_menu_item_new_with_label( _("Undo all changes...") );                 );
573    gtk_menu_append(GTK_MENU_SHELL(submenu), item);    } else
574    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");
575                     appdata);  
576      appdata->menu_item_osm_save_changes = menu_append_new_item(
577        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_save_changes), _("_Save local changes"),
578        GTK_STOCK_SAVE, "<OSM2Go-Main>/OSM/SaveChanges",
579        GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE
580      );
581    
582      appdata->menu_item_osm_undo_changes = menu_append_new_item(
583        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes..."),
584        GTK_STOCK_DELETE, "<OSM2Go-Main>/OSM/DiscardChanges",
585        0, 0, FALSE, FALSE
586      );
587    
588    /* -------------------- wms submenu -------------------- */    /* -------------------- wms submenu -------------------- */
589    
590    appdata->menu_wms = item = gtk_menu_item_new_with_label( _("WMS") );    appdata->menu_wms = item = gtk_menu_item_new_with_mnemonic( _("_WMS") );
591    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
592    submenu = gtk_menu_new();    submenu = gtk_menu_new();
593      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
594    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
595    
596    item = gtk_menu_item_new_with_label( _("Import...") );    menu_append_new_item(
597    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import..."),
598    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_import),      GTK_STOCK_INDEX, "<OSM2Go-Main>/WMS/Import",
599                     appdata);      0, 0, FALSE, FALSE
600      );
601    appdata->menu_item_wms_clear = item =  
602      gtk_menu_item_new_with_label( _("Clear") );    appdata->menu_item_wms_clear = menu_append_new_item(
603    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_clear), _("_Clear"),
604    gtk_widget_set_sensitive(item, FALSE);      GTK_STOCK_CLEAR, "<OSM2Go-Main>/WMS/Clear",
605    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_clear),      0, 0, FALSE, FALSE
606                     appdata);    );
607      gtk_widget_set_sensitive(appdata->menu_item_wms_clear, FALSE);
608    appdata->menu_item_wms_adjust = item =  
609      gtk_menu_item_new_with_label( _("Adjust") );    appdata->menu_item_wms_adjust = menu_append_new_item(
610    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_adjust), _("_Adjust"),
611    gtk_widget_set_sensitive(item, FALSE);      NULL, "<OSM2Go-Main>/WMS/Adjust",
612    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_adjust),      0, 0, FALSE, FALSE
613                     appdata);    );
614      gtk_widget_set_sensitive(appdata->menu_item_wms_adjust, FALSE);
615    
616    /* -------------------- map submenu -------------------- */    /* -------------------- map submenu -------------------- */
617    
618    appdata->menu_map = item = gtk_menu_item_new_with_label( _("Map") );    appdata->menu_map = item = gtk_menu_item_new_with_mnemonic( _("_Map") );
619    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
620    submenu = gtk_menu_new();    submenu = gtk_menu_new();
621      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
622    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
623    
624    appdata->menu_item_map_hide_sel = item =    appdata->menu_item_map_hide_sel = menu_append_new_item(
625      gtk_menu_item_new_with_label( _("Hide selected") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), _("_Hide selected"),
626    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_REMOVE, "<OSM2Go-Main>/Map/HideSelected",
627    gtk_widget_set_sensitive(item, FALSE);      0, 0, FALSE, FALSE
628    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_hide_sel),    );
629                     appdata);    gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, FALSE);
630    
631    appdata->menu_item_map_show_all = item =    appdata->menu_item_map_show_all = menu_append_new_item(
632      gtk_menu_item_new_with_label( _("Show all") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_show_all), _("_Show all"),
633    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_ADD, "<OSM2Go-Main>/Map/ShowAll",
634    gtk_widget_set_sensitive(item, FALSE);      0, 0, FALSE, FALSE
635    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_show_all),    );
636                     appdata);    gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE);
637    
638    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());
639    
640    item = gtk_menu_item_new_with_label( _("Redraw") );    menu_append_new_item(
641    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_style), _("St_yle..."),
642    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_redraw), appdata);      GTK_STOCK_SELECT_COLOR, "<OSM2Go-Main>/Map/Style",
643        0, 0, FALSE, FALSE
644    gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());    );
645    
646    item = gtk_menu_item_new_with_label( _("Style...") );    gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
647    gtk_menu_append(GTK_MENU_SHELL(submenu), item);  
648    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_style), appdata);    /* switches mainly intended for testing/debugging */
649      menu_append_new_item(
650    gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_redraw), _("_Redraw"),
651        NULL, "<OSM2Go-Main>/Map/Redraw",
652    appdata->menu_item_map_no_icons =      GDK_r, GDK_CONTROL_MASK, FALSE, FALSE
653      item = gtk_check_menu_item_new_with_label( _("No Icons") );    );
654    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),  
655                                   appdata->settings->no_icons);    appdata->menu_item_map_no_icons = menu_append_new_item(
656    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_icons), _("No _icons"),
657    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_no_icons),      NULL, "<OSM2Go-Main>/Map/NoIcons",
658                     appdata);      0, 0, TRUE, appdata->settings->no_icons
659      );
660    
661      appdata->menu_item_map_no_antialias = menu_append_new_item(
662        appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_antialias),
663        _("No _antialias"),
664        NULL, "<OSM2Go-Main>/Map/NoAntialias",
665        0, 0, TRUE, appdata->settings->no_antialias
666      );
667    
668    /* -------------------- track submenu -------------------- */    /* -------------------- track submenu -------------------- */
669    
670    appdata->track.menu_track = item = gtk_menu_item_new_with_label(_("Track"));    appdata->track.menu_track = item = gtk_menu_item_new_with_mnemonic(_("_Track"));
671    gtk_menu_append(GTK_MENU_SHELL(menu), item);    gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
672    submenu = gtk_menu_new();    submenu = gtk_menu_new();
673      gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp);
674    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
675    
676    appdata->track.menu_item_import =    appdata->track.menu_item_import = menu_append_new_item(
677      item = gtk_menu_item_new_with_label( _("Import...") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import..."),
678    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/Track/Import",
679    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_import),      0, 0, FALSE, FALSE
680                     appdata);    );
681    
682    appdata->track.menu_item_export =    appdata->track.menu_item_export = menu_append_new_item(
683      item = gtk_menu_item_new_with_label( _("Export...") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export..."),
684    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      NULL, "<OSM2Go-Main>/Track/Export",
685    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_export),      0, 0, FALSE, FALSE
686                     appdata);    );
687    
688    appdata->track.menu_item_clear =    appdata->track.menu_item_clear = menu_append_new_item(
689      item = gtk_menu_item_new_with_label( _("Clear") );      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_clear), _("_Clear"),
690    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      GTK_STOCK_CLEAR, "<OSM2Go-Main>/Track/Clear",
691    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_clear),      0, 0, FALSE, FALSE
692                     appdata);    );
693    
694    appdata->track.menu_item_gps =  
695      item = gtk_check_menu_item_new_with_label( _("GPS") );    appdata->track.menu_item_gps = menu_append_new_item(
696    gtk_menu_append(GTK_MENU_SHELL(submenu), item);      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_gps), _("_GPS"),
697    g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_gps),      NULL, "<OSM2Go-Main>/Track/GPS",
698                     appdata);      GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, FALSE
699      );
700    
701    /* ------------------------------------------------------- */    /* ------------------------------------------------------- */
702    
703    gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());    gtk_menu_shell_append(GTK_MENU_SHELL(about_quit_items_menu),
704                            gtk_separator_menu_item_new());
705    
706      menu_append_new_item(
707        appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About..."),
708        GTK_STOCK_ABOUT, "<OSM2Go-Main>/About",
709        0, 0, FALSE, FALSE
710      );
711    
712      menu_append_new_item(
713        appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_quit), _("_Quit"),
714        GTK_STOCK_QUIT, "<OSM2Go-Main>/Quit",
715        0, 0, FALSE, FALSE
716      );
717    
718    item = gtk_menu_item_new_with_label( _("About...") );    gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp);
   gtk_menu_append(GTK_MENU_SHELL(menu), item);  
   g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_about), appdata);  
   
   
   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);  
719    
720  #ifdef USE_HILDON  #ifdef USE_HILDON
721    hildon_window_set_menu(appdata->window, GTK_MENU(menu));    hildon_window_set_menu(appdata->window, GTK_MENU(menu));
722  #else  #else
723    /* attach ordinary gtk menu */    GtkWidget *menu_bar = menu;
724    GtkWidget *menu_bar = gtk_menu_bar_new();  
725    #ifndef UISPECIFIC_MAIN_MENU_IS_MENU_BAR
726      // we need to make one first
727      menu_bar = gtk_menu_bar_new();
728    
729    GtkWidget *root_menu = gtk_menu_item_new_with_label (_("Menu"));    GtkWidget *root_menu = gtk_menu_item_new_with_label (_("Menu"));
730    gtk_widget_show(root_menu);    gtk_widget_show(root_menu);
# Line 576  void menu_create(appdata_t *appdata) { Line 733  void menu_create(appdata_t *appdata) {
733    gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);    gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);
734    
735    gtk_widget_show(menu_bar);    gtk_widget_show(menu_bar);
736    #endif //UISPECIFIC_MAIN_MENU_IS_MENU_BAR
737    
738    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);
739  #endif  
740    #endif //USE_HILDON
741  }  }
742    
743  /********************* end of menu **********************/  /********************* end of menu **********************/
744    
745    #ifdef UISPECIFIC_MENU_HAS_ACCELS
746    #define ACCELS_FILE "accels"
747    
748    static void menu_accels_load(appdata_t *appdata) {
749      char *accels_file = g_strdup_printf("%s/" ACCELS_FILE,
750                                          appdata->settings->base_path);
751      gtk_accel_map_load(accels_file);
752      g_free(accels_file);
753    }
754    
755    static void menu_accels_save(appdata_t *appdata) {
756      char *accels_file = g_strdup_printf("%s" ACCELS_FILE,
757                                          appdata->settings->base_path);
758      gtk_accel_map_save(accels_file);
759      g_free(accels_file);
760    }
761    
762    #endif
763    
764    
765  void cleanup(appdata_t *appdata) {  void cleanup(appdata_t *appdata) {
766    #ifdef UISPECIFIC_MENU_HAS_ACCELS
767      menu_accels_save(appdata);
768    #endif
769    
770    settings_save(appdata->settings);    settings_save(appdata->settings);
771    
772  #ifdef USE_HILDON  #ifdef USE_HILDON
# Line 627  void cleanup(appdata_t *appdata) { Line 810  void cleanup(appdata_t *appdata) {
810    
811    project_free(appdata->project);    project_free(appdata->project);
812    
813      if(appdata->menu_item_osm_undo)
814        undo_free(appdata->undo.state);
815    
816    puts("everything is gone");    puts("everything is gone");
817  }  }
818    
# Line 642  gboolean on_window_key_press(GtkWidget * Line 828  gboolean on_window_key_press(GtkWidget *
828    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
829    int handled = FALSE;    int handled = FALSE;
830    
   //  printf("key event %d\n", event->keyval);  
   
831    // the map handles some keys on its own ...    // the map handles some keys on its own ...
832    switch(event->keyval) {    switch(event->keyval) {
 #ifdef USE_HILDON  
833    
834  #if 0  #ifdef USE_HILDON
835    case HILDON_HARDKEY_SELECT:      /* this is in fact a mapping to GDK_F6 */
     handled = TRUE;  
     break;  
 #endif  
   
836    case HILDON_HARDKEY_FULLSCREEN:    case HILDON_HARDKEY_FULLSCREEN:
837      {  #else
838        gboolean fullscreen = !gtk_check_menu_item_get_active(    case GDK_F11:
839                 GTK_CHECK_MENU_ITEM(appdata->fullscreen_menu_item));  #endif
840        if(!gtk_check_menu_item_get_active(
841                 GTK_CHECK_MENU_ITEM(appdata->menu_item_view_fullscreen))) {
842          gtk_window_fullscreen(GTK_WINDOW(appdata->window));
843        gtk_check_menu_item_set_active(        gtk_check_menu_item_set_active(
844                 GTK_CHECK_MENU_ITEM(appdata->fullscreen_menu_item), fullscreen);               GTK_CHECK_MENU_ITEM(appdata->menu_item_view_fullscreen), TRUE);
845          } else {
       if(fullscreen)  
         gtk_window_fullscreen(GTK_WINDOW(appdata->window));  
       else  
846          gtk_window_unfullscreen(GTK_WINDOW(appdata->window));          gtk_window_unfullscreen(GTK_WINDOW(appdata->window));
847            gtk_check_menu_item_set_active(
848        handled = TRUE;               GTK_CHECK_MENU_ITEM(appdata->menu_item_view_fullscreen), FALSE);
849      }        }
850    
851        handled = TRUE;
852      break;      break;
 #endif  
853    }    }
854    
855    /* forward unprocessed key presses to map */    /* forward unprocessed key presses to map */
# Line 741  int main(int argc, char *argv[]) { Line 921  int main(int argc, char *argv[]) {
921    
922    appdata.vbox = gtk_vbox_new(FALSE,0);    appdata.vbox = gtk_vbox_new(FALSE,0);
923    menu_create(&appdata);    menu_create(&appdata);
924    #ifdef UISPECIFIC_MENU_HAS_ACCELS
925      menu_accels_load(&appdata);
926    #endif
927    
928    /* ----------------------- setup main window ---------------- */    /* ----------------------- setup main window ---------------- */
929    
# Line 750  int main(int argc, char *argv[]) { Line 933  int main(int argc, char *argv[]) {
933  #ifdef PORTRAIT  #ifdef PORTRAIT
934    gtk_box_pack_start(GTK_BOX(vbox), iconbar_new(&appdata), FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(vbox), iconbar_new(&appdata), FALSE, FALSE, 0);
935  #endif  #endif
936    gtk_box_pack_start(GTK_BOX(vbox), map_new(&appdata), TRUE, TRUE, 0);  
937      /* generate main map view */
938      GtkWidget *map = map_new(&appdata);
939      if(!map) {
940        cleanup(&appdata);
941        return -1;
942      }
943    
944      gtk_box_pack_start(GTK_BOX(vbox), map, TRUE, TRUE, 0);
945    gtk_box_pack_start(GTK_BOX(vbox), statusbar_new(&appdata), FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(vbox), statusbar_new(&appdata), FALSE, FALSE, 0);
946    
947  #ifndef PORTRAIT  #ifndef PORTRAIT
# Line 795  int main(int argc, char *argv[]) { Line 986  int main(int argc, char *argv[]) {
986    
987    return 0;    return 0;
988  }  }
989    
990    // vim:et:ts=8:sw=2:sts=2:ai

Legend:
Removed from v.15  
changed lines
  Added in v.69