--- trunk/src/main.c 2009/06/29 14:07:46 185 +++ trunk/src/main.c 2009/07/06 19:17:24 190 @@ -23,6 +23,14 @@ #include #include +#if defined(USE_HILDON) && (MAEMO_VERSION_MAJOR == 5) +#include +#include +#include +#include +#include +#endif + #include "appdata.h" #include "banner.h" @@ -56,17 +64,16 @@ gtk_widget_set_sensitive(appdata->iconbar->toolbar, osm_valid); /* 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); - 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->menu_item_osm_relations, osm_valid); - gtk_widget_set_sensitive(appdata->track.menu_track, osm_valid); - gtk_widget_set_sensitive(appdata->menu_view, osm_valid); - gtk_widget_set_sensitive(appdata->menu_wms, osm_valid); - gtk_widget_set_sensitive(appdata->menu_map, osm_valid); + gtk_widget_set_sensitive(appdata->submenu_map, project_valid); + gtk_widget_set_sensitive(appdata->menu_item_map_upload, osm_valid); + if(appdata->menu_item_map_undo) + gtk_widget_set_sensitive(appdata->menu_item_map_undo, osm_valid); + gtk_widget_set_sensitive(appdata->menu_item_map_save_changes, osm_valid); + gtk_widget_set_sensitive(appdata->menu_item_map_undo_changes, osm_valid); + gtk_widget_set_sensitive(appdata->menu_item_map_relations, osm_valid); + gtk_widget_set_sensitive(appdata->track.submenu_track, osm_valid); + gtk_widget_set_sensitive(appdata->submenu_view, osm_valid); + gtk_widget_set_sensitive(appdata->submenu_wms, osm_valid); if(!project_valid) statusbar_set(appdata, _("Please load or create a project"), FALSE); @@ -113,11 +120,13 @@ void on_window_destroy (GtkWidget *widget, gpointer data); +#ifndef USE_HILDON static void cb_menu_quit(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; gtk_widget_destroy(GTK_WIDGET(appdata->window)); } +#endif static void cb_menu_upload(GtkMenuItem *item, gpointer data) { @@ -195,49 +204,22 @@ /* ---------------------------------------------------------- */ -#if 1 // mainly for testing -static void -cb_menu_redraw(GtkMenuItem *item, gpointer data) { - 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); - osm_free(&appdata->icon, appdata->osm); - - appdata->osm = osm_parse(appdata->project->path, appdata->project->osm); - diff_restore(appdata, appdata->project, appdata->osm); - map_paint(appdata); - - appdata->track.track = track_restore(appdata, appdata->project); - if(appdata->track.track) - map_track_draw(appdata->map, appdata->track.track); - - wms_load(appdata); - banner_busy_stop(appdata); //"Redrawing" -} +#if defined(USE_HILDON) && (MAEMO_VERSION_MAJOR == 5) +#define MENU_CHECK_ITEM HildonCheckButton +#define MENU_CHECK_ITEM_ACTIVE(a) hildon_check_button_get_active(a) +#else +#define MENU_CHECK_ITEM GtkCheckMenuItem +#define MENU_CHECK_ITEM_ACTIVE(a) gtk_check_menu_item_get_active(a) #endif static void -cb_menu_map_no_icons(GtkCheckMenuItem *item, gpointer data) { - appdata_t *appdata = (appdata_t*)data; +cb_menu_map_no_icons(MENU_CHECK_ITEM *item, appdata_t *appdata) { banner_busy_start(appdata, 1, "Redrawing"); map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); - appdata->settings->no_icons = gtk_check_menu_item_get_active(item); - map_paint(appdata); - banner_busy_stop(appdata); //"Redrawing" -} -static void -cb_menu_map_no_antialias(GtkCheckMenuItem *item, gpointer data) { - appdata_t *appdata = (appdata_t*)data; + appdata->settings->no_icons = MENU_CHECK_ITEM_ACTIVE(item); - banner_busy_start(appdata, 1, "Redrawing"); - map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); - appdata->settings->no_antialias = gtk_check_menu_item_get_active(item); map_paint(appdata); banner_busy_stop(appdata); //"Redrawing" } @@ -294,10 +276,10 @@ #if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5) static void -cb_menu_fullscreen(GtkCheckMenuItem *item, gpointer data) { +cb_menu_fullscreen(MENU_CHECK_ITEM *item, gpointer data) { appdata_t *appdata = (appdata_t *)data; - if(gtk_check_menu_item_get_active(item)) + if(MENU_CHECK_ITEM_ACTIVE(item)) gtk_window_fullscreen(GTK_WINDOW(appdata->window)); else gtk_window_unfullscreen(GTK_WINDOW(appdata->window)); @@ -400,26 +382,14 @@ } static void -cb_menu_track_enable_gps(GtkMenuItem *item, gpointer data) { - appdata_t *appdata = (appdata_t*)data; - - if(gtk_check_menu_item_get_active( - GTK_CHECK_MENU_ITEM(appdata->track.menu_item_enable_gps))) { - track_enable_gps(appdata, TRUE); - } else - track_enable_gps(appdata, FALSE); +cb_menu_track_enable_gps(MENU_CHECK_ITEM *item, appdata_t *appdata) { + track_enable_gps(appdata, MENU_CHECK_ITEM_ACTIVE(item)); } static void -cb_menu_track_follow_gps(GtkMenuItem *item, gpointer data) { - appdata_t *appdata = (appdata_t*)data; - - if(gtk_check_menu_item_get_active( - GTK_CHECK_MENU_ITEM(appdata->track.menu_item_follow_gps))) { - appdata->settings->follow_gps = TRUE; - } else - appdata->settings->follow_gps = FALSE; +cb_menu_track_follow_gps(MENU_CHECK_ITEM *item, appdata_t *appdata) { + appdata->settings->follow_gps = MENU_CHECK_ITEM_ACTIVE(item); } @@ -526,7 +496,7 @@ #endif - +#if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5) // Half-arsed slapdash common menu item constructor. Let's use GtkBuilder // instead so we have some flexibility. @@ -605,7 +575,6 @@ return item; } - void menu_create(appdata_t *appdata) { GtkWidget *menu, *item, *submenu; GtkWidget *about_quit_items_menu; @@ -647,7 +616,7 @@ gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new()); #endif - appdata->menu_view = item = gtk_menu_item_new_with_mnemonic( _("_View") ); + appdata->submenu_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); @@ -693,59 +662,92 @@ GDK_comma, GDK_MOD1_MASK, TRUE, FALSE, FALSE ); - /* -------------------- OSM submenu -------------------- */ + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); + + 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, "/View/HideSelected", + 0, 0, TRUE, 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, "/View/ShowAll", + 0, 0, TRUE, 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, "/View/Style", + 0, 0, TRUE, FALSE, FALSE + ); - appdata->menu_osm = item = gtk_menu_item_new_with_mnemonic( _("_OSM") ); + gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); + + appdata->menu_item_map_no_icons = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_no_icons), _("No _icons"), + NULL, "/View/NoIcons", + 0, 0, TRUE, TRUE, appdata->settings->no_icons + ); + + + /* -------------------- map submenu -------------------- */ + + appdata->submenu_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_osm_upload = menu_append_new_item( + + appdata->menu_item_map_upload = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload"), - "upload.16", "/OSM/Upload", + "upload.16", "/Map/Upload", GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE ); menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_Download"), - "download.16", "/OSM/Download", + "download.16", "/Map/Download", GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, 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->menu_item_map_undo = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo), _("_Undo"), - GTK_STOCK_UNDO, "/OSM/Undo", + GTK_STOCK_UNDO, "/Map/Undo", GDK_z, GDK_CONTROL_MASK, TRUE, 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->menu_item_map_save_changes = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_save_changes), _("_Save local changes"), - GTK_STOCK_SAVE, "/OSM/SaveChanges", + GTK_STOCK_SAVE, "/Map/SaveChanges", GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE ); - appdata->menu_item_osm_undo_changes = menu_append_new_item( + appdata->menu_item_map_undo_changes = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes"), - GTK_STOCK_DELETE, "/OSM/DiscardChanges", + GTK_STOCK_DELETE, "/Map/DiscardChanges", 0, 0, TRUE, FALSE, FALSE ); gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); - appdata->menu_item_osm_relations = menu_append_new_item( + appdata->menu_item_map_relations = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_osm_relations), _("_Relations"), - NULL, "/OSM/Relations", + NULL, "/Map/Relations", GDK_r, GDK_SHIFT_MASK|GDK_CONTROL_MASK, TRUE, FALSE, FALSE ); /* -------------------- wms submenu -------------------- */ - appdata->menu_wms = item = gtk_menu_item_new_with_mnemonic( _("_WMS") ); + appdata->submenu_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); @@ -771,93 +773,42 @@ ); gtk_widget_set_sensitive(appdata->menu_item_wms_adjust, FALSE); - /* -------------------- map submenu -------------------- */ - - 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 = menu_append_new_item( - appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_map_hide_sel), _("_Hide selected"), - GTK_STOCK_REMOVE, "/Map/HideSelected", - 0, 0, TRUE, 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, TRUE, 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, TRUE, FALSE, FALSE - ); - - gtk_menu_shell_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new()); - - /* switches mainly intended for testing/debugging */ - menu_append_new_item( - appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_redraw), _("_Redraw"), - NULL, "/Map/Redraw", - GDK_r, GDK_CONTROL_MASK, TRUE, 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, 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, TRUE, appdata->settings->no_antialias - ); - /* -------------------- track submenu -------------------- */ - appdata->track.menu_track = item = gtk_menu_item_new_with_mnemonic(_("_Track")); + appdata->track.submenu_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 = menu_append_new_item( + appdata->track.menu_item_track_import = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import"), NULL, "/Track/Import", 0, 0, TRUE, FALSE, FALSE ); - appdata->track.menu_item_export = menu_append_new_item( + appdata->track.menu_item_track_export = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export"), NULL, "/Track/Export", 0, 0, FALSE, FALSE, FALSE ); - appdata->track.menu_item_clear = menu_append_new_item( + appdata->track.menu_item_track_clear = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_clear), _("_Clear"), GTK_STOCK_CLEAR, "/Track/Clear", 0, 0, FALSE, FALSE, FALSE ); - appdata->track.menu_item_enable_gps = menu_append_new_item( + appdata->track.menu_item_track_enable_gps = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_enable_gps),_("_GPS enable"), NULL, "/Track/GPS", GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, TRUE, appdata->settings->enable_gps ); - appdata->track.menu_item_follow_gps = menu_append_new_item( + appdata->track.menu_item_track_follow_gps = menu_append_new_item( appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_follow_gps), _("GPS follow"), NULL, "/Track/Follow", 0, 0, appdata->settings->enable_gps, TRUE, @@ -875,11 +826,13 @@ 0, 0, TRUE, FALSE, FALSE ); +#ifndef USE_HILDON menu_append_new_item( appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_quit), _("_Quit"), GTK_STOCK_QUIT, "/Quit", 0, 0, TRUE, FALSE, FALSE ); +#endif gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp); @@ -905,6 +858,166 @@ #endif //USE_HILDON } +#else // !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5) + +void submenu_entry(appdata_t *appdata, HildonAppMenu *menu, + const char *label, const char *value, + GtkSignalFunc activate_cb) { + +} + +typedef struct { + const char *label, *value; + gboolean enabled; + gboolean (*toggle)(appdata_t *appdata); + gulong offset; + GtkSignalFunc activate_cb; +} menu_entry_t; + +static gboolean no_icon_get_toggle(appdata_t *appdata) { + if(!appdata) return FALSE; + if(!appdata->settings) return FALSE; + return appdata->settings->no_icons; +} + +static gboolean enable_gps_get_toggle(appdata_t *appdata) { + if(!appdata) return FALSE; + return appdata->gps_enabled; +} + +static gboolean follow_gps_get_toggle(appdata_t *appdata) { + if(!appdata) return FALSE; + if(!appdata->settings) return FALSE; + return appdata->settings->follow_gps; +} + +/* create a HildonAppMenu */ +static GtkWidget *app_menu_create(appdata_t *appdata, + const menu_entry_t *menu_entries) { + HildonAppMenu *menu = HILDON_APP_MENU(hildon_app_menu_new()); + + while(menu_entries->label) { + GtkWidget *button = NULL; + + if(!menu_entries->toggle) { + button = hildon_button_new_with_text( + HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, + HILDON_BUTTON_ARRANGEMENT_VERTICAL, + _(menu_entries->label), _(menu_entries->value)); + g_signal_connect_after(button, "clicked", + menu_entries->activate_cb, appdata); + } else { + button = hildon_check_button_new(HILDON_SIZE_AUTO); + gtk_button_set_label(GTK_BUTTON(button), _(menu_entries->label)); + hildon_check_button_set_active(HILDON_CHECK_BUTTON(button), + menu_entries->toggle(appdata)); + g_signal_connect_after(button, "toggled", + menu_entries->activate_cb, appdata); + } + + /* offset to GtkWidget pointer was given -> store pointer */ + if(menu_entries->offset) + *(GtkWidget**)(((void*)appdata)+menu_entries->offset) = button; + + gtk_widget_set_sensitive(button, menu_entries->enabled); + + hildon_app_menu_append(menu, GTK_BUTTON(button)); + menu_entries++; + } + + gtk_widget_show_all(GTK_WIDGET(menu)); + return GTK_WIDGET(menu); +} + +/* the view submenu */ +void on_submenu_view_clicked(GtkButton *button, appdata_t *appdata) { + hildon_app_menu_popup(HILDON_APP_MENU(appdata->app_menu_view), + GTK_WINDOW(appdata->window)); +} + +void on_submenu_wms_clicked(GtkButton *button, appdata_t *appdata) { + hildon_app_menu_popup(HILDON_APP_MENU(appdata->app_menu_wms), + GTK_WINDOW(appdata->window)); +} + +void on_submenu_track_clicked(GtkButton *button, appdata_t *appdata) { + hildon_app_menu_popup(HILDON_APP_MENU(appdata->app_menu_track), + GTK_WINDOW(appdata->window)); +} + +/* -- the view submenu -- */ +#define APP_OFFSET(a) offsetof(appdata_t, a) +#define SIMPLE_ENTRY(a,b) { a, NULL, TRUE, NULL, 0, G_CALLBACK(b) } +#define ENABLED_ENTRY(a,b,c) { a, NULL, TRUE, NULL, APP_OFFSET(c), G_CALLBACK(b) } +#define DISABLED_ENTRY(a,b,c) { a, NULL, FALSE, NULL, APP_OFFSET(c), G_CALLBACK(b) } +#define TOGGLE_ENTRY(a,b,c) { a, NULL, TRUE, c, 0, G_CALLBACK(b) } +#define DISABLED_TOGGLE_ENTRY(a,b,c,d) { a, NULL, FALSE, c, APP_OFFSET(d), G_CALLBACK(b) } +#define ENABLED_TOGGLE_ENTRY(a,b,c,d) { a, NULL, TRUE, c, APP_OFFSET(d), G_CALLBACK(b) } +#define LAST_ENTRY { NULL, NULL, FALSE, NULL, 0, NULL } + +static const menu_entry_t submenu_view[] = { + SIMPLE_ENTRY("Zoom in", cb_menu_zoomin), + SIMPLE_ENTRY("Zoom out", cb_menu_zoomout), + /* --- */ + SIMPLE_ENTRY("Style", cb_menu_style), + /* --- */ + SIMPLE_ENTRY("Normal details", cb_menu_view_detail_normal), + SIMPLE_ENTRY("More details", cb_menu_view_detail_inc), + SIMPLE_ENTRY("Less details", cb_menu_view_detail_dec), + /* --- */ + DISABLED_ENTRY("Hide selected", cb_menu_map_hide_sel, menu_item_map_hide_sel), + DISABLED_ENTRY("Show all", cb_menu_map_show_all, menu_item_map_show_all), + /* --- */ + TOGGLE_ENTRY("No icons", cb_menu_map_no_icons, no_icon_get_toggle), + + LAST_ENTRY +}; + +/* -- the wms submenu -- */ +static const menu_entry_t submenu_wms[] = { + SIMPLE_ENTRY("Import", cb_menu_wms_import), + DISABLED_ENTRY("Clear", cb_menu_wms_clear, menu_item_wms_clear), + DISABLED_ENTRY("Adjust", cb_menu_wms_adjust, menu_item_wms_adjust), + + LAST_ENTRY +}; + +/* -- the track submenu -- */ +static const menu_entry_t submenu_track[] = { + ENABLED_ENTRY("Import", cb_menu_track_import, track.menu_item_track_import), + DISABLED_ENTRY("Export", cb_menu_track_export, track.menu_item_track_export), + DISABLED_ENTRY("Clear", cb_menu_track_clear, track.menu_item_track_clear), + ENABLED_TOGGLE_ENTRY("GPS enable", cb_menu_track_enable_gps, + enable_gps_get_toggle, track.menu_item_track_enable_gps), + DISABLED_TOGGLE_ENTRY("GPS follow", cb_menu_track_follow_gps, + follow_gps_get_toggle, track.menu_item_track_follow_gps), + + LAST_ENTRY +}; + + +/* -- the applications main menu -- */ +static const menu_entry_t main_menu[] = { + SIMPLE_ENTRY("About", cb_menu_about), + ENABLED_ENTRY("View", on_submenu_view_clicked, submenu_view), + ENABLED_ENTRY("WMS", on_submenu_wms_clicked, submenu_wms), + ENABLED_ENTRY("Track", on_submenu_track_clicked, track.submenu_track), + + LAST_ENTRY +}; + +void menu_create(appdata_t *appdata) { + HildonAppMenu *menu = HILDON_APP_MENU(hildon_app_menu_new()); + + /* build menu/submenus */ + menu = HILDON_APP_MENU(app_menu_create(appdata, main_menu)); + appdata->app_menu_wms = app_menu_create(appdata, submenu_wms); + appdata->app_menu_view = app_menu_create(appdata, submenu_view); + appdata->app_menu_track = app_menu_create(appdata, submenu_track); + + hildon_window_set_app_menu(HILDON_WINDOW(appdata->window), menu); +} +#endif /********************* end of menu **********************/ @@ -976,7 +1089,7 @@ project_free(appdata->project); - if(appdata->menu_item_osm_undo) + if(appdata->menu_item_map_undo) undo_free(appdata->undo.state); puts("everything is gone"); @@ -994,9 +1107,12 @@ appdata_t *appdata = (appdata_t*)data; int handled = FALSE; + // printf("key event with keyval %x\n", event->keyval); + // the map handles some keys on its own ... switch(event->keyval) { +#if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5) #ifdef USE_HILDON /* this is in fact a mapping to GDK_F6 */ case HILDON_HARDKEY_FULLSCREEN: @@ -1016,6 +1132,7 @@ handled = TRUE; break; +#endif } /* forward unprocessed key presses to map */ @@ -1065,6 +1182,17 @@ /* Create HildonWindow and set it to HildonProgram */ appdata.window = HILDON_WINDOW(hildon_window_new()); hildon_program_add_window(appdata.program, appdata.window); + +#if MAEMO_VERSION_MAJOR == 5 + unsigned long val; + XChangeProperty(GDK_DISPLAY(), + GDK_WINDOW_XID(GTK_WIDGET(appdata.window)->window), + XInternAtom(GDK_DISPLAY(), + "_HILDON_ZOOM_KEY_ATOM", + False), XA_INTEGER, 32, + PropModeReplace, (unsigned char *) &val, 1); +#endif + #else /* Create a Window. */ appdata.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -1107,13 +1235,24 @@ return -1; } +#if 0 // another test overlay + { + GtkWidget *fixed = gtk_fixed_new(); + + gtk_fixed_put(GTK_FIXED(fixed), gtk_label_new("Nase"), 0,0); + gtk_fixed_put(GTK_FIXED(fixed), map, 0,0); + + gtk_box_pack_start(GTK_BOX(vbox), fixed, TRUE, TRUE, 0); + } +#else gtk_box_pack_start(GTK_BOX(vbox), map, TRUE, TRUE, 0); +#endif + gtk_box_pack_start(GTK_BOX(vbox), statusbar_new(&appdata), FALSE, FALSE, 0); #ifndef PORTRAIT gtk_box_pack_start(GTK_BOX(hbox), iconbar_new(&appdata), FALSE, FALSE, 0); #endif - // gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(appdata.vbox), hbox, TRUE, TRUE, 0); @@ -1143,6 +1282,26 @@ while(gtk_events_pending()) gtk_main_iteration(); +#if 0 // test overlay + { + GtkWidget *overlay = gtk_window_new(GTK_WINDOW_POPUP); + gtk_window_set_default_size(GTK_WINDOW(overlay), 40, 20); + gtk_window_set_transient_for(GTK_WINDOW(overlay), GTK_WINDOW(appdata.window)); + gtk_window_set_keep_above(GTK_WINDOW(overlay), TRUE); + gtk_window_set_destroy_with_parent(GTK_WINDOW(overlay), TRUE); + gtk_window_set_position(GTK_WINDOW(overlay), GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_decorated(GTK_WINDOW(overlay), TRUE); + + /* add some zoom buttons for testing */ + GtkWidget *hbox = gtk_hbox_new(TRUE, 0); + gtk_box_pack_start_defaults(GTK_BOX(hbox), gtk_button_new_with_label("+")); + gtk_box_pack_start_defaults(GTK_BOX(hbox), gtk_button_new_with_label("-")); + gtk_container_add(GTK_CONTAINER(overlay), hbox); + + gtk_widget_show_all(overlay); + } +#endif + /* start to interact with the user now that the gui is running */ if(appdata.settings->first_run_demo) { messagef(GTK_WIDGET(appdata.window), _("Welcome to OSM2Go"),