Diff of /trunk/src/main.c

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

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

Legend:
Removed from v.4  
changed lines
  Added in v.65