]> git.street.me.uk Git - andy/viking.git/commitdiff
Add and use preference for speed units.
authorRob Norris <rw_norris@hotmail.com>
Sun, 7 Mar 2010 20:49:04 +0000 (20:49 +0000)
committerRob Norris <rw_norris@hotmail.com>
Sun, 7 Mar 2010 20:49:04 +0000 (20:49 +0000)
Add speed unit options of kilometres per hour, miles per hour or meters per second into preferences
Base the method on the Degrees format option.
Update all revelant displays to show correct information including:
.Track Properties - Stats & Speed/Time tabs.
.Track Point Properties

Remove the METRIC define from viktrwlayer_propwin.c and the unnecessary conversion of all speeds (Instead just convert the few in the generation for the scale marks text strings)

src/globals.c
src/globals.h
src/viktrwlayer_propwin.c
src/viktrwlayer_tpwin.c

index 10824ee3b425982a2c421c2b8b0e17a9913e3582..76854fc18a9b1150bb5e249448f4451e6e0d9836 100644 (file)
@@ -34,6 +34,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 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 },
@@ -43,6 +44,10 @@ static VikLayerParam prefs2[] = {
   { VIKING_PREFERENCES_NAMESPACE "units_distance", VIK_LAYER_PARAM_UINT, VIK_UNITS_DISTANCE_KILOMETRES, N_("Distance units:"), VIK_LAYER_WIDGET_COMBOBOX, params_units_distance, NULL },
 };
 
+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 },
+};
+
 void a_vik_preferences_init ()
 {
   a_preferences_register_group ( VIKING_PREFERENCES_GROUP_KEY, "Global preferences" );
@@ -53,6 +58,9 @@ void a_vik_preferences_init ()
 
   tmp.u = VIK_UNITS_DISTANCE_KILOMETRES;
   a_preferences_register(prefs2, tmp, VIKING_PREFERENCES_GROUP_KEY);
+
+  tmp.u = VIK_UNITS_SPEED_KILOMETRES_PER_HOUR;
+  a_preferences_register(prefs3, tmp, VIKING_PREFERENCES_GROUP_KEY);
 }
 
 vik_degree_format_t a_vik_get_degree_format ( )
@@ -70,3 +78,10 @@ vik_units_distance_t a_vik_get_units_distance ( )
   units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_distance")->u;
   return units;
 }
+
+vik_units_speed_t a_vik_get_units_speed ( )
+{
+  vik_units_speed_t units;
+  units = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "units_speed")->u;
+  return units;
+}
index e2c7252cba56cfd5c429ec990e35ef71da48a858..f0387fe3d1ee2906ac5fad6331653b84de35ea96 100644 (file)
@@ -71,6 +71,15 @@ typedef enum {
 
 vik_units_distance_t a_vik_get_units_distance ( );
 
+/* Speed preferences */
+typedef enum {
+  VIK_UNITS_SPEED_KILOMETRES_PER_HOUR,
+  VIK_UNITS_SPEED_MILES_PER_HOUR,
+  VIK_UNITS_SPEED_METRES_PER_SECOND,
+} vik_units_speed_t;
+
+vik_units_speed_t a_vik_get_units_speed ( );
+
 /* Group for global preferences */
 #define VIKING_PREFERENCES_GROUP_KEY "viking.globals"
 #define VIKING_PREFERENCES_NAMESPACE "viking.globals."
index 3467122cac3089bf0d9d03ff288ed84bca9ec320..e984e649a5a5f4dfb2704459399fd6633a7ba6f3 100644 (file)
@@ -452,12 +452,6 @@ GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, VikTrack *tr, gpoin
   return eventbox;
 }
 
-#define METRIC 1
-#ifdef METRIC 
-#define MTOK(v) ( (v)*3.6) /* m/s to km/h */
-#else
-#define MTOK(v) ( (v)*3600.0/1000.0 * 0.6214) /* m/s to mph - we'll handle this globally eventually but for now ...*/
-#endif
 
 GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr, gpointer vlp, PropWidgets *widgets)
 {
@@ -482,10 +476,6 @@ GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr, gpoint
   pix = gdk_pixmap_new( window->window, PROFILE_WIDTH + MARGIN, PROFILE_HEIGHT, -1 );
   image = gtk_image_new_from_pixmap ( pix, NULL );
 
-  for (i=0; i<PROFILE_WIDTH; i++) {
-    speeds[i] = MTOK(speeds[i]);
-  }
-
   minmax_alt(speeds, &mins, &maxs);
   if (mins < 0.0)
     mins = 0; /* splines sometimes give negative speeds */
@@ -532,11 +522,22 @@ GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr, gpoint
     pfd = pango_font_description_from_string (LABEL_FONT);
     pango_layout_set_font_description (pl, pfd);
     pango_font_description_free (pfd);
-#ifdef METRIC 
-    sprintf(s, "%5dkm/h", (int)(mins + (LINES-i)*(maxs-mins)/LINES));
-#else
-    sprintf(s, "%8dmph", (int)(mins + (LINES-i)*(maxs-mins)/LINES));
-#endif
+    vik_units_speed_t speed_units = a_vik_get_units_speed ();
+    switch (speed_units) {
+    case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR:
+      sprintf(s, "%8dkm/h", (int)((mins + (LINES-i)*(maxs-mins)/LINES)*3.6));
+      break;
+    case VIK_UNITS_SPEED_MILES_PER_HOUR:
+      sprintf(s, "%8dmph", (int)((mins + (LINES-i)*(maxs-mins)/LINES)*2.23693629));
+      break;
+    case VIK_UNITS_SPEED_METRES_PER_SECOND:
+      sprintf(s, "%8dm/s", (int)(mins + (LINES-i)*(maxs-mins)/LINES));
+      break;
+    default:
+      sprintf(s, "--");
+      g_critical("Houston, we've had a problem. speed=%d", speed_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, 
@@ -570,7 +571,7 @@ GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr, gpoint
     if (isnan(gps_speed))
         continue;
     int x = MARGIN + PROFILE_WIDTH * (VIK_TRACKPOINT(iter->data)->timestamp - beg_time) / dur;
-    int y = PROFILE_HEIGHT - PROFILE_HEIGHT*(MTOK(gps_speed) - mins)/(maxs - mins);
+    int y = PROFILE_HEIGHT - PROFILE_HEIGHT*(gps_speed - mins)/(maxs - mins);
     gdk_draw_rectangle(GDK_DRAWABLE(pix), gps_speed_gc, TRUE, x-2, y-2, 4, 4);
   }
 
@@ -807,18 +808,47 @@ void vik_trw_layer_propwin_run ( GtkWindow *parent, VikTrwLayer *vtl, VikTrack *
   g_snprintf(tmp_buf, sizeof(tmp_buf), "%lu", vik_track_get_dup_point_count(tr) );
   widgets->w_duptp_count = content[cnt++] = gtk_label_new ( tmp_buf );
 
+  vik_units_speed_t speed_units = a_vik_get_units_speed ();
   tmp_speed = vik_track_get_max_speed(tr);
   if ( tmp_speed == 0 )
     g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data"));
-  else
-    g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s   (%.0f km/h)", tmp_speed, MTOK(tmp_speed) );
+  else {
+    switch (speed_units) {
+    case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR:
+      g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km/h", tmp_speed*3.6 );
+      break;
+    case VIK_UNITS_SPEED_MILES_PER_HOUR:
+      g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f mph", tmp_speed*2.23693629 );
+      break;
+    case VIK_UNITS_SPEED_METRES_PER_SECOND:
+      g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed );
+      break;
+    default:
+      g_snprintf (tmp_buf, sizeof(tmp_buf), "--" );
+      g_critical("Houston, we've had a problem. speed=%d", speed_units);
+    }
+  }
   widgets->w_max_speed = content[cnt++] = gtk_label_new ( tmp_buf );
 
   tmp_speed = vik_track_get_average_speed(tr);
   if ( tmp_speed == 0 )
     g_snprintf(tmp_buf, sizeof(tmp_buf), _("No Data"));
-  else
-    g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s   (%.0f km/h)", tmp_speed, MTOK(tmp_speed) );
+  else {
+    switch (speed_units) {
+    case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR:
+      g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km/h", tmp_speed*3.6 );
+      break;
+    case VIK_UNITS_SPEED_MILES_PER_HOUR:
+      g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f mph", tmp_speed* 2.23693629 );
+      break;
+    case VIK_UNITS_SPEED_METRES_PER_SECOND:
+      g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed );
+      break;
+    default:
+      g_snprintf (tmp_buf, sizeof(tmp_buf), "--" );
+      g_critical("Houston, we've had a problem. speed=%d", speed_units);
+    }
+  }
   widgets->w_avg_speed = content[cnt++] = gtk_label_new ( tmp_buf );
 
   switch (dist_units) {
index 635beb366c5a46815bb2b6e76dcd03307369b63a..e96df10df5a6b1f588212ed7a8135c1d286b9bd3 100644 (file)
@@ -294,7 +294,21 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr
         gtk_label_set_text ( tpwin->diff_speed, "--" );
       else
       {
-        g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / ABS(tp->timestamp - tpwin->cur_tp->timestamp) );
+       vik_units_speed_t speed_units = a_vik_get_units_speed ();
+       switch (speed_units) {
+       case VIK_UNITS_SPEED_KILOMETRES_PER_HOUR:
+         g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f km/h", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp)) * 3.6 );
+         break;
+       case VIK_UNITS_SPEED_MILES_PER_HOUR:
+         g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp)) * 2.23693629 );
+         break;
+       case VIK_UNITS_SPEED_METRES_PER_SECOND:
+         g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / ABS(tp->timestamp - tpwin->cur_tp->timestamp) );
+         break;
+       default:
+         g_snprintf ( tmp_str, sizeof(tmp_str), "--" );
+         g_critical("Houston, we've had a problem. speed=%d", speed_units);
+       }
         gtk_label_set_text ( tpwin->diff_speed, tmp_str );
       }
     }