Add height unit options of metres or feet into preferences.
Base the method on the Degrees format option.
Update all revelant displays to show correct information including:
.Track Properties - Stats & Elev/Dist tabs.
.Track Point Properties
.Waypoint Properties
lat = g_strdup_printf ( "%f", ll.lat );
lon = g_strdup_printf ( "%f", ll.lon );
- alt = g_strdup_printf ( "%f", wp->altitude );
+ vik_units_height_t height_units = a_vik_get_units_height ();
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ alt = g_strdup_printf ( "%f", wp->altitude );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ alt = g_strdup_printf ( "%f", wp->altitude*3.2808399 );
+ break;
+ default:
+ alt = g_strdup_printf ( "%f", wp->altitude );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
if ( dest != NULL )
{
ll.lat = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry) ) );
ll.lon = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry) ) );
vik_coord_load_from_latlon ( &(wp->coord), coord_mode, &ll );
- wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) );
+ // Always store in metres
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) );
+ alt = g_strdup_printf ( "%f", wp->altitude );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) ) / 3.2808399;
+ break;
+ default:
+ wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
vik_waypoint_set_comment ( wp, gtk_entry_get_text ( GTK_ENTRY(commententry) ) );
vik_waypoint_set_image ( wp, vik_file_entry_get_filename ( VIK_FILE_ENTRY(imageentry) ) );
if ( wp->image && *(wp->image) && (!a_thumbnails_exists(wp->image)) )
ll.lat = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(latentry) ) );
ll.lon = convert_dms_to_dec ( gtk_entry_get_text ( GTK_ENTRY(lonentry) ) );
vik_coord_load_from_latlon ( &(wp->coord), coord_mode, &ll );
- wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) );
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) );
+ alt = g_strdup_printf ( "%f", wp->altitude );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) ) / 3.2808399;
+ break;
+ default:
+ wp->altitude = atof ( gtk_entry_get_text ( GTK_ENTRY(altentry) ) );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
if ( (! wp->comment) || strcmp ( wp->comment, gtk_entry_get_text ( GTK_ENTRY(commententry) ) ) != 0 )
vik_waypoint_set_comment ( wp, gtk_entry_get_text ( GTK_ENTRY(commententry) ) );
if ( (! wp->image) || strcmp ( wp->image, vik_file_entry_get_filename ( VIK_FILE_ENTRY ( imageentry ) ) ) != 0 )
static gchar * params_degree_formats[] = {"DDD", "DMM", "DMS", NULL};
static gchar * params_units_distance[] = {"Kilometres", "Miles", NULL};
static gchar * params_units_speed[] = {"km/h", "mph", "m/s", NULL};
+static gchar * params_units_height[] = {"Metres", "Feet", NULL};
static VikLayerParam prefs1[] = {
{ VIKING_PREFERENCES_NAMESPACE "degree_format", VIK_LAYER_PARAM_UINT, VIK_DEGREE_FORMAT_DMS, N_("Degree format:"), VIK_LAYER_WIDGET_COMBOBOX, params_degree_formats, NULL },
{ VIKING_PREFERENCES_NAMESPACE "units_speed", VIK_LAYER_PARAM_UINT, VIK_UNITS_SPEED_KILOMETRES_PER_HOUR, N_("Speed units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_speed, NULL },
};
+static VikLayerParam prefs4[] = {
+ { VIKING_PREFERENCES_NAMESPACE "units_height", VIK_LAYER_PARAM_UINT, VIK_UNITS_HEIGHT_METRES, N_("Height units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_height, NULL },
+};
+
void a_vik_preferences_init ()
{
a_preferences_register_group ( VIKING_PREFERENCES_GROUP_KEY, "Global preferences" );
tmp.u = VIK_UNITS_SPEED_KILOMETRES_PER_HOUR;
a_preferences_register(prefs3, tmp, VIKING_PREFERENCES_GROUP_KEY);
+
+ tmp.u = VIK_UNITS_HEIGHT_METRES;
+ a_preferences_register(prefs4, tmp, VIKING_PREFERENCES_GROUP_KEY);
}
vik_degree_format_t a_vik_get_degree_format ( )
units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_speed")->u;
return units;
}
+
+vik_units_height_t a_vik_get_units_height ( )
+{
+ vik_units_height_t units;
+ units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_height")->u;
+ return units;
+}
vik_units_speed_t a_vik_get_units_speed ( );
+/* Height (Depth) preferences */
+typedef enum {
+ VIK_UNITS_HEIGHT_METRES,
+ VIK_UNITS_HEIGHT_FEET,
+} vik_units_height_t;
+
+vik_units_height_t a_vik_get_units_height ( );
+
/* Group for global preferences */
#define VIKING_PREFERENCES_GROUP_KEY "viking.globals"
#define VIKING_PREFERENCES_NAMESPACE "viking.globals."
/* draw grid */
#define LABEL_FONT "Sans 7"
+ vik_units_height_t height_units = a_vik_get_units_height ();
for (i=0; i<=LINES; i++) {
PangoFontDescription *pfd;
PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(image), NULL);
pfd = pango_font_description_from_string (LABEL_FONT);
pango_layout_set_font_description (pl, pfd);
pango_font_description_free (pfd);
- sprintf(s, "%8dm", (int)(mina + (LINES-i)*(maxa-mina)/LINES));
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ sprintf(s, "%8dm", (int)(mina + (LINES-i)*(maxa-mina)/LINES));
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ sprintf(s, "%8dft", (int)((mina + (LINES-i)*(maxa-mina)/LINES)*3.2808399));
+ break;
+ default:
+ sprintf(s, "--");
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
pango_layout_set_text(pl, s, -1);
pango_layout_get_pixel_size (pl, &w, &h);
gdk_draw_layout(GDK_DRAWABLE(pix), window->style->fg_gc[0], MARGIN-w-3,
}
widgets->w_avg_dist = content[cnt++] = gtk_label_new ( tmp_buf );
+ vik_units_height_t height_units = a_vik_get_units_height ();
if ( min_alt == VIK_DEFAULT_ALTITUDE )
g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data"));
- else
- g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m - %.0f m", min_alt, max_alt );
+ else {
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m - %.0f m", min_alt, max_alt );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f feet - %.0f feet", min_alt*3.2808399, max_alt*3.2808399 );
+ break;
+ default:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "--" );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
+ }
widgets->w_elev_range = content[cnt++] = gtk_label_new ( tmp_buf );
vik_track_get_total_elevation_gain(tr, &max_alt, &min_alt );
if ( min_alt == VIK_DEFAULT_ALTITUDE )
g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data"));
- else
- g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m / %.0f m", max_alt, min_alt );
+ else {
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m / %.0f m", max_alt, min_alt );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f feet / %.0f feet", max_alt*3.2808399, min_alt*3.2808399 );
+ break;
+ default:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "--" );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
+ }
widgets->w_elev_gain = content[cnt++] = gtk_label_new ( tmp_buf );
#if 0
static void tpwin_sync_alt_to_tp ( VikTrwLayerTpwin *tpwin )
{
- if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) )
- tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt );
+ if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) {
+ // Always store internally in metres
+ vik_units_height_t height_units = a_vik_get_units_height ();
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt ) / 3.2808399;
+ break;
+ default:
+ tpwin->cur_tp->altitude = gtk_spin_button_get_value ( tpwin->alt );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
+ }
}
VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent )
vik_coord_to_latlon ( &(tp->coord), &ll );
gtk_spin_button_set_value ( tpwin->lat, ll.lat );
gtk_spin_button_set_value ( tpwin->lon, ll.lon );
- gtk_spin_button_set_value ( tpwin->alt, tp->altitude );
+ vik_units_height_t height_units = a_vik_get_units_height ();
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ gtk_spin_button_set_value ( tpwin->alt, tp->altitude );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ gtk_spin_button_set_value ( tpwin->alt, tp->altitude*3.2808399 );
+ break;
+ default:
+ gtk_spin_button_set_value ( tpwin->alt, tp->altitude );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
+
tpwin->sync_to_tp_block = FALSE; /* don't update whlie setting data. */
default:
g_critical("Houston, we've had a problem. distance=%d", dist_units);
}
- g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->vdop );
+
+ switch (height_units) {
+ case VIK_UNITS_HEIGHT_METRES:
+ g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->vdop );
+ break;
+ case VIK_UNITS_HEIGHT_FEET:
+ g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f feet", tp->vdop*3.2808399 );
+ break;
+ default:
+ g_snprintf ( tmp_str, sizeof(tmp_str), "--" );
+ g_critical("Houston, we've had a problem. height=%d", height_units);
+ }
gtk_label_set_text ( tpwin->vdop, tmp_str );
+
g_snprintf ( tmp_str, sizeof(tmp_str), "%d / %d", tp->nsats, tp->fix_mode );
gtk_label_set_text ( tpwin->sat, tmp_str );