static void georef_layer_load_image ( VikGeorefLayer *vgl, VikViewport *vp, gboolean from_file ) { GError *gx = NULL; if ( vgl->image == NULL ) return; if ( vgl->pixbuf ) g_object_unref ( G_OBJECT(vgl->pixbuf) ); if ( vgl->scaled ) { g_object_unref ( G_OBJECT(vgl->scaled) ); vgl->scaled = NULL; } vgl->pixbuf = gdk_pixbuf_new_from_file ( vgl->image, &gx ); if (gx) { if ( !from_file ) a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("Couldn't open image file: %s"), gx->message ); g_error_free ( gx ); } else { vgl->width = gdk_pixbuf_get_width ( vgl->pixbuf ); vgl->height = gdk_pixbuf_get_height ( vgl->pixbuf ); if ( vgl->pixbuf && vgl->alpha <= 255 ) vgl->pixbuf = ui_pixbuf_set_alpha ( vgl->pixbuf, vgl->alpha ); } /* should find length and width here too */ }
static void georef_layer_export_params ( gpointer *pass_along[2] ) { VikGeorefLayer *vgl = VIK_GEOREF_LAYER(pass_along[0]); GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) { FILE *f = g_fopen ( gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ), "w" ); gtk_widget_destroy ( file_selector ); if ( !f ) { a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]), _("The file you requested could not be opened for writing.") ); return; } else { fprintf ( f, "%f\n%f\n%f\n%f\n%f\n%f\n", vgl->mpp_easting, vgl->mpp_northing, 0.0, 0.0, vgl->corner.easting, vgl->corner.northing ); fclose ( f ); f = NULL; } } else gtk_widget_destroy ( file_selector ); }
void vik_layers_panel_delete_selected ( VikLayersPanel *vlp ) { gint type; GtkTreeIter iter; if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) /* Nothing to do */ return; type = vik_treeview_item_get_type ( vlp->vt, &iter ); if ( type == VIK_TREEVIEW_TYPE_LAYER ) { // Get confirmation from the user if ( ! a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Are you sure you want to delete %s?"), vik_layer_get_name ( VIK_LAYER(vik_treeview_item_get_pointer ( vlp->vt, &iter )) ) ) ) return; VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); if ( parent ) { /* reset trigger if trigger deleted */ if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) ) vik_viewport_set_trigger ( vlp->vvp, NULL ); if (IS_VIK_AGGREGATE_LAYER(parent)) { if ( vik_aggregate_layer_delete ( parent, &iter ) ) vik_layers_panel_emit_update ( vlp ); } } else a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("You cannot delete the Top Layer.") ); } else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { VikLayer *sel = vik_layers_panel_get_selected ( vlp ); if ( vik_layer_get_interface(sel->type)->delete_item ) { gint subtype = vik_treeview_item_get_data( vlp->vt, &iter); vik_layer_get_interface(sel->type)->delete_item ( sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter) ); } } }
/** * vik_layers_panel_new_layer: * @type: type of the new layer * * Create a new layer and add to panel. */ gboolean vik_layers_panel_new_layer ( VikLayersPanel *vlp, gint type ) { VikLayer *l; g_assert ( vlp->vvp ); l = vik_layer_create ( type, vlp->vvp, VIK_GTK_WINDOW_FROM_WIDGET(vlp), TRUE ); if ( l ) { vik_layers_panel_add_layer ( vlp, l ); return TRUE; } return FALSE; }
static void georef_layer_load_image ( VikGeorefLayer *vgl, VikViewport *vp, gboolean from_file ) { GError *gx = NULL; if ( vgl->image == NULL ) return; if ( vgl->pixbuf ) g_object_unref ( G_OBJECT(vgl->pixbuf) ); if ( vgl->scaled ) { g_object_unref ( G_OBJECT(vgl->scaled) ); vgl->scaled = NULL; } vgl->pixbuf = gdk_pixbuf_new_from_file ( vgl->image, &gx ); if (gx) { if ( !from_file ) a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("Couldn't open image file: %s"), gx->message ); g_error_free ( gx ); } else { vgl->width = gdk_pixbuf_get_width ( vgl->pixbuf ); vgl->height = gdk_pixbuf_get_height ( vgl->pixbuf ); } if ( !from_file ) { if ( vik_viewport_get_drawmode(vp) != VIK_VIEWPORT_DRAWMODE_UTM ) { a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("GeoRef map cannot be displayed in the current drawmode.\nSelect \"UTM Mode\" from View menu to view it.") ); } } /* should find length and width here too */ }
gboolean dem_layer_set_param ( VikDEMLayer *vdl, guint16 id, VikLayerParamData data, VikViewport *vp, gboolean is_file_operation ) { switch ( id ) { case PARAM_COLOR: vdl->color = data.c; gdk_gc_set_rgb_fg_color ( vdl->gcs[0], &(vdl->color) ); break; case PARAM_SOURCE: vdl->source = data.u; break; case PARAM_TYPE: vdl->type = data.u; break; case PARAM_MIN_ELEV: /* Convert to store internally NB file operation always in internal units (metres) */ if (!is_file_operation && a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) vdl->min_elev = VIK_FEET_TO_METERS(data.d); else vdl->min_elev = data.d; break; case PARAM_MAX_ELEV: /* Convert to store internally NB file operation always in internal units (metres) */ if (!is_file_operation && a_vik_get_units_height () == VIK_UNITS_HEIGHT_FEET ) vdl->max_elev = VIK_FEET_TO_METERS(data.d); else vdl->max_elev = data.d; break; case PARAM_FILES: { // Clear out old settings - if any commonalities with new settings they will have to be read again a_dems_list_free ( vdl->files ); // Set file list so any other intermediate screen drawing updates will show currently loaded DEMs by the working thread vdl->files = data.sl; // No need for thread if no files if ( vdl->files ) { // Thread Load dem_load_thread_data *dltd = g_malloc ( sizeof(dem_load_thread_data) ); dltd->vdl = vdl; dltd->vdl->files = data.sl; a_background_thread ( VIK_GTK_WINDOW_FROM_WIDGET(vp), _("DEM Loading"), (vik_thr_func) dem_layer_load_list_thread, dltd, (vik_thr_free_func) dem_layer_thread_data_free, (vik_thr_free_func) dem_layer_thread_cancel, g_list_length ( data.sl ) ); // Number of DEM files } break; } default: break; } return TRUE; }
static void clip_add_wp(VikLayersPanel *vlp, struct LatLon *coord) { VikCoord vc; VikLayer *sel = vik_layers_panel_get_selected ( vlp ); vik_coord_load_from_latlon ( &vc, VIK_COORD_LATLON, coord ); if (sel && sel->type == VIK_LAYER_TRW) { vik_trw_layer_new_waypoint ( VIK_TRW_LAYER(sel), VIK_GTK_WINDOW_FROM_LAYER(sel), &vc ); } else { a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(GTK_WIDGET(vlp)), _("In order to paste a waypoint, please select an appropriate layer to paste into."), NULL); } }
static void calculate_mpp_from_coords ( GtkWidget *ww, VikGeorefLayer *vgl ) { const gchar* filename = vik_file_entry_get_filename(VIK_FILE_ENTRY(vgl->cw.imageentry)); if ( !filename ) { return; } GError *gx = NULL; GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( filename, &gx ); if ( gx ) { a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(ww), _("Couldn't open image file: %s"), gx->message ); g_error_free ( gx ); return; } guint width = gdk_pixbuf_get_width ( pixbuf ); guint height = gdk_pixbuf_get_height ( pixbuf ); if ( width == 0 || height == 0 ) { a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(ww), _("Invalid image size: %s"), filename); } else { align_coords ( vgl ); struct LatLon ll_tl = get_ll_tl (vgl); struct LatLon ll_br = get_ll_br (vgl); gdouble xmpp, ympp; georef_layer_mpp_from_coords ( VIK_COORD_LATLON, ll_tl, ll_br, width, height, &xmpp, &ympp ); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.x_spin), xmpp ); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(vgl->cw.y_spin), ympp ); check_br_is_good_or_msg_user ( vgl ); } g_object_unref ( G_OBJECT(pixbuf) ); }
void a_geonames_wikipedia_box(VikWindow *vw, VikTrwLayer *vtl, VikLayersPanel *vlp, struct LatLon maxmin[2]) { gchar *uri; gchar *tmpname; GList *wiki_places; GList *selected; GList *wp_runner; VikWaypoint *wiki_wp; found_geoname *wiki_geoname; /* encode doubles in a C locale */ gchar *north = a_coords_dtostr(maxmin[0].lat); gchar *south = a_coords_dtostr(maxmin[1].lat); gchar *east = a_coords_dtostr(maxmin[0].lon); gchar *west = a_coords_dtostr(maxmin[1].lon); uri = g_strdup_printf(GEONAMES_WIKIPEDIA_URL_FMT, north, south, east, west); g_free(north); north = NULL; g_free(south); south = NULL; g_free(east); east = NULL; g_free(west); west = NULL; tmpname = download_url(uri); if (!tmpname) { none_found(vw); return; } wiki_places = get_entries_from_file(tmpname); if (g_list_length(wiki_places) == 0) { none_found(vw); return; } selected = a_select_geoname_from_list(VIK_GTK_WINDOW_FROM_WIDGET(vw), wiki_places, TRUE, "Select articles", "Select the articles you want to add."); wp_runner = selected; while (wp_runner) { wiki_geoname = (found_geoname *)wp_runner->data; wiki_wp = vik_waypoint_new(); wiki_wp->visible = TRUE; vik_coord_load_from_latlon(&(wiki_wp->coord), vik_trw_layer_get_coord_mode ( vtl ), &(wiki_geoname->ll)); vik_waypoint_set_comment(wiki_wp, wiki_geoname->desc); vik_trw_layer_filein_add_waypoint ( vtl, wiki_geoname->name, wiki_wp ); wp_runner = g_list_next(wp_runner); } free_geoname_list(wiki_places); free_geoname_list(selected); g_free(uri); if (tmpname) { g_free(tmpname); } vik_layers_panel_emit_update(vlp); }
static void georef_layer_dialog_load ( changeable_widgets *cw ) { GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) { gdouble values[4]; gint answer = world_file_read_file ( gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_selector)), values ); if ( answer == 1 ) a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(cw->x_spin), _("The World file you requested could not be opened for reading.") ); else if ( answer == 2 ) a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(cw->x_spin), _("Unexpected end of file reading World file.") ); else // NB answer should == 0 for success set_widget_values ( cw, values ); } gtk_widget_destroy ( file_selector ); }
gboolean vik_layers_panel_properties ( VikLayersPanel *vlp ) { GtkTreeIter iter; g_assert ( vlp->vvp ); if ( vik_treeview_get_selected_iter ( vlp->vt, &iter ) && vik_treeview_item_get_type ( vlp->vt, &iter ) == VIK_TREEVIEW_TYPE_LAYER ) { if ( vik_treeview_item_get_data ( vlp->vt, &iter ) == VIK_LAYER_AGGREGATE ) a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Aggregate Layers have no settable properties.") ); VikLayer *layer = VIK_LAYER( vik_treeview_item_get_pointer ( vlp->vt, &iter ) ); if (vik_layer_properties ( layer, vlp->vvp )) vik_layer_emit_update ( layer, FALSE ); return TRUE; } else return FALSE; }
static gboolean world_file_read_line ( gchar *buffer, gint size, FILE *f, GtkWidget *widget, gboolean use_value ) { if (!fgets ( buffer, 1024, f )) { a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(widget), _("Unexpected end of file reading World file.") ); g_free ( buffer ); fclose ( f ); f = NULL; return FALSE; } if ( use_value ) { gdouble val = g_strtod ( buffer, NULL ); gtk_spin_button_set_value ( GTK_SPIN_BUTTON(widget), val > 0 ? val : -val ); } return TRUE; }
static void georef_layer_dialog_load ( GtkWidget *pass_along[4] ) { GtkWidget *file_selector = gtk_file_chooser_dialog_new (_("Choose World file"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); if ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) == GTK_RESPONSE_ACCEPT ) { FILE *f = g_fopen ( gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER(file_selector) ), "r" ); gtk_widget_destroy ( file_selector ); if ( !f ) { a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]), _("The World file you requested could not be opened for reading.") ); return; } else { gchar *buffer = g_malloc ( 1024 * sizeof(gchar) ); if ( world_file_read_line ( buffer, 1024, f, pass_along[0], TRUE ) && world_file_read_line ( buffer, 1024, f, pass_along[0], FALSE) && world_file_read_line ( buffer, 1024, f, pass_along[0], FALSE ) && world_file_read_line ( buffer, 1024, f, pass_along[1], TRUE) && world_file_read_line ( buffer, 1024, f, pass_along[2], TRUE ) && world_file_read_line ( buffer, 1024, f, pass_along[3], TRUE ) ) { g_free ( buffer ); fclose ( f ); f = NULL; } } } else gtk_widget_destroy ( file_selector ); /* do your jazz We need a file selection dialog file opener for reading, if NULL, send error_msg ( VIK_GTK_WINDOW_FROM_WIDGET(pass_along[0]) ) does that catch directories too? read lines -- if not enough lines, give error. if anything outside, give error. define range with #define CONSTANTS put 'em in thar widgets, and that's it. */ }
static int parse_file_for_latlon(VikWindow *vw, gchar *file_name, struct LatLon *ll) { /* return codes: 1 : All OK, position selected; 2 : No position selected; 3 : No places found. */ int found = 1; found_geoname *geoname; GList *found_places = get_entries_from_file(file_name); int num_found_places; num_found_places = g_list_length(found_places); if (num_found_places == 0) { found = 3; } else { if (num_found_places == 1) { geoname = (found_geoname *)found_places->data; ll->lat = geoname->ll.lat; ll->lon = geoname->ll.lon; } else { GList *selected = a_select_geoname_from_list(VIK_GTK_WINDOW_FROM_WIDGET(vw), found_places, FALSE, "Select place", "Select the place to go to"); if (selected) { geoname = (found_geoname *)selected->data; ll->lat = geoname->ll.lat; ll->lon = geoname->ll.lon; g_list_foreach(selected, (GFunc)free_list_geonames, NULL); } else { found = 2; } } } free_geoname_list(found_places); return (found); }
/* our own data type */ static void clip_receive_viking ( GtkClipboard *c, GtkSelectionData *sd, gpointer p ) { VikLayersPanel *vlp = p; vik_clipboard_t *vc; if (sd->length == -1) { g_warning ( _("paste failed") ); return; } // g_print("clip receive: target = %s, type = %s\n", gdk_atom_name(sd->target), gdk_atom_name(sd->type)); g_assert(!strcmp(gdk_atom_name(sd->target), target_table[0].target)); vc = (vik_clipboard_t *)sd->data; // g_print(" sd->data = %p, sd->length = %d, vc->len = %d\n", sd->data, sd->length, vc->len); if (sd->length != sizeof(*vc) + vc->len) { g_warning ( _("wrong clipboard data size") ); return; } if ( vc->type == VIK_CLIPBOARD_DATA_LAYER ) { VikLayer *new_layer = vik_layer_unmarshall ( vc->data, vc->len, vik_layers_panel_get_viewport(vlp) ); vik_layers_panel_add_layer ( vlp, new_layer ); } else if ( vc->type == VIK_CLIPBOARD_DATA_SUBLAYER ) { VikLayer *sel = vik_layers_panel_get_selected ( vlp ); if ( sel && sel->type == vc->layer_type) { if ( vik_layer_get_interface(vc->layer_type)->paste_item ) vik_layer_get_interface(vc->layer_type)->paste_item ( sel, vc->subtype, vc->data, vc->len); } else a_dialog_error_msg_extra ( VIK_GTK_WINDOW_FROM_WIDGET(GTK_WIDGET(vlp)), _("The clipboard contains sublayer data for %s layers. " "You must select a layer of this type to paste the clipboard data."), vik_layer_get_interface(vc->layer_type)->name ); } }
static gboolean layer_properties_factory ( VikLayer *vl, VikViewport *vp ) { switch ( a_uibuilder_properties_factory ( VIK_GTK_WINDOW_FROM_WIDGET(vp), vik_layer_interfaces[vl->type]->params, vik_layer_interfaces[vl->type]->params_count, vik_layer_interfaces[vl->type]->params_groups, vik_layer_interfaces[vl->type]->params_groups_count, (gpointer) vik_layer_interfaces[vl->type]->set_param, vl, vp, (gpointer) vik_layer_interfaces[vl->type]->get_param, vl) ) { case 0: case 3: return FALSE; /* redraw (?) */ case 2: vik_layer_post_read ( vl, vp, FALSE ); /* update any gc's */ default: return TRUE; } }
void vik_layers_panel_cut_selected ( VikLayersPanel *vlp ) { gint type; GtkTreeIter iter; if ( ! vik_treeview_get_selected_iter ( vlp->vt, &iter ) ) /* Nothing to do */ return; type = vik_treeview_item_get_type ( vlp->vt, &iter ); if ( type == VIK_TREEVIEW_TYPE_LAYER ) { VikAggregateLayer *parent = vik_treeview_item_get_parent ( vlp->vt, &iter ); if ( parent ) { /* reset trigger if trigger deleted */ if ( vik_layers_panel_get_selected ( vlp ) == vik_viewport_get_trigger ( vlp->vvp ) ) vik_viewport_set_trigger ( vlp->vvp, NULL ); a_clipboard_copy_selected ( vlp ); if (IS_VIK_AGGREGATE_LAYER(parent)) { if ( vik_aggregate_layer_delete ( parent, &iter ) ) vik_layers_panel_emit_update ( vlp ); } } else a_dialog_info_msg ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("You cannot cut the Top Layer.") ); } else if (type == VIK_TREEVIEW_TYPE_SUBLAYER) { VikLayer *sel = vik_layers_panel_get_selected ( vlp ); if ( vik_layer_get_interface(sel->type)->cut_item ) { gint subtype = vik_treeview_item_get_data( vlp->vt, &iter); vik_layer_get_interface(sel->type)->cut_item ( sel, subtype, vik_treeview_item_get_pointer(sel->vt, &iter) ); } } }
void vik_layers_panel_clear ( VikLayersPanel *vlp ) { if ( (! vik_aggregate_layer_is_empty(vlp->toplayer)) && a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Are you sure you wish to delete all layers?"), NULL ) ) vik_aggregate_layer_clear ( vlp->toplayer ); /* simply deletes all layers */ }
static gboolean georef_layer_properties ( VikGeorefLayer *vgl, gpointer vp ) { return georef_layer_dialog ( &vgl, vp, VIK_GTK_WINDOW_FROM_WIDGET(vp) ); }