--- trunk/src/main.c 2009/06/25 15:24:24 7 +++ trunk/src/main.c 2009/07/06 14:07:36 24 @@ -120,8 +120,8 @@ HELP_ID_IMPORT, appdata->osso_context); #endif #else - dialog = gtk_file_chooser_dialog_new (whole_dir?_("Open Directory"): - _("Open File"), + dialog = gtk_file_chooser_dialog_new (whole_dir?_("Import directory"): + _("Import file"), GTK_WINDOW(appdata->window), whole_dir?GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER : GTK_FILE_CHOOSER_ACTION_OPEN, @@ -264,6 +264,11 @@ // gtk_widget_show_all(appdata->vbox); #else + if(!appdata->cur_view) { + printf("cachelist redraw: no active view\n"); + return; + } + g_assert(!appdata->cur_cache); int redraw = 0; if(appdata->search_results) @@ -274,7 +279,16 @@ } if(redraw) { - gtk_container_remove(GTK_CONTAINER(appdata->vbox), appdata->cur_view); + GtkWidget *container = appdata->vbox; + + printf("redraw %d\n", redraw); + +#ifdef USE_STACKABLE_WINDOW + HildonWindowStack *stack = hildon_window_stack_get_default(); + container = hildon_window_stack_peek(stack); +#endif + + gtk_container_remove(GTK_CONTAINER(container), appdata->cur_view); switch(redraw) { case 1: appdata->cur_view = cachelist_create(appdata, @@ -286,8 +300,14 @@ break; } - gtk_box_pack_start_defaults(GTK_BOX(appdata->vbox), appdata->cur_view); - gtk_widget_show_all(appdata->vbox); +#ifdef USE_STACKABLE_WINDOW + if(container != appdata->vbox) + gtk_container_add(GTK_CONTAINER(container), appdata->cur_view); + else +#endif + gtk_box_pack_start_defaults(GTK_BOX(container), appdata->cur_view); + + gtk_widget_show_all(container); } #endif } @@ -300,6 +320,9 @@ #ifdef USE_MAEMO appdata_t *appdata = (appdata_t*)data; + if(appdata->cur_cache) + return TRUE; + if(appdata->cachelist_disable_screensaver) if (osso_display_blanking_pause(appdata->osso_context) != OSSO_OK) fprintf(stderr, "error with display blank\n"); @@ -312,6 +335,7 @@ } static void cachelist_timer_reset(appdata_t *appdata) { + printf("cachelist timer reset\n"); g_assert(appdata->cachelist_handler_id); gtk_timeout_remove(appdata->cachelist_handler_id); appdata->cachelist_handler_id = @@ -543,17 +567,40 @@ } #else #ifdef USE_STACKABLE_WINDOW +static void search_result_free(gpx_t *result); + +void on_cachelist_destroy(GtkWidget *widget, appdata_t *appdata) { + if(appdata->search_results) { + search_result_free(appdata->search_results); + appdata->search_results = NULL; + } + appdata->cur_gpx = NULL; + + /* restore cur_view */ + appdata->cur_view = g_object_get_data(G_OBJECT(widget), "cur_view"); +} + void cachelist_dialog(appdata_t *appdata, gpx_t *gpx) { GtkWidget *window = hildon_stackable_window_new(); - gtk_window_set_title(GTK_WINDOW(window), gpx->name); + /* store last "cur_view" in window */ + g_object_set_data(G_OBJECT(window), "cur_view", appdata->cur_view); - gtk_container_add(GTK_CONTAINER(window), - cachelist_create(appdata, gpx, NULL)); + appdata->cur_gpx = gpx; + char *title = g_strdup_printf("GPXView - %s", gpx->name); + gtk_window_set_title(GTK_WINDOW(window), title); + g_free(title); + + appdata->cur_view = cachelist_create(appdata, gpx, NULL); + gtk_container_add(GTK_CONTAINER(window), appdata->cur_view); + hildon_window_set_app_menu(HILDON_WINDOW(window), menu_create(appdata, MENU_CACHELIST)); + g_signal_connect(G_OBJECT(window), "destroy", + G_CALLBACK(on_cachelist_destroy), appdata); + gtk_widget_show_all(window); } #endif @@ -764,7 +811,14 @@ gpx_busy_dialog_destroy(dialog); } #ifndef USE_BREAD_CRUMB_TRAIL - cachelist_dialog(appdata, gpx); +#ifdef USE_STACKABLE_WINDOW + if(!appdata->cur_gpx) +#endif + cachelist_dialog(appdata, gpx); +#ifdef USE_STACKABLE_WINDOW + else + printf("selected gpx, but cachelist window already present\n"); +#endif #else gtk_container_remove(GTK_CONTAINER(appdata->vbox), appdata->cur_view); appdata->cur_view = cachelist_create(appdata, gpx, NULL); @@ -969,10 +1023,24 @@ gtk_about_dialog_set_name(about, "GPXView"); gtk_about_dialog_set_version(about, VERSION); - gtk_about_dialog_set_copyright(about, - _("GPXView (c) 2008 by\n" - "Till Harbaum \n" - "Geocaching.com: Tantil")); + +#ifdef ENABLE_LIBLOCATION + char *uses = "uses liblocation"; +#elif defined(ENABLE_GPSBT) + char *uses = "uses gpsbt and gpsd"; +#else + char *uses = "uses gpsd"; +#endif + + char *str = g_strdup_printf("%s\n\n(%s)", + _("GPXView (c) 2008-2009 by\n" + "Till Harbaum \n" + "Mailing list: gpxview-users@garage.maemo.org"), + _(uses) + ); + + gtk_about_dialog_set_copyright(about, str); + g_free(str); gtk_about_dialog_set_website(about, _("http://www.harbaum.org/till/maemo")); @@ -1328,17 +1396,23 @@ /* don't search if we are asked to search for nothing */ if(((appdata->search & (SEARCH_ID|SEARCH_NAME|SEARCH_DESC|SEARCH_OWNER)) && strlen(p) > 0) || (appdata->search & SEARCH_FINDS)) { - gpx_t *found = NULL; printf("Search for %s (flags = %x)...\n", p, appdata->search); #ifndef USE_BREAD_CRUMB_TRAIL - found = search_do(appdata, appdata->gpx, p, appdata->search, FALSE); + gpx_t *found = + search_do(appdata, appdata->gpx, p, appdata->search, FALSE); /* do search result dialog here ... */ cachelist_dialog(appdata, found); +#ifndef USE_STACKABLE_WINDOW search_result_free(found); #else + appdata->search_results = found; +#endif +#else + gpx_t *found = NULL; + if(appdata->cur_gpx) found = search_do(appdata, appdata->cur_gpx, p, appdata->search, TRUE); else @@ -1451,91 +1525,106 @@ } #ifdef USE_STACKABLE_WINDOW +static GtkWidget *export_menu_create(appdata_t *appdata) { + GtkWidget *button; + HildonAppMenu *menu = HILDON_APP_MENU(hildon_app_menu_new()); -void on_export_clicked(GtkButton *button, appdata_t *appdata) { - HildonStackableWindow *view_window; - GtkWidget *but; - - view_window = HILDON_STACKABLE_WINDOW (hildon_stackable_window_new ()); - gtk_window_set_title (GTK_WINDOW (view_window), "Export"); - - GtkVBox *contents = GTK_VBOX(gtk_vbox_new (12, FALSE)); - - but = hildon_button_new_with_text( + button = hildon_button_new_with_text( HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, _("Export to Maemo Mapper"), _("Save a Maemo Mapper POI file")); - g_signal_connect(but, "clicked", + g_signal_connect_after(button, "clicked", G_CALLBACK(cb_menu_export_mmpoi), appdata); - gtk_box_pack_start(GTK_BOX(contents), but, FALSE, FALSE, 0); - + hildon_app_menu_append(menu, GTK_BUTTON(button)); - but = hildon_button_new_with_text( + button = hildon_button_new_with_text( HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, _("Export Field Notes"), _("Save a Garmin Field Notes file")); - g_signal_connect(but, "clicked", + g_signal_connect_after(button, "clicked", G_CALLBACK(cb_menu_export_log), appdata); - gtk_box_pack_start(GTK_BOX(contents), but, FALSE, FALSE, 0); - + hildon_app_menu_append(menu, GTK_BUTTON(button)); - but = hildon_button_new_with_text( + button = hildon_button_new_with_text( HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, _("Export Garmin GPX"), - _("Save a GPX file containing modified waypoints")); - g_signal_connect(but, "clicked", + _("Save modified waypoints in GPX file")); + g_signal_connect_after(button, "clicked", G_CALLBACK(cb_menu_export_garmin), appdata); - gtk_box_pack_start(GTK_BOX(contents), but, FALSE, FALSE, 0); + hildon_app_menu_append(menu, GTK_BUTTON(button)); - gtk_container_add (GTK_CONTAINER (view_window), GTK_WIDGET (contents)); - gtk_widget_show_all (GTK_WIDGET (view_window)); + gtk_widget_show_all(GTK_WIDGET(menu)); + + return GTK_WIDGET(menu); } -void on_tools_clicked(GtkButton *button, appdata_t *appdata) { - HildonStackableWindow *view_window; - GtkWidget *but; +/* the export submenu */ +void on_export_clicked(GtkButton *button, appdata_t *appdata) { + if(!appdata->export_menu) + appdata->export_menu = export_menu_create(appdata); - view_window = HILDON_STACKABLE_WINDOW (hildon_stackable_window_new ()); - gtk_window_set_title (GTK_WINDOW (view_window), "Export"); + /* draw a popup menu */ + hildon_app_menu_popup(HILDON_APP_MENU(appdata->export_menu), + GTK_WINDOW(hildon_window_stack_peek( + hildon_window_stack_get_default()))); +} + +static GtkWidget *tools_menu_create(appdata_t *appdata) { + GtkWidget *button; + HildonAppMenu *menu = HILDON_APP_MENU(hildon_app_menu_new()); - GtkVBox *contents = GTK_VBOX(gtk_vbox_new (12, FALSE)); + /* the following doesn't have an effect */ + // gtk_window_set_title(GTK_WINDOW(menu), "Tools"); - but = hildon_button_new_with_text( + button = hildon_button_new_with_text( HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, _("Geomath"), _("Geocoordinate calculation")); - g_signal_connect(but, "clicked", + g_signal_connect_after(button, "clicked", G_CALLBACK(cb_menu_geomath), appdata); - gtk_box_pack_start(GTK_BOX(contents), but, FALSE, FALSE, 0); + hildon_app_menu_append(menu, GTK_BUTTON(button)); - but = hildon_button_new_with_text( + button = hildon_button_new_with_text( HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, _("Geotext"), - _("Text analysis, letter counting etc")); - g_signal_connect(but, "clicked", + _("Text analysis")); + g_signal_connect_after(button, "clicked", G_CALLBACK(cb_menu_geotext), appdata); - gtk_box_pack_start(GTK_BOX(contents), but, FALSE, FALSE, 0); + hildon_app_menu_append(menu, GTK_BUTTON(button)); - but = hildon_button_new_with_text( + button = hildon_button_new_with_text( HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, _("Precise Position"), - _("Calculate a very precise GPS position")); - g_signal_connect(but, "clicked", + _("Calculate a precise GPS position")); + g_signal_connect_after(button, "clicked", G_CALLBACK(cb_menu_precpos), appdata); - gtk_box_pack_start(GTK_BOX(contents), but, FALSE, FALSE, 0); + hildon_app_menu_append(menu, GTK_BUTTON(button)); + + gtk_widget_show_all(GTK_WIDGET(menu)); + + return GTK_WIDGET(menu); +} + +/* the tools submenu */ +void on_tools_clicked(GtkButton *button, appdata_t *appdata) { + if(!appdata->tools_menu) + appdata->tools_menu = tools_menu_create(appdata); - gtk_container_add (GTK_CONTAINER (view_window), GTK_WIDGET (contents)); - gtk_widget_show_all (GTK_WIDGET (view_window)); + /* draw a popup menu */ + hildon_app_menu_popup(HILDON_APP_MENU(appdata->tools_menu), + GTK_WINDOW(hildon_window_stack_peek( + hildon_window_stack_get_default()))); } + HildonAppMenu *menu_create(appdata_t *appdata, int mode) { GtkWidget *button; HildonAppMenu *menu = HILDON_APP_MENU(hildon_app_menu_new()); @@ -1580,7 +1669,14 @@ G_CALLBACK(on_tools_clicked), appdata); hildon_app_menu_append(menu, GTK_BUTTON(button)); - gtk_widget_show(GTK_WIDGET(menu)); +#ifdef HILDON_HELP + button = gtk_button_new_with_label(_("Help")); + g_signal_connect_after(button, "clicked", + G_CALLBACK(cb_menu_help), appdata); + hildon_app_menu_append(menu, GTK_BUTTON(button)); +#endif + + gtk_widget_show_all(GTK_WIDGET(menu)); return menu; } @@ -1786,8 +1882,7 @@ } gboolean on_window_key_press(GtkWidget *widget, - GdkEventKey *event, gpointer data) { - appdata_t *appdata = (appdata_t*)data; + GdkEventKey *event, appdata_t *appdata) { int handled = FALSE; // printf("key event %d\n", event->keyval); @@ -1795,15 +1890,6 @@ switch(event->keyval) { #ifdef USE_MAEMO -#if 0 /* don't do this as it interferes with gtkentry fields */ - case HILDON_HARDKEY_SELECT: - /* remove as long as we haven't reached the main gpx list */ - if(appdata->cur_gpx) - hildon_bread_crumb_trail_pop(HILDON_BREAD_CRUMB_TRAIL(appdata->bct)); - handled = TRUE; - break; -#endif - #ifdef HILDON_HARDKEY_INCREASE case HILDON_HARDKEY_INCREASE: html_zoom(appdata, TRUE); @@ -1988,6 +2074,13 @@ #endif // USE_BREAD_CRUMB_TRAIL void main_after_settings_redraw(appdata_t *appdata, int flags) { + printf("main after settings redraw\n"); + + if(!appdata->cur_view) { + printf("no active view\n"); + return; + } + #ifndef USE_MAEMO // in non-maemo setup this can only affect the main screen as // the menu is blocked while a dialog is open. also the main @@ -2023,7 +2116,14 @@ } if(redraw) { - gtk_container_remove(GTK_CONTAINER(appdata->vbox), appdata->cur_view); + GtkWidget *container = appdata->vbox; + +#ifdef USE_STACKABLE_WINDOW + HildonWindowStack *stack = hildon_window_stack_get_default(); + container = hildon_window_stack_peek(stack); +#endif + + gtk_container_remove(GTK_CONTAINER(container), appdata->cur_view); switch(redraw) { case 1: appdata->cur_view = cachelist_create(appdata, @@ -2038,10 +2138,16 @@ break; } - gtk_box_pack_start_defaults(GTK_BOX(appdata->vbox), appdata->cur_view); - gtk_widget_show_all(appdata->vbox); - } +#ifdef USE_STACKABLE_WINDOW + if(container != appdata->vbox) + gtk_container_add(GTK_CONTAINER(container), appdata->cur_view); + else #endif + gtk_box_pack_start_defaults(GTK_BOX(container), appdata->cur_view); + + gtk_widget_show_all(container); + } +#endif // USE_MAEMO } int main(int argc, char *argv[]) { @@ -2098,7 +2204,10 @@ gtk_window_set_default_size(GTK_WINDOW(appdata.window), 500, 300); #endif +#if MAEMO_VERSION_MAJOR == 5 gtk_window_set_title(GTK_WINDOW(appdata.window), "GPXView"); +#endif + g_signal_connect(G_OBJECT(appdata.window), "destroy", G_CALLBACK(on_window_destroy), &appdata);