--- trunk/src/main.c 2009/06/25 15:24:24 7 +++ trunk/src/main.c 2009/06/26 12:24:24 11 @@ -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,10 @@ gpx_busy_dialog_destroy(dialog); } #ifndef USE_BREAD_CRUMB_TRAIL - cachelist_dialog(appdata, gpx); + if(!appdata->cur_gpx) + cachelist_dialog(appdata, gpx); + else + printf("selected gpx, but cachelist window already present\n"); #else gtk_container_remove(GTK_CONTAINER(appdata->vbox), appdata->cur_view); appdata->cur_view = cachelist_create(appdata, gpx, NULL); @@ -1328,17 +1378,22 @@ /* 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); + appdata->search_results = + search_do(appdata, appdata->gpx, p, appdata->search, FALSE); /* do search result dialog here ... */ - cachelist_dialog(appdata, found); - search_result_free(found); + cachelist_dialog(appdata, appdata->search_results); +#ifndef USE_STACKABLE_WINDOW + search_result_free(appdata->search_results); + appdata->search_results = NULL; +#endif #else + gpx_t *found = NULL; + if(appdata->cur_gpx) found = search_do(appdata, appdata->cur_gpx, p, appdata->search, TRUE); else @@ -1451,13 +1506,23 @@ } #ifdef USE_STACKABLE_WINDOW +static void on_export_destroy(GtkWidget *widget, appdata_t *appdata) { + appdata->cur_view = g_object_get_data(G_OBJECT(widget), "cur_view"); +} 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"); + gtk_window_set_title (GTK_WINDOW (view_window), "GPXView - Export"); + + /* store last "cur_view" in window */ + g_object_set_data(G_OBJECT(view_window), "cur_view", appdata->cur_view); + appdata->cur_view = NULL; + + g_signal_connect(G_OBJECT(view_window), "destroy", + G_CALLBACK(on_export_destroy), appdata); GtkVBox *contents = GTK_VBOX(gtk_vbox_new (12, FALSE)); @@ -1494,12 +1559,23 @@ gtk_widget_show_all (GTK_WIDGET (view_window)); } +static void on_tools_destroy(GtkWidget *widget, appdata_t *appdata) { + appdata->cur_view = g_object_get_data(G_OBJECT(widget), "cur_view"); +} + void on_tools_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"); + gtk_window_set_title (GTK_WINDOW (view_window), "GPXView - Tools"); + + /* store last "cur_view" in window */ + g_object_set_data(G_OBJECT(view_window), "cur_view", appdata->cur_view); + appdata->cur_view = NULL; + + g_signal_connect(G_OBJECT(view_window), "destroy", + G_CALLBACK(on_tools_destroy), appdata); GtkVBox *contents = GTK_VBOX(gtk_vbox_new (12, FALSE)); @@ -1786,8 +1862,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 +1870,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 +2054,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 +2096,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 +2118,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[]) {