From 6027a9c5e47a4bc29e826fd7d8f8da26d9b94a97 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Sun, 7 Mar 2010 23:03:26 +0000 Subject: [PATCH] Add and use preference for height units. 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 --- src/dialog.c | 40 +++++++++++++++++++++++++++++++--- src/globals.c | 15 +++++++++++++ src/globals.h | 8 +++++++ src/viktrwlayer_propwin.c | 44 +++++++++++++++++++++++++++++++++----- src/viktrwlayer_tpwin.c | 45 +++++++++++++++++++++++++++++++++++---- 5 files changed, 140 insertions(+), 12 deletions(-) diff --git a/src/dialog.c b/src/dialog.c index bf1ea00e..c9d39ce9 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -206,7 +206,18 @@ gboolean a_dialog_new_waypoint ( GtkWindow *parent, gchar **dest, VikWaypoint *w 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 ) { @@ -326,7 +337,19 @@ gboolean a_dialog_new_waypoint ( GtkWindow *parent, gchar **dest, VikWaypoint *w 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)) ) @@ -355,7 +378,18 @@ gboolean a_dialog_new_waypoint ( GtkWindow *parent, gchar **dest, VikWaypoint *w 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 ) diff --git a/src/globals.c b/src/globals.c index 76854fc1..897fe8cc 100644 --- a/src/globals.c +++ b/src/globals.c @@ -35,6 +35,7 @@ gboolean vik_use_small_wp_icons = FALSE; 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 }, @@ -48,6 +49,10 @@ static VikLayerParam prefs3[] = { { 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" ); @@ -61,6 +66,9 @@ void a_vik_preferences_init () 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 ( ) @@ -85,3 +93,10 @@ vik_units_speed_t a_vik_get_units_speed ( ) 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; +} diff --git a/src/globals.h b/src/globals.h index f0387fe3..b738e231 100644 --- a/src/globals.h +++ b/src/globals.h @@ -80,6 +80,14 @@ typedef enum { 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." diff --git a/src/viktrwlayer_propwin.c b/src/viktrwlayer_propwin.c index e984e649..6f4e3440 100644 --- a/src/viktrwlayer_propwin.c +++ b/src/viktrwlayer_propwin.c @@ -391,6 +391,7 @@ GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, VikTrack *tr, gpoin /* 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); @@ -401,7 +402,17 @@ GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, VikTrack *tr, gpoin 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, @@ -864,17 +875,40 @@ void vik_trw_layer_propwin_run ( GtkWindow *parent, VikTrwLayer *vtl, VikTrack * } 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 diff --git a/src/viktrwlayer_tpwin.c b/src/viktrwlayer_tpwin.c index e96df10d..2388efad 100644 --- a/src/viktrwlayer_tpwin.c +++ b/src/viktrwlayer_tpwin.c @@ -93,8 +93,21 @@ static void tpwin_sync_ll_to_tp ( VikTrwLayerTpwin *tpwin ) 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 ) @@ -252,7 +265,19 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr 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. */ @@ -335,8 +360,20 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr 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 ); -- 2.39.5