--- trunk/src/main.c 2009/02/28 22:31:10 101 +++ trunk/src/main.c 2009/07/13 12:15:51 218 @@ -23,11 +23,19 @@ #include #include +#if defined(USE_HILDON) && (MAEMO_VERSION_MAJOR == 5) +#include +#include +#include +#include +#include +#endif + #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) { +void main_ui_enable(appdata_t *appdata) { gboolean project_valid = (appdata->project != NULL); gboolean osm_valid = (appdata->osm != NULL); @@ -36,7 +44,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,28 +58,26 @@ 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->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); + +#ifdef ZOOM_BUTTONS + gtk_widget_set_sensitive(appdata->btn_zoom_in, osm_valid); + gtk_widget_set_sensitive(appdata->btn_zoom_out, osm_valid); +#endif if(!project_valid) statusbar_set(appdata, _("Please load or create a project"), FALSE); @@ -75,66 +86,73 @@ /******************** begin of menu *********************/ static void -cb_menu_project_open(GtkWidget *window, gpointer data) { +cb_menu_project_open(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; project_load(appdata, NULL); main_ui_enable(appdata); } static void -cb_menu_project_close(GtkWidget *window, 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 -cb_menu_about(GtkWidget *window, gpointer data) { - GtkAboutDialog *about = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); - - gtk_about_dialog_set_name(about, "OSM2Go"); - gtk_about_dialog_set_version(about, VERSION); - gtk_about_dialog_set_copyright(about, _("Copyright 2008")); +cb_menu_about(GtkMenuItem *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; const gchar *authors[] = { "Till Harbaum ", "Andrew Chadwick ", + "Marcus Bauer ", + "John Stowers ", NULL }; - gtk_about_dialog_set_authors(about, authors); - - gtk_about_dialog_set_website(about, - _("http://www.harbaum.org/till/maemo")); - - gtk_about_dialog_set_comments(about, - _("Mobile OSM Editor")); + const gchar *artists[] = { + "Andrew Zhilin ", + NULL }; - gtk_widget_show_all(GTK_WIDGET(about)); - gtk_dialog_run(GTK_DIALOG(about)); - gtk_widget_destroy(GTK_WIDGET(about)); + gtk_show_about_dialog(GTK_WINDOW(appdata->window), + "name", "OSM2Go", + "version", VERSION, + "copyright", _("Copyright 2008-2009"), + "authors", authors, + "artists", artists, + "website", _("http://www.harbaum.org/till/maemo"), + "comments", _("Mobile OSM Editor"), + NULL); } void on_window_destroy (GtkWidget *widget, gpointer data); +#ifndef USE_HILDON static void -cb_menu_quit(GtkWidget *window, gpointer data) { +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(GtkWidget *window, gpointer data) { +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); } static void -cb_menu_download(GtkWidget *window, gpointer data) { +cb_menu_download(GtkMenuItem *item, gpointer data) { 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 */ @@ -146,31 +164,32 @@ } // 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); } static void -cb_menu_wms_import(GtkWidget *window, gpointer data) { +cb_menu_wms_import(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; wms_import(appdata); } static void -cb_menu_wms_clear(GtkWidget *window, gpointer data) { +cb_menu_wms_clear(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; wms_remove(appdata); } static void -cb_menu_wms_adjust(GtkWidget *window, gpointer data) { +cb_menu_wms_adjust(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; map_action_set(appdata, MAP_ACTION_BG_ADJUST); } @@ -178,77 +197,48 @@ /* ----------- hide objects for performance reasons ----------- */ static void -cb_menu_map_hide_sel(GtkWidget *window, gpointer data) { +cb_menu_map_hide_sel(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; map_hide_selected(appdata); } static void -cb_menu_map_show_all(GtkWidget *window, gpointer data) { +cb_menu_map_show_all(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; map_show_all(appdata); } /* ---------------------------------------------------------- */ -#if 1 // mainly for testing -static void -cb_menu_redraw(GtkWidget *window, 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_style(GtkWidget *widget, gpointer data) { - appdata_t *appdata = (appdata_t*)data; +cb_menu_map_no_icons(MENU_CHECK_ITEM *item, appdata_t *appdata) { - style_select(GTK_WIDGET(appdata->window), appdata); -} + banner_busy_start(appdata, 1, "Redrawing"); + map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); -static void -cb_menu_map_no_icons(GtkWidget *widget, 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_icons = - gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); map_paint(appdata); - banner_busy_stop(appdata); //"Redrawing..." + banner_busy_stop(appdata); //"Redrawing" } static void -cb_menu_map_no_antialias(GtkWidget *widget, gpointer data) { +cb_menu_style(GtkMenuItem *item, 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..." + style_select(GTK_WIDGET(appdata->window), appdata); } static void -cb_menu_undo(GtkWidget *widget, gpointer data) { +cb_menu_undo(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; undo(appdata); @@ -257,7 +247,7 @@ } static void -cb_menu_save_changes(GtkWidget *widget, gpointer data) { +cb_menu_save_changes(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; diff_save(appdata->project, appdata->osm); @@ -265,7 +255,7 @@ } static void -cb_menu_undo_changes(GtkWidget *widget, gpointer data) { +cb_menu_undo_changes(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0, @@ -274,34 +264,37 @@ "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")); } static void -cb_menu_osm_relations(GtkWidget *widget, gpointer data) { - relation_list((appdata_t*)data); +cb_menu_osm_relations(GtkMenuItem *item, appdata_t *appdata) { + /* list relations of all objects */ + relation_list(GTK_WIDGET(appdata->window), appdata, NULL); } +#if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5) static void -cb_menu_fullscreen(GtkWidget *widget, gpointer data) { +cb_menu_fullscreen(MENU_CHECK_ITEM *item, gpointer data) { appdata_t *appdata = (appdata_t *)data; - if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) + if(MENU_CHECK_ITEM_ACTIVE(item)) gtk_window_fullscreen(GTK_WINDOW(appdata->window)); else gtk_window_unfullscreen(GTK_WINDOW(appdata->window)); } +#endif static void -cb_menu_zoomin(GtkWidget *widget, appdata_t *appdata) { +cb_menu_zoomin(GtkMenuItem *item, appdata_t *appdata) { if(!appdata || !appdata->map) return; map_set_zoom(appdata->map, appdata->map->state->zoom*ZOOM_FACTOR_MENU, TRUE); @@ -309,7 +302,7 @@ } static void -cb_menu_zoomout(GtkWidget *widget, appdata_t *appdata) { +cb_menu_zoomout(GtkMenuItem *item, appdata_t *appdata) { if(!appdata || !appdata->map) return; map_set_zoom(appdata->map, appdata->map->state->zoom/ZOOM_FACTOR_MENU, TRUE); @@ -317,7 +310,32 @@ } static void -cb_menu_track_import(GtkWidget *window, appdata_t *appdata) { +cb_menu_view_detail_inc(GtkMenuItem *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + printf("detail level increase\n"); + map_detail_increase(appdata->map); +} + +static void +cb_menu_view_detail_normal(GtkMenuItem *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + printf("detail level normal\n"); + map_detail_normal(appdata->map); +} + +static void +cb_menu_view_detail_dec(GtkMenuItem *item, gpointer data) { + appdata_t *appdata = (appdata_t*)data; + + printf("detail level decrease\n"); + map_detail_decrease(appdata->map); +} + +static void +cb_menu_track_import(GtkMenuItem *item, appdata_t *appdata) { + g_assert(appdata->settings); /* open a file selector */ GtkWidget *dialog; @@ -334,30 +352,35 @@ NULL); #endif - /* use path if one is present */ - if(appdata->track.import_path) - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), - appdata->track.import_path); - + if(appdata->settings->track_path) { + if(!g_file_test(appdata->settings->track_path, G_FILE_TEST_EXISTS)) { + char *last_sep = strrchr(appdata->settings->track_path, '/'); + if(last_sep) { + *last_sep = 0; // seperate path from file + + /* the user just created a new document */ + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), + appdata->settings->track_path); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), + last_sep+1); + + /* restore full filename */ + *last_sep = '/'; + } + } else + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), + appdata->settings->track_path); + } + gtk_widget_show_all (GTK_WIDGET(dialog)); if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) { char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); /* load a track */ - track_do(appdata, TRACK_IMPORT, filename); + appdata->track.track = track_import(appdata, filename); if(appdata->track.track) { - - /* save path if gpx was successfully loaded */ - char *r = strrchr(filename, '/'); - - /* there is a delimiter, use everything left of it as path */ - if(r) { - *r = 0; - if(appdata->track.import_path) g_free(appdata->track.import_path); - appdata->track.import_path = g_strdup(filename); - /* restore path ... just in case ... */ - *r = '/'; - } + if(appdata->settings->track_path) g_free(appdata->settings->track_path); + appdata->settings->track_path = g_strdup(filename); } g_free (filename); } @@ -366,28 +389,87 @@ } static void -cb_menu_track_gps(GtkWidget *window, gpointer data) { - appdata_t *appdata = (appdata_t*)data; +cb_menu_track_enable_gps(MENU_CHECK_ITEM *item, appdata_t *appdata) { + track_enable_gps(appdata, MENU_CHECK_ITEM_ACTIVE(item)); +} - if(gtk_check_menu_item_get_active( - GTK_CHECK_MENU_ITEM(appdata->track.menu_item_gps))) { - track_do(appdata, TRACK_GPS, NULL); - } else { - track_do(appdata, TRACK_NONE, NULL); - } + +static void +cb_menu_track_follow_gps(MENU_CHECK_ITEM *item, appdata_t *appdata) { + appdata->settings->follow_gps = MENU_CHECK_ITEM_ACTIVE(item); } + static void -cb_menu_track_export(GtkWidget *window, gpointer data) { - appdata_t *appdata = (appdata_t*)data; - messagef(GTK_WIDGET(appdata->window), _("NIY"), - _("Track export is not yet supported.")); +cb_menu_track_export(GtkMenuItem *item, appdata_t *appdata) { + g_assert(appdata->settings); + + /* open a file selector */ + GtkWidget *dialog; + +#ifdef USE_HILDON + dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(appdata->window), + GTK_FILE_CHOOSER_ACTION_SAVE); +#else + dialog = gtk_file_chooser_dialog_new(_("Export track file"), + GTK_WINDOW(appdata->window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); +#endif + + printf("set filename <%s>\n", appdata->settings->track_path); + + if(appdata->settings->track_path) { + if(!g_file_test(appdata->settings->track_path, G_FILE_TEST_EXISTS)) { + char *last_sep = strrchr(appdata->settings->track_path, '/'); + if(last_sep) { + *last_sep = 0; // seperate path from file + + /* the user just created a new document */ + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), + appdata->settings->track_path); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), + last_sep+1); + + /* restore full filename */ + *last_sep = '/'; + } + } else + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), + appdata->settings->track_path); + } + + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_FM_OK) { + gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if(filename) { + printf("export to %s\n", filename); + + if(!g_file_test(filename, G_FILE_TEST_EXISTS) || + yes_no_f(dialog, appdata, MISC_AGAIN_ID_EXPORT_OVERWRITE, + MISC_AGAIN_FLAG_DONT_SAVE_NO, + "Overwrite existing file", + "The file already exists. " + "Do you really want to replace it?")) { + if(appdata->settings->track_path) + g_free(appdata->settings->track_path); + appdata->settings->track_path = g_strdup(filename); + + track_export(appdata, filename); + } + } + } + + gtk_widget_destroy (dialog); } + static void -cb_menu_track_clear(GtkWidget *window, gpointer data) { +cb_menu_track_clear(GtkMenuItem *item, gpointer data) { appdata_t *appdata = (appdata_t*)data; - track_do(appdata, TRACK_NONE, NULL); + track_clear(appdata, appdata->track.track); + appdata->track.track = NULL; } @@ -421,7 +503,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. @@ -435,6 +517,7 @@ const gchar *accel_path, guint accel_key, // from gdk/gdkkeysyms.h GdkModifierType accel_mods, // e.g. GDK_CONTROL_MASK + gboolean enabled, gboolean is_check, gboolean check_status) { GtkWidget *item = NULL; @@ -490,15 +573,15 @@ #endif gtk_menu_shell_append(GTK_MENU_SHELL(menu_shell), GTK_WIDGET(item)); - if (is_check) { + gtk_widget_set_sensitive(GTK_WIDGET(item), enabled); + 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; GtkWidget *about_quit_items_menu; @@ -523,16 +606,18 @@ #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, FALSE, FALSE + 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", - 0, 0, FALSE, FALSE +#ifndef USE_HILDON + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_project_wizard), _("_Wizard"), + GTK_STOCK_NEW, "/Project/Wizard", + 0, 0, TRUE, FALSE, FALSE ); +#endif /* --------------- view menu ------------------- */ @@ -540,191 +625,203 @@ 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); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu); +#if !defined(USE_HILDON) || (MAEMO_VERSION_MAJOR < 5) 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 + 0, 0, TRUE, TRUE, FALSE ); +#endif 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 + GDK_comma, GDK_CONTROL_MASK, TRUE, 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 + GDK_period, GDK_CONTROL_MASK, TRUE, FALSE, 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_view_detail_inc), _("More details"), + NULL, "/View/DetailInc", + GDK_period, GDK_MOD1_MASK, TRUE, FALSE, FALSE ); - /* -------------------- OSM submenu -------------------- */ + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_view_detail_normal), _("Normal details"), + NULL, "/View/DetailNormal", + 0, 0, TRUE, FALSE, FALSE + ); - appdata->menu_osm = item = gtk_menu_item_new_with_mnemonic( _("_OSM") ); + menu_append_new_item( + appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_view_detail_dec), _("Less details"), + NULL, "/View/DetailDec", + GDK_comma, GDK_MOD1_MASK, TRUE, FALSE, FALSE + ); + + 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 + ); + + + /* -------------------- 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", - GDK_u, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + + 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", - GDK_d, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + 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", - GDK_z, GDK_CONTROL_MASK, FALSE, FALSE + 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", - GDK_s, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + 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", - 0, 0, FALSE, FALSE + 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", - GDK_r, GDK_SHIFT_MASK|GDK_CONTROL_MASK, FALSE, FALSE + 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, FALSE, FALSE + 0, 0, TRUE, 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 + 0, 0, TRUE, 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 + 0, 0, TRUE, FALSE, FALSE ); 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, 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_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, 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_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, FALSE, FALSE + 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 + 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 + 0, 0, FALSE, FALSE, FALSE ); - appdata->track.menu_item_gps = menu_append_new_item( - appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_track_gps), _("_GPS"), + 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, FALSE + GDK_g, GDK_CONTROL_MASK|GDK_SHIFT_MASK, TRUE, TRUE, + appdata->settings->enable_gps + ); + + 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, + appdata->settings->follow_gps ); /* ------------------------------------------------------- */ @@ -733,16 +830,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, FALSE, FALSE + 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, FALSE, FALSE + 0, 0, TRUE, FALSE, FALSE ); +#endif gtk_window_add_accel_group(GTK_WINDOW(appdata->window), accel_grp); @@ -768,6 +867,198 @@ #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; + if(!appdata->settings) return FALSE; + return appdata->settings->enable_gps; +} + +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)); + printf("requesting check for %s: %p\n", menu_entries->label, + menu_entries->toggle); + 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_map_clicked(GtkButton *button, appdata_t *appdata) { + hildon_app_menu_popup(HILDON_APP_MENU(appdata->app_menu_map), + 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)); +} + +#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 } + +/* -- the view submenu -- */ +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 map submenu -- */ +static const menu_entry_t submenu_map[] = { + ENABLED_ENTRY("Upload", cb_menu_upload, menu_item_map_upload), + SIMPLE_ENTRY("Download", cb_menu_download), + ENABLED_ENTRY("Save local changes", cb_menu_save_changes, + menu_item_map_save_changes), + ENABLED_ENTRY("Discard local changes", cb_menu_undo_changes, + menu_item_map_undo_changes), + ENABLED_ENTRY("Relations", cb_menu_osm_relations, + menu_item_map_relations), + + 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), + SIMPLE_ENTRY("Project", cb_menu_project_open), + ENABLED_ENTRY("View", on_submenu_view_clicked, submenu_view), + ENABLED_ENTRY("Map", on_submenu_map_clicked, submenu_map), + 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_map = app_menu_create(appdata, submenu_map); + appdata->app_menu_view = app_menu_create(appdata, submenu_view); + appdata->app_menu_track = app_menu_create(appdata, submenu_track); + + /* enable/disable some entries according to settings */ + if(appdata && appdata->settings) + gtk_widget_set_sensitive(appdata->track.menu_item_track_follow_gps, + appdata->settings->enable_gps); + + hildon_window_set_app_menu(HILDON_WINDOW(appdata->window), menu); +} +#endif /********************* end of menu **********************/ @@ -839,7 +1130,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"); @@ -857,9 +1148,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: @@ -879,6 +1173,7 @@ handled = TRUE; break; +#endif } /* forward unprocessed key presses to map */ @@ -906,10 +1201,10 @@ g_thread_init(NULL); - gps_init(&appdata); - gtk_init (&argc, &argv); + gps_init(&appdata); + #ifdef USE_HILDON printf("Installing osso context for \"org.harbaum." PACKAGE "\"\n"); appdata.osso_context = osso_initialize("org.harbaum."PACKAGE, @@ -928,6 +1223,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); @@ -970,13 +1276,47 @@ 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 + +#ifdef ZOOM_BUTTONS + GtkWidget *zhbox = gtk_hbox_new(FALSE, 0); + + gtk_box_pack_start_defaults(GTK_BOX(zhbox), statusbar_new(&appdata)); + + /* ---- add zoom in button right of statusbar ---- */ + appdata.btn_zoom_in = gtk_button_new(); + gtk_button_set_image(GTK_BUTTON(appdata.btn_zoom_in), + gtk_image_new_from_stock(GTK_STOCK_ZOOM_IN, GTK_ICON_SIZE_MENU)); + g_signal_connect(appdata.btn_zoom_in, "clicked", G_CALLBACK(cb_menu_zoomin), &appdata); + gtk_box_pack_start(GTK_BOX(zhbox), appdata.btn_zoom_in, FALSE, FALSE, 0); + + /* ---- add zoom out button right of statusbar ---- */ + appdata.btn_zoom_out = gtk_button_new(); + gtk_button_set_image(GTK_BUTTON(appdata.btn_zoom_out), + gtk_image_new_from_stock(GTK_STOCK_ZOOM_OUT, GTK_ICON_SIZE_MENU)); + g_signal_connect(appdata.btn_zoom_out, "clicked", G_CALLBACK(cb_menu_zoomout), &appdata); + gtk_box_pack_start(GTK_BOX(zhbox), appdata.btn_zoom_out, FALSE, FALSE, 0); + + + gtk_box_pack_start(GTK_BOX(vbox), zhbox, FALSE, FALSE, 0); +#else gtk_box_pack_start(GTK_BOX(vbox), statusbar_new(&appdata), FALSE, FALSE, 0); +#endif #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); @@ -989,10 +1329,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) @@ -1000,13 +1338,58 @@ main_ui_enable(&appdata); - /* ------------ jump into main loop ---------------- */ + /* start GPS if enabled by config */ + if(appdata.settings && appdata.settings->enable_gps) + track_enable_gps(&appdata, TRUE); + + /* 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"); track_save(appdata.project, appdata.track.track); + track_clear(&appdata, appdata.track.track); + appdata.track.track = NULL; /* save a diff if there are dirty entries */ diff_save(appdata.project, appdata.osm);