X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/0d337f27a0e88ab0371df75ba9d2e50374a3692d..f3c798e9818e701f4db1819debe30c3771f38542:/src/acquire.c diff --git a/src/acquire.c b/src/acquire.c index 77e31b01..1a17895f 100644 --- a/src/acquire.c +++ b/src/acquire.c @@ -56,7 +56,6 @@ const VikDataSourceInterface *filters[] = { const guint N_FILTERS = sizeof(filters) / sizeof(filters[0]); VikTrack *filter_track = NULL; -gchar *filter_track_name = NULL; /********************************************************/ @@ -95,7 +94,7 @@ static void get_from_anything ( w_and_interface_t *wi ) gchar *cmd = wi->cmd; gchar *extra = wi->extra; gboolean result = TRUE; - VikTrwLayer *vtl; + VikTrwLayer *vtl = NULL; gboolean creating_new_layer = TRUE; @@ -119,9 +118,10 @@ static void get_from_anything ( w_and_interface_t *wi ) } gdk_threads_leave(); + // TODO consider removing 'type' and make everything run via the specficied process function switch ( source_interface->type ) { case VIK_DATASOURCE_GPSBABEL_DIRECT: - result = a_babel_convert_from (vtl, cmd, (BabelStatusFunc) progress_func, extra, w); + result = a_babel_convert_from (vtl, cmd, extra, (BabelStatusFunc) progress_func, w); break; case VIK_DATASOURCE_URL: result = a_babel_convert_from_url (vtl, cmd, extra, (BabelStatusFunc) progress_func, w); @@ -129,6 +129,10 @@ static void get_from_anything ( w_and_interface_t *wi ) case VIK_DATASOURCE_SHELL_CMD: result = a_babel_convert_from_shellcommand ( vtl, cmd, extra, (BabelStatusFunc) progress_func, w); break; + case VIK_DATASOURCE_INTERNAL: + if ( source_interface->process_func ) + result = source_interface->process_func ( vtl, cmd, extra, (BabelStatusFunc) progress_func, w ); + break; default: g_critical("Houston, we've had a problem."); } @@ -147,8 +151,21 @@ static void get_from_anything ( w_and_interface_t *wi ) gdk_threads_enter(); if (w->ok) { gtk_label_set_text ( GTK_LABEL(w->status), _("Done.") ); - if ( creating_new_layer ) - vik_aggregate_layer_add_layer( vik_layers_panel_get_top_layer(w->vlp), VIK_LAYER(vtl)); + if ( creating_new_layer ) { + /* Only create the layer if it actually contains anything useful */ + if ( g_hash_table_size (vik_trw_layer_get_tracks(vtl)) || + g_hash_table_size (vik_trw_layer_get_waypoints(vtl)) ) { + vik_layer_post_read ( VIK_LAYER(vtl), w->vvp, TRUE ); + vik_aggregate_layer_add_layer( vik_layers_panel_get_top_layer(w->vlp), VIK_LAYER(vtl)); + } + else + gtk_label_set_text ( GTK_LABEL(w->status), _("No data.") ); + } + /* View this data if available and is desired */ + if ( vtl && source_interface->autoview ) { + vik_trw_layer_auto_set_view ( vtl, vik_layers_panel_get_viewport(w->vlp) ); + vik_layers_panel_emit_update (w->vlp); + } if ( source_interface->keep_dialog_open ) { gtk_dialog_set_response_sensitive ( GTK_DIALOG(w->dialog), GTK_RESPONSE_ACCEPT, TRUE ); gtk_dialog_set_response_sensitive ( GTK_DIALOG(w->dialog), GTK_RESPONSE_REJECT, FALSE ); @@ -182,7 +199,7 @@ static gchar *write_tmp_trwlayer ( VikTrwLayer *vtl ) FILE *f; g_assert ((fd_src = g_file_open_tmp("tmp-viking.XXXXXX", &name_src, NULL)) >= 0); f = fdopen(fd_src, "w"); - a_gpx_write_file(vtl, f); + a_gpx_write_file(vtl, f, NULL); fclose(f); f = NULL; return name_src; @@ -196,7 +213,7 @@ static gchar *write_tmp_track ( VikTrack *track ) FILE *f; g_assert ((fd_src = g_file_open_tmp("tmp-viking.XXXXXX", &name_src, NULL)) >= 0); f = fdopen(fd_src, "w"); - a_gpx_write_track_file("track", track, f); /* Thank you Guilhem! Just when I needed this function... -- Evan */ + a_gpx_write_track_file(track, f, NULL); /* Thank you Guilhem! Just when I needed this function... -- Evan */ fclose(f); f = NULL; return name_src; @@ -213,7 +230,10 @@ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikD /* for manual dialogs */ GtkWidget *dialog = NULL; GtkWidget *status; - gchar *cmd, *extra; + gchar *cmd = NULL; + gchar *extra = NULL; + gchar *cmd_off = NULL; + gchar *extra_off = NULL; acq_dialog_widgets_t *w; gpointer user_data; @@ -246,9 +266,18 @@ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikD if ( source_interface->add_setup_widgets_func ) { dialog = gtk_dialog_new_with_buttons ( "", GTK_WINDOW(vw), 0, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); +#endif + source_interface->add_setup_widgets_func(dialog, vvp, user_data); gtk_window_set_title ( GTK_WINDOW(dialog), _(source_interface->window_title) ); + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) != GTK_RESPONSE_ACCEPT ) { source_interface->cleanup_func(user_data); gtk_widget_destroy(dialog); @@ -257,7 +286,7 @@ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikD } /* POSSIBILITY 2: UI BUILDER */ else if ( source_interface->params ) { - paramdatas = a_uibuilder_run_dialog ( GTK_WINDOW(vw), + paramdatas = a_uibuilder_run_dialog ( source_interface->window_title, GTK_WINDOW(vw), source_interface->params, source_interface->params_count, source_interface->params_groups, source_interface->params_groups_count, source_interface->params_defaults ); @@ -293,8 +322,13 @@ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikD ( pass_along_data, &cmd, &extra, name_src_track ); g_free ( name_src_track ); - } else - source_interface->get_cmd_string_func ( pass_along_data, &cmd, &extra ); + } else if ( source_interface->get_cmd_string_func ) + source_interface->get_cmd_string_func ( pass_along_data, &cmd, &extra ); + + /* Get data for Off command */ + if ( source_interface->off_func ) { + source_interface->off_func ( pass_along_data, &cmd_off, &extra_off ); + } /* cleanup for option dialogs */ if ( source_interface->add_setup_widgets_func ) { @@ -325,6 +359,7 @@ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikD w->ok = TRUE; status = gtk_label_new (_("Status: detecting gpsbabel")); gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(dialog)->vbox), status, FALSE, FALSE, 5 ); + gtk_dialog_set_default_response ( GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT ); gtk_widget_show_all(status); w->status = status; @@ -343,6 +378,10 @@ static void acquire ( VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikD if ( w->ok ) w->ok = FALSE; /* tell thread to stop. TODO: add mutex */ else { + if ( cmd_off ) { + /* Turn off */ + a_babel_convert_from (NULL, cmd_off, extra_off, NULL, NULL); + } g_free ( w ); /* thread has finished; free w */ } gtk_widget_destroy ( dialog ); @@ -383,7 +422,7 @@ static GtkWidget *acquire_build_menu ( VikWindow *vw, VikLayersPanel *vlp, VikVi if ( filters[i]->inputtype == inputtype ) { if ( ! menu_item ) { /* do this just once, but return NULL if no filters */ menu = gtk_menu_new(); - menu_item = gtk_menu_item_new_with_label ( menu_title ); + menu_item = gtk_menu_item_new_with_mnemonic ( menu_title ); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu ); } @@ -400,7 +439,7 @@ static GtkWidget *acquire_build_menu ( VikWindow *vw, VikLayersPanel *vlp, VikVi GtkWidget *a_acquire_trwlayer_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl) { - return acquire_build_menu ( vw, vlp, vvp, vtl, NULL, "Filter", VIK_DATASOURCE_INPUTTYPE_TRWLAYER ); + return acquire_build_menu ( vw, vlp, vvp, vtl, NULL, "_Filter", VIK_DATASOURCE_INPUTTYPE_TRWLAYER ); } GtkWidget *a_acquire_trwlayer_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport *vvp, VikTrwLayer *vtl) @@ -408,7 +447,7 @@ GtkWidget *a_acquire_trwlayer_track_menu (VikWindow *vw, VikLayersPanel *vlp, Vi if ( filter_track == NULL ) return NULL; else { - gchar *menu_title = g_strdup_printf ( "Filter with %s", filter_track_name ); + gchar *menu_title = g_strdup_printf ( "Filter with %s", filter_track->name ); GtkWidget *rv = acquire_build_menu ( vw, vlp, vvp, vtl, filter_track, menu_title, VIK_DATASOURCE_INPUTTYPE_TRWLAYER_TRACK ); g_free ( menu_title ); @@ -421,15 +460,11 @@ GtkWidget *a_acquire_track_menu (VikWindow *vw, VikLayersPanel *vlp, VikViewport return acquire_build_menu ( vw, vlp, vvp, NULL, tr, "Filter", VIK_DATASOURCE_INPUTTYPE_TRACK ); } -void a_acquire_set_filter_track ( VikTrack *tr, const gchar *name ) +void a_acquire_set_filter_track ( VikTrack *tr ) { if ( filter_track ) vik_track_free ( filter_track ); - if ( filter_track_name ) - g_free ( filter_track_name ); filter_track = tr; vik_track_ref ( tr ); - - filter_track_name = g_strdup(name); }