--- trunk/src/main.c 2008/12/21 11:49:35 24 +++ trunk/src/main.c 2009/02/10 12:29:09 68 @@ -22,6 +22,7 @@ #include #include "appdata.h" +#include "banner.h" /* disable/enable main screen control dependant on presence of open project */ static void main_ui_enable(appdata_t *appdata) { @@ -55,7 +56,9 @@ /* disable all menu entries related to map */ gtk_widget_set_sensitive(appdata->menu_osm, project_valid); gtk_widget_set_sensitive(appdata->menu_item_osm_upload, osm_valid); - gtk_widget_set_sensitive(appdata->menu_item_osm_diff, osm_valid); + if(appdata->menu_item_osm_undo) + gtk_widget_set_sensitive(appdata->menu_item_osm_undo, osm_valid); + gtk_widget_set_sensitive(appdata->menu_item_osm_save_changes, osm_valid); gtk_widget_set_sensitive(appdata->menu_item_osm_undo_changes, osm_valid); gtk_widget_set_sensitive(appdata->track.menu_track, osm_valid); gtk_widget_set_sensitive(appdata->menu_view, osm_valid); @@ -69,19 +72,6 @@ /******************** begin of menu *********************/ -#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 - static void cb_menu_project_open(GtkWidget *window, gpointer data) { appdata_t *appdata = (appdata_t*)data; @@ -106,7 +96,7 @@ const gchar *authors[] = { "Till Harbaum ", - "Andrew Chadwick", + "Andrew Chadwick ", NULL }; gtk_about_dialog_set_authors(about, authors); @@ -155,9 +145,11 @@ // download if(osm_download(GTK_WIDGET(appdata->window), appdata->project)) { + banner_busy_start(appdata, 1, "Redrawing..."); appdata->osm = osm_parse(appdata->project->osm); diff_restore(appdata, appdata->project, appdata->osm); map_paint(appdata); + banner_busy_stop(appdata); //"Redrawing..." } main_ui_enable(appdata); @@ -203,6 +195,7 @@ appdata_t *appdata = (appdata_t*)data; /* redraw the entire map by destroying all map items and redrawing them */ + banner_busy_start(appdata, 1, "Redrawing..."); track_save(appdata->project, appdata->track.track); diff_save(appdata->project, appdata->osm); map_clear(appdata, MAP_LAYER_ALL); @@ -217,6 +210,7 @@ map_track_draw(appdata->map, appdata->track.track); wms_load(appdata); + banner_busy_stop(appdata); //"Redrawing..." } #endif @@ -231,20 +225,33 @@ cb_menu_map_no_icons(GtkWidget *widget, gpointer data) { appdata_t *appdata = (appdata_t*)data; + banner_busy_start(appdata, 1, "Redrawing..."); map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); appdata->settings->no_icons = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); map_paint(appdata); + banner_busy_stop(appdata); //"Redrawing..." } static void cb_menu_map_no_antialias(GtkWidget *widget, gpointer data) { appdata_t *appdata = (appdata_t*)data; + banner_busy_start(appdata, 1, "Redrawing..."); map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); appdata->settings->no_antialias = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); map_paint(appdata); + banner_busy_stop(appdata); //"Redrawing..." +} + +static void +cb_menu_undo(GtkWidget *widget, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + undo(appdata); + + // the banner will be displayed from within undo with more details } static void @@ -252,8 +259,7 @@ appdata_t *appdata = (appdata_t*)data; diff_save(appdata->project, appdata->osm); - statusbar_set(appdata, _("Saved all changes made " - "to this project so far"), FALSE); + banner_show_info(appdata, _("Saved local changes")); } static void @@ -261,19 +267,19 @@ appdata_t *appdata = (appdata_t*)data; if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0, - _("Undo all changes?"), - _("Do you really want to undo all your changes " - "not uploaded so far? This cannot be undone!"))) + _("Discard local changes?"), + _("Throw away all the changes you've not uploaded yet? This can't be undone."))) return; - + + banner_busy_start(appdata, 1, _("Redrawing...")); map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); osm_free(&appdata->icon, appdata->osm); diff_remove(appdata->project); appdata->osm = osm_parse(appdata->project->osm); map_paint(appdata); + banner_busy_stop(appdata); //"Redrawing..." - statusbar_set(appdata, _("All changes made " - "so far have been reset"), FALSE); + banner_show_info(appdata, _("Discarded local changes")); } static void @@ -376,211 +382,348 @@ track_do(appdata, TRACK_NONE, NULL); } + + + +/* + * Platform-specific UI tweaks. + */ + + +#ifndef USE_HILDON +#ifdef PORTRAIT + +// Portrait mode, for openmoko-like systems +#define uispecific_main_menu_new gtk_menu_new + +#else + +// Regular desktop builds +#define uispecific_main_menu_new gtk_menu_bar_new +#define UISPECIFIC_MAIN_MENU_IS_MENU_BAR +#define UISPECIFIC_MENU_HAS_ICONS +#define UISPECIFIC_MENU_HAS_ACCELS + +#endif //PORTRAIT +#else//USE_HILDON + +// Maemo/Hildon builds +#define uispecific_main_menu_new gtk_menu_new + +#endif + + + +// Half-arsed slapdash common menu item constructor. Let's use GtkBuilder +// instead so we have some flexibility. + +static GtkWidget * +menu_append_new_item(appdata_t *appdata, + GtkWidget *menu_shell, + GtkSignalFunc activate_cb, + char *label, + const gchar *stock_id, // overridden by label, accels + const gchar *accel_path, + guint accel_key, // from gdk/gdkkeysyms.h + GdkModifierType accel_mods, // e.g. GDK_CONTROL_MASK + gboolean is_check, gboolean check_status) +{ + GtkWidget *item = NULL; + GtkStockItem stock_item; + gboolean stock_item_known = FALSE; + if (stock_id != NULL) { + stock_item_known = gtk_stock_lookup(stock_id, &stock_item); + } + + // Icons +#ifndef UISPECIFIC_MENU_HAS_ICONS + item = is_check ? gtk_check_menu_item_new_with_mnemonic (label) + : gtk_menu_item_new_with_mnemonic (label); +#else + if (is_check || !stock_item_known) { + item = is_check ? gtk_check_menu_item_new_with_mnemonic (label) + : gtk_menu_item_new_with_mnemonic (label); + } + else { + item = gtk_image_menu_item_new_with_mnemonic(label); + GtkWidget *stock_image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), stock_image); + } +#endif + +#ifdef UISPECIFIC_MENU_HAS_ACCELS + // Accelerators + // Default + if (accel_path != NULL) { + gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path); + if (accel_key != 0) { + gtk_accel_map_add_entry( accel_path, accel_key, accel_mods ); + } + else if (stock_item_known) { + gtk_accel_map_add_entry( accel_path, stock_item.keyval, + stock_item.modifier ); + } + } +#endif + + gtk_menu_shell_append(GTK_MENU_SHELL(menu_shell), GTK_WIDGET(item)); + if (is_check) { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), check_status); + } + g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(activate_cb), + appdata); + return item; +} + + void menu_create(appdata_t *appdata) { GtkWidget *menu, *item, *submenu; - menu = gtk_menu_new(); + GtkWidget *about_quit_items_menu; + + if (g_module_supported()) { + printf("*** can use GModule: consider using GtkUIManager / GtkBuilder\n"); + } + menu = uispecific_main_menu_new(); + about_quit_items_menu = menu; /* -------------------- Project submenu -------------------- */ - item = gtk_menu_item_new_with_label( _("Project") ); - gtk_menu_append(GTK_MENU_SHELL(menu), item); + GtkAccelGroup *accel_grp = gtk_accel_group_new(); + item = gtk_menu_item_new_with_mnemonic( _("_Project") ); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); submenu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); +#ifdef UISPECIFIC_MAIN_MENU_IS_MENU_BAR + about_quit_items_menu = submenu; +#endif - item = gtk_menu_item_new_with_label( _("Open...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_open), - appdata); - - appdata->menu_item_project_close = item = - gtk_menu_item_new_with_label( _("Close") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_close), - appdata); + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open..."), + GTK_STOCK_OPEN, "/Project/Open", + 0, 0, FALSE, FALSE + ); + + appdata->menu_item_project_close = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_close), _("_Close"), + GTK_STOCK_CLOSE, "/Project/Close", + 0, 0, FALSE, FALSE + ); /* --------------- view menu ------------------- */ - gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); +#ifndef UISPECIFIC_MENU_IS_MENU_BAR + gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); +#endif - appdata->menu_view = item = - gtk_menu_item_new_with_label( _("View") ); - gtk_menu_append(GTK_MENU_SHELL(menu), item); + appdata->menu_view = item = gtk_menu_item_new_with_mnemonic( _("_View") ); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); submenu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); - appdata->menu_item_view_fullscreen = - item = gtk_check_menu_item_new_with_label( _("Fullscreen") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_fullscreen), - appdata); - - item = gtk_menu_item_new_with_label( _("Zoom +" )); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_zoomin), appdata); - - item = gtk_menu_item_new_with_label( _("Zoom -") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", - GTK_SIGNAL_FUNC(cb_menu_zoomout), appdata); + appdata->menu_item_view_fullscreen = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_fullscreen), _("_Fullscreen"), + GTK_STOCK_FULLSCREEN, "/View/Fullscreen", + 0, 0, TRUE, FALSE + ); + + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomin), _("Zoom _in"), + GTK_STOCK_ZOOM_IN, "/View/ZoomIn", + GDK_comma, GDK_CONTROL_MASK, FALSE, FALSE + ); + + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_zoomout), _("Zoom _out"), + GTK_STOCK_ZOOM_OUT, "/View/ZoomOut", + GDK_period, GDK_CONTROL_MASK, FALSE, FALSE + ); /* -------------------- OSM submenu -------------------- */ - appdata->menu_osm = item = gtk_menu_item_new_with_label( _("OSM") ); - gtk_menu_append(GTK_MENU_SHELL(menu), item); + appdata->menu_osm = item = gtk_menu_item_new_with_mnemonic( _("_OSM") ); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); submenu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); - appdata->menu_item_osm_upload = item = - gtk_menu_item_new_with_label( _("Upload...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_upload), appdata); - - item = gtk_menu_item_new_with_label( _("Download...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", - GTK_SIGNAL_FUNC(cb_menu_download), appdata); - - gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); - - appdata->menu_item_osm_diff = item = - gtk_menu_item_new_with_label( _("Save diff file") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_save_changes), - appdata); - - appdata->menu_item_osm_undo_changes = item = - gtk_menu_item_new_with_label( _("Undo all changes...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_undo_changes), - appdata); + appdata->menu_item_osm_upload = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload..."), + NULL, "/OSM/Upload", + GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + ); + + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_Download..."), + NULL, "/OSM/Download", + GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + ); + + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); + + if(getenv("OSM2GO_UNDO_TEST")) { + appdata->menu_item_osm_undo = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo), _("_Undo"), + GTK_STOCK_UNDO, "/OSM/Undo", + GDK_z, GDK_CONTROL_MASK, FALSE, FALSE + ); + } else + printf("set environment variable OSM2GO_UNDO_TEST to enable undo framework tests\n"); + + appdata->menu_item_osm_save_changes = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_save_changes), _("_Save local changes"), + GTK_STOCK_SAVE, "/OSM/SaveChanges", + GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + ); + + appdata->menu_item_osm_undo_changes = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes..."), + GTK_STOCK_DELETE, "/OSM/DiscardChanges", + 0, 0, FALSE, FALSE + ); /* -------------------- wms submenu -------------------- */ - appdata->menu_wms = item = gtk_menu_item_new_with_label( _("WMS") ); - gtk_menu_append(GTK_MENU_SHELL(menu), item); + appdata->menu_wms = item = gtk_menu_item_new_with_mnemonic( _("_WMS") ); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); submenu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); - item = gtk_menu_item_new_with_label( _("Import...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_import), - appdata); - - appdata->menu_item_wms_clear = item = - gtk_menu_item_new_with_label( _("Clear") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - gtk_widget_set_sensitive(item, FALSE); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_clear), - appdata); - - appdata->menu_item_wms_adjust = item = - gtk_menu_item_new_with_label( _("Adjust") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - gtk_widget_set_sensitive(item, FALSE); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_adjust), - appdata); + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import..."), + GTK_STOCK_INDEX, "/WMS/Import", + 0, 0, FALSE, FALSE + ); + + appdata->menu_item_wms_clear = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_clear), _("_Clear"), + GTK_STOCK_CLEAR, "/WMS/Clear", + 0, 0, FALSE, FALSE + ); + gtk_widget_set_sensitive(appdata->menu_item_wms_clear, FALSE); + + appdata->menu_item_wms_adjust = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_adjust), _("_Adjust"), + NULL, "/WMS/Adjust", + 0, 0, FALSE, FALSE + ); + gtk_widget_set_sensitive(appdata->menu_item_wms_adjust, FALSE); /* -------------------- map submenu -------------------- */ - appdata->menu_map = item = gtk_menu_item_new_with_label( _("Map") ); - gtk_menu_append(GTK_MENU_SHELL(menu), item); + appdata->menu_map = item = gtk_menu_item_new_with_mnemonic( _("_Map") ); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); submenu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); - appdata->menu_item_map_hide_sel = item = - gtk_menu_item_new_with_label( _("Hide selected") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - gtk_widget_set_sensitive(item, FALSE); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), - appdata); - - appdata->menu_item_map_show_all = item = - gtk_menu_item_new_with_label( _("Show all") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - gtk_widget_set_sensitive(item, FALSE); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_show_all), - appdata); - - gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); - - item = gtk_menu_item_new_with_label( _("Style...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_style), appdata); + appdata->menu_item_map_hide_sel = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), _("_Hide selected"), + GTK_STOCK_REMOVE, "/Map/HideSelected", + 0, 0, FALSE, FALSE + ); + gtk_widget_set_sensitive(appdata->menu_item_map_hide_sel, FALSE); + + appdata->menu_item_map_show_all = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_show_all), _("_Show all"), + GTK_STOCK_ADD, "/Map/ShowAll", + 0, 0, FALSE, FALSE + ); + gtk_widget_set_sensitive(appdata->menu_item_map_show_all, FALSE); + + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); + + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_style), _("St_yle..."), + GTK_STOCK_SELECT_COLOR, "/Map/Style", + 0, 0, FALSE, FALSE + ); - 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()); /* switches mainly intended for testing/debugging */ - item = gtk_menu_item_new_with_label( _("Redraw") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_redraw), appdata); - - appdata->menu_item_map_no_icons = - item = gtk_check_menu_item_new_with_label( _("No Icons") ); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), - appdata->settings->no_icons); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_no_icons), - appdata); - - appdata->menu_item_map_no_antialias = - item = gtk_check_menu_item_new_with_label( _("No Antialias") ); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), - appdata->settings->no_antialias); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_no_antialias), - appdata); + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_redraw), _("_Redraw"), + NULL, "/Map/Redraw", + GDK_r, GDK_CONTROL_MASK, FALSE, FALSE + ); + + appdata->menu_item_map_no_icons = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_icons), _("No _icons"), + NULL, "/Map/NoIcons", + 0, 0, TRUE, appdata->settings->no_icons + ); + + appdata->menu_item_map_no_antialias = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_antialias), + _("No _antialias"), + NULL, "/Map/NoAntialias", + 0, 0, TRUE, appdata->settings->no_antialias + ); /* -------------------- track submenu -------------------- */ - appdata->track.menu_track = item = gtk_menu_item_new_with_label(_("Track")); - gtk_menu_append(GTK_MENU_SHELL(menu), item); + appdata->track.menu_track = item = gtk_menu_item_new_with_mnemonic(_("_Track")); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); submenu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_grp); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); - appdata->track.menu_item_import = - item = gtk_menu_item_new_with_label( _("Import...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_import), - appdata); - - appdata->track.menu_item_export = - item = gtk_menu_item_new_with_label( _("Export...") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_export), - appdata); - - appdata->track.menu_item_clear = - item = gtk_menu_item_new_with_label( _("Clear") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_clear), - appdata); - - appdata->track.menu_item_gps = - item = gtk_check_menu_item_new_with_label( _("GPS") ); - gtk_menu_append(GTK_MENU_SHELL(submenu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_gps), - appdata); + appdata->track.menu_item_import = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import..."), + NULL, "/Track/Import", + 0, 0, FALSE, FALSE + ); + + appdata->track.menu_item_export = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export..."), + NULL, "/Track/Export", + 0, 0, FALSE, FALSE + ); + + appdata->track.menu_item_clear = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_clear), _("_Clear"), + GTK_STOCK_CLEAR, "/Track/Clear", + 0, 0, FALSE, FALSE + ); + + + appdata->track.menu_item_gps = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_gps), _("_GPS"), + NULL, "/Track/GPS", + GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, FALSE + ); /* ------------------------------------------------------- */ - gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); - + gtk_menu_shell_append(GTK_MENU_SHELL(about_quit_items_menu), + gtk_separator_menu_item_new()); - item = gtk_menu_item_new_with_label( _("About...") ); - gtk_menu_append(GTK_MENU_SHELL(menu), item); - g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_about), appdata); + menu_append_new_item( + appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About..."), + GTK_STOCK_ABOUT, "/About", + 0, 0, FALSE, FALSE + ); + + menu_append_new_item( + appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_quit), _("_Quit"), + GTK_STOCK_QUIT, "/Quit", + 0, 0, FALSE, FALSE + ); - - 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); + gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp); #ifdef USE_HILDON hildon_window_set_menu(appdata->window, GTK_MENU(menu)); #else - /* attach ordinary gtk menu */ - GtkWidget *menu_bar = gtk_menu_bar_new(); + GtkWidget *menu_bar = menu; + +#ifndef UISPECIFIC_MAIN_MENU_IS_MENU_BAR + // we need to make one first + menu_bar = gtk_menu_bar_new(); GtkWidget *root_menu = gtk_menu_item_new_with_label (_("Menu")); gtk_widget_show(root_menu); @@ -589,14 +732,40 @@ gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu); gtk_widget_show(menu_bar); +#endif //UISPECIFIC_MAIN_MENU_IS_MENU_BAR + gtk_box_pack_start(GTK_BOX(appdata->vbox), menu_bar, 0, 0, 0); -#endif + +#endif //USE_HILDON } /********************* end of menu **********************/ +#ifdef UISPECIFIC_MENU_HAS_ACCELS +#define ACCELS_FILE "accels" + +static void menu_accels_load(appdata_t *appdata) { + char *accels_file = g_strdup_printf("%s/" ACCELS_FILE, + appdata->settings->base_path); + gtk_accel_map_load(accels_file); + g_free(accels_file); +} + +static void menu_accels_save(appdata_t *appdata) { + char *accels_file = g_strdup_printf("%s" ACCELS_FILE, + appdata->settings->base_path); + gtk_accel_map_save(accels_file); + g_free(accels_file); +} + +#endif + void cleanup(appdata_t *appdata) { +#ifdef UISPECIFIC_MENU_HAS_ACCELS + menu_accels_save(appdata); +#endif + settings_save(appdata->settings); #ifdef USE_HILDON @@ -640,6 +809,8 @@ project_free(appdata->project); + undo_free(appdata->undo.state); + puts("everything is gone"); } @@ -748,6 +919,9 @@ appdata.vbox = gtk_vbox_new(FALSE,0); menu_create(&appdata); +#ifdef UISPECIFIC_MENU_HAS_ACCELS + menu_accels_load(&appdata); +#endif /* ----------------------- setup main window ---------------- */ @@ -810,3 +984,5 @@ return 0; } + +// vim:et:ts=8:sw=2:sts=2:ai