--- trunk/src/main.c 2009/04/27 11:29:55 167 +++ trunk/src/main.c 2009/07/06 15:51:30 189 @@ -23,6 +23,12 @@ #include #include +#if defined(USE_HILDON) && (MAEMO_VERSION_MAJOR == 5) +#include +#include +#include +#endif + #include "appdata.h" #include "banner.h" @@ -36,7 +42,12 @@ map_action_cancel(appdata); /* ---- set project name as window title ----- */ -#ifndef USE_HILDON +#if defined(USE_HILDON) && MAEMO_VERSION_MAJOR < 5 + if(project_valid) + gtk_window_set_title(GTK_WINDOW(appdata->window), appdata->project->name); + else + gtk_window_set_title(GTK_WINDOW(appdata->window), ""); +#else char *str = NULL; if(project_valid) str = g_strdup_printf("OSM2Go - %s", appdata->project->name); @@ -45,29 +56,22 @@ gtk_window_set_title(GTK_WINDOW(appdata->window), str); g_free(str); -#else - if(project_valid) - gtk_window_set_title(GTK_WINDOW(appdata->window), appdata->project->name); - else - gtk_window_set_title(GTK_WINDOW(appdata->window), ""); #endif if(appdata->iconbar && appdata->iconbar->toolbar) 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->menu_item_project_close, project_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); @@ -83,10 +87,9 @@ } static void -cb_menu_project_close(GtkMenuItem *item, gpointer data) { +cb_menu_project_wizard(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; - project_close(appdata); - main_ui_enable(appdata); + project_wizard(appdata); } static void @@ -115,17 +118,22 @@ 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) { appdata_t *appdata = (appdata_t*)data; if(!appdata->osm || !appdata->project) return; + if(project_check_demo(GTK_WIDGET(appdata->window), appdata->project)) + return; + osm_upload(appdata, appdata->osm, appdata->project); } @@ -134,6 +142,9 @@ appdata_t *appdata = (appdata_t*)data; if(!appdata->project) return; + if(project_check_demo(GTK_WIDGET(appdata->window), appdata->project)) + return; + /* if we have valid osm data loaded: save state first */ if(appdata->osm) { /* redraw the entire map by destroying all map items and redrawing them */ @@ -145,12 +156,13 @@ } // download - if(osm_download(GTK_WIDGET(appdata->window), appdata->project)) { - banner_busy_start(appdata, 1, "Redrawing..."); - appdata->osm = osm_parse(appdata->project->osm); + if(osm_download(GTK_WIDGET(appdata->window), appdata->settings, + appdata->project)) { + banner_busy_start(appdata, 1, "Redrawing"); + appdata->osm = osm_parse(appdata->project->path, appdata->project->osm); diff_restore(appdata, appdata->project, appdata->osm); map_paint(appdata); - banner_busy_stop(appdata); //"Redrawing..." + banner_busy_stop(appdata); //"Redrawing" } main_ui_enable(appdata); @@ -190,51 +202,24 @@ /* ---------------------------------------------------------- */ -#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->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..."); + 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..." + banner_busy_stop(appdata); //"Redrawing" } static void @@ -271,13 +256,13 @@ "uploaded yet? This can't be undone."))) return; - banner_busy_start(appdata, 1, _("Redrawing...")); + 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); + appdata->osm = osm_parse(appdata->project->path, appdata->project->osm); map_paint(appdata); - banner_busy_stop(appdata); //"Redrawing..." + banner_busy_stop(appdata); //"Redrawing" banner_show_info(appdata, _("Discarded local changes")); } @@ -289,10 +274,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)); @@ -395,26 +380,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); } @@ -521,7 +494,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. @@ -600,7 +573,6 @@ return item; } - void menu_create(appdata_t *appdata) { GtkWidget *menu, *item, *submenu; GtkWidget *about_quit_items_menu; @@ -625,14 +597,14 @@ #endif menu_append_new_item( - appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open..."), + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_open), _("_Open"), GTK_STOCK_OPEN, "/Project/Open", 0, 0, TRUE, 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", + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_wizard), _("_Wizard"), + GTK_STOCK_NEW, "/Project/Wizard", 0, 0, TRUE, FALSE, FALSE ); @@ -642,7 +614,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); @@ -688,66 +660,99 @@ 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 + ); + + 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 + ); + - appdata->menu_osm = item = gtk_menu_item_new_with_mnemonic( _("_OSM") ); + /* -------------------- 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, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_Upload..."), - "upload.16", "/OSM/Upload", + + appdata->menu_item_map_upload = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_upload), _("_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", + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_download), _("_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, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes..."), - GTK_STOCK_DELETE, "/OSM/DiscardChanges", + 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, "/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, submenu, GTK_SIGNAL_FUNC(cb_menu_osm_relations), _("_Relations..."), - NULL, "/OSM/Relations", + appdata->menu_item_map_relations = menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_osm_relations), _("_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); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); menu_append_new_item( - appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import..."), + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_wms_import), _("_Import"), GTK_STOCK_INDEX, "/WMS/Import", 0, 0, TRUE, FALSE, FALSE ); @@ -766,93 +771,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, submenu, GTK_SIGNAL_FUNC(cb_menu_track_import), _("_Import..."), + 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, submenu, GTK_SIGNAL_FUNC(cb_menu_track_export), _("_Export..."), + 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, @@ -865,16 +819,18 @@ gtk_separator_menu_item_new()); menu_append_new_item( - appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About..."), + appdata, about_quit_items_menu, GTK_SIGNAL_FUNC(cb_menu_about), _("_About"), GTK_STOCK_ABOUT, "/About", 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); @@ -900,6 +856,139 @@ #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; +} + +/* 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) { + /* draw a popup menu. */ + hildon_app_menu_popup(HILDON_APP_MENU(appdata->submenu_view), + GTK_WINDOW(appdata->window)); +} + +void on_submenu_wms_clicked(GtkButton *button, appdata_t *appdata) { + /* draw a popup menu. */ + hildon_app_menu_popup(HILDON_APP_MENU(appdata->submenu_wms), + 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 DISABLED_ENTRY(a,b,c) { a, NULL, FALSE, NULL, APP_OFFSET(c), 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), + /* --- */ + { "No icons", NULL, TRUE, no_icon_get_toggle, 0, G_CALLBACK(cb_menu_map_no_icons) }, + + 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 +}; + +void menu_create(appdata_t *appdata) { + GtkWidget *button; + HildonAppMenu *menu = HILDON_APP_MENU(hildon_app_menu_new()); + + /* build submenus */ + appdata->submenu_wms = app_menu_create(appdata, submenu_wms); + appdata->submenu_view = app_menu_create(appdata, submenu_view); + + /* ------- */ + button = gtk_button_new_with_label(_("About")); + g_signal_connect_after(button, "clicked", + G_CALLBACK(cb_menu_about), appdata); + hildon_app_menu_append(menu, GTK_BUTTON(button)); + + button = gtk_button_new_with_label(_("View")); + g_signal_connect_after(button, "clicked", + G_CALLBACK(on_submenu_view_clicked), appdata); + hildon_app_menu_append(menu, GTK_BUTTON(button)); + + button = gtk_button_new_with_label(_("WMS")); + g_signal_connect_after(button, "clicked", + G_CALLBACK(on_submenu_wms_clicked), appdata); + hildon_app_menu_append(menu, GTK_BUTTON(button)); + + + + gtk_widget_show_all(GTK_WIDGET(menu)); + hildon_window_set_app_menu(HILDON_WINDOW(appdata->window), menu); +} +#endif /********************* end of menu **********************/ @@ -971,7 +1060,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"); @@ -992,6 +1081,7 @@ // 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: @@ -1011,6 +1101,7 @@ handled = TRUE; break; +#endif } /* forward unprocessed key presses to map */ @@ -1102,13 +1193,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); @@ -1121,10 +1223,8 @@ /* let gtk do its thing before loading the data, */ /* so the user sees something */ - while(gtk_events_pending()) { - putchar('.'); + while(gtk_events_pending()) gtk_main_iteration(); - } /* load project if one is specified in the settings */ if(appdata.settings->project) @@ -1136,8 +1236,47 @@ if(appdata.settings && appdata.settings->enable_gps) track_enable_gps(&appdata, TRUE); - /* ------------ jump into main loop ---------------- */ + /* again let the ui do its thing */ + 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"), + _("This is the first time you run OSM2Go. " + "A demo project has been loaded to get you " + "started. You can play around with this demo as much " + "as you like. However, you cannot upload or download " + "the demo project.\n\n" + "In order to start working on real data you'll have " + "to setup a new project and enter your OSM user name " + "and password. You'll then be able to download the " + "latest data from OSM and upload your changes into " + "the OSM main database." + )); + } + + /* ------------ jump into main loop ---------------- */ gtk_main(); puts("gtk_main() left");