]> git.street.me.uk Git - andy/viking.git/commitdiff
Add and use preference for height units.
authorRob Norris <rw_norris@hotmail.com>
Sun, 7 Mar 2010 23:03:26 +0000 (23:03 +0000)
committerRob Norris <rw_norris@hotmail.com>
Sun, 7 Mar 2010 23:03:26 +0000 (23:03 +0000)
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
src/globals.c
src/globals.h
src/viktrwlayer_propwin.c
src/viktrwlayer_tpwin.c

index bf1ea00e0f6e48ab666cd0815a78d76f04f0946d..c9d39ce95d4dfd8766ef64bed569d2968103ee6e 100644 (file)
@@ -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 )
index 76854fc18a9b1150bb5e249448f4451e6e0d9836..897fe8cc1618f885c06c44eb7b2992ba2909c099 100644 (file)
@@ -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;
+}
index f0387fe3d1ee2906ac5fad6331653b84de35ea96..b738e231c13052b161335fc186252674fdd3356e 100644 (file)
@@ -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."
index e984e649a5a5f4dfb2704459399fd6633a7ba6f3..6f4e34403548b815f7892f21338272d6ad1fdd9b 100644 (file)
@@ -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
index e96df10df5a6b1f588212ed7a8135c1d286b9bd3..2388efadd62178aba6d7ac10cfd547b273db7515 100644 (file)
@@ -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 );