]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktrwlayer_tpwin.c
Decide the 'feature' type is more useful than seeing the country code.
[andy/viking.git] / src / viktrwlayer_tpwin.c
index 9ccfdc3cd20d136cb83d477492eff7ea77ef91f7..32c76221c06f740dea3f262c4be60d5dfa823ef6 100644 (file)
 #include "viktrwlayer_tpwin.h"
 #include "vikwaypoint.h"
 #include "dialog.h"
-
-#define SET_BUTTON_SENSITIVE(tpwin,num,sens) gtk_widget_set_sensitive ( GTK_WIDGET(g_list_nth_data((tpwin->buttons),(num))), (sens));
+#include "globals.h"
 
 struct _VikTrwLayerTpwin {
   GtkDialog parent;
   GtkSpinButton *lat, *lon, *alt;
   GtkLabel *track_name, *ts, *localtime, *diff_dist, *diff_time, *diff_speed, *hdop, *vdop, *pdop, *sat;
-  GList *buttons;
+  // Previously these buttons were in a glist, however I think the ordering behaviour is implicit
+  //  thus control manually to ensure operating on the correct button
+  GtkWidget *button_close;
+  GtkWidget *button_delete;
+  GtkWidget *button_insert;
+  GtkWidget *button_split;
+  GtkWidget *button_back;
+  GtkWidget *button_forward;
   VikTrackpoint *cur_tp;
-  gboolean cur_tp_is_endpoint; /* for join */
-
   gboolean sync_to_tp_block;
 };
 
@@ -92,8 +96,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 = VIK_FEET_TO_METERS(gtk_spin_button_get_value ( tpwin->alt ));
+      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 )
@@ -121,15 +138,24 @@ VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent )
   gtk_window_set_transient_for ( GTK_WINDOW(tpwin), parent );
   gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") );
 
+  tpwin->button_close = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_CLOSE, VIK_TRW_LAYER_TPWIN_CLOSE);
+  tpwin->button_insert = gtk_dialog_add_button ( GTK_DIALOG(tpwin), _("_Insert After"), VIK_TRW_LAYER_TPWIN_INSERT);
+  tpwin->button_delete = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_DELETE, VIK_TRW_LAYER_TPWIN_DELETE);
+  tpwin->button_split = gtk_dialog_add_button ( GTK_DIALOG(tpwin), _("Split Here"), VIK_TRW_LAYER_TPWIN_SPLIT);
+  tpwin->button_back = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_GO_BACK, VIK_TRW_LAYER_TPWIN_BACK);
+  tpwin->button_forward = gtk_dialog_add_button ( GTK_DIALOG(tpwin), GTK_STOCK_GO_FORWARD, VIK_TRW_LAYER_TPWIN_FORWARD);
+
+  /*
   gtk_dialog_add_buttons ( GTK_DIALOG(tpwin),
       GTK_STOCK_CLOSE, VIK_TRW_LAYER_TPWIN_CLOSE,
+      _("_Insert After"), VIK_TRW_LAYER_TPWIN_INSERT,
       GTK_STOCK_DELETE, VIK_TRW_LAYER_TPWIN_DELETE,
       _("Split Here"), VIK_TRW_LAYER_TPWIN_SPLIT,
-      _("Join With Last"), VIK_TRW_LAYER_TPWIN_JOIN,
       GTK_STOCK_GO_BACK, VIK_TRW_LAYER_TPWIN_BACK,
       GTK_STOCK_GO_FORWARD, VIK_TRW_LAYER_TPWIN_FORWARD,
       NULL );
   tpwin->buttons = gtk_container_get_children(GTK_CONTAINER(GTK_DIALOG(tpwin)->action_area));
+  */
 
   /* main track info */
   left_vbox = a_dialog_create_label_vbox ( left_label_texts, sizeof(left_label_texts) / sizeof(left_label_texts[0]) );
@@ -151,13 +177,13 @@ VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent )
 
   g_signal_connect_swapped ( G_OBJECT(tpwin->alt), "value-changed", G_CALLBACK(tpwin_sync_alt_to_tp), tpwin );
 
-  right_vbox = gtk_vbox_new( TRUE, 3 );
-  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->track_name), FALSE, TRUE, 0 );
-  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lat), FALSE, TRUE, 0 );
-  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lon), FALSE, TRUE, 0 );
-  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->alt), FALSE, TRUE, 0 );
-  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->ts), FALSE, TRUE, 5 );
-  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->localtime), FALSE, TRUE, 5 );
+  right_vbox = gtk_vbox_new ( FALSE, 3 );
+  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->track_name), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lat), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lon), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->alt), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->ts), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->localtime), FALSE, FALSE, 5 );
 
   /* diff info */
   diff_left_vbox = a_dialog_create_label_vbox ( right_label_texts, sizeof(right_label_texts) / sizeof(right_label_texts[0]) );
@@ -171,17 +197,17 @@ VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent )
   tpwin->pdop = GTK_LABEL(gtk_label_new(NULL));
   tpwin->sat = GTK_LABEL(gtk_label_new(NULL));
 
-  diff_right_vbox = gtk_vbox_new ( TRUE, 3 );
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_dist), FALSE, TRUE, 5 );
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_time), FALSE, TRUE, 5 );
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_speed), FALSE, TRUE, 5 );
+  diff_right_vbox = gtk_vbox_new ( FALSE, 3 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_dist), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_time), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_speed), FALSE, FALSE, 5 );
 
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->vdop), FALSE, TRUE, 5 );
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->hdop), FALSE, TRUE, 5 );
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->pdop), FALSE, TRUE, 5 );
-  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->sat), FALSE, TRUE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->vdop), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->hdop), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->pdop), FALSE, FALSE, 5 );
+  gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->sat), FALSE, FALSE, 5 );
 
-  main_hbox = gtk_hbox_new( TRUE, 0 );
+  main_hbox = gtk_hbox_new( FALSE, 0 );
   gtk_box_pack_start ( GTK_BOX(main_hbox), left_vbox, TRUE, TRUE, 0 );
   gtk_box_pack_start ( GTK_BOX(main_hbox), right_vbox, TRUE, TRUE, 0 );
   gtk_box_pack_start ( GTK_BOX(main_hbox), diff_left_vbox, TRUE, TRUE, 0 );
@@ -204,11 +230,13 @@ void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin )
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), FALSE );
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), FALSE );
 
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_SPLIT, FALSE );
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_DELETE, FALSE );
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_FORWARD, FALSE );
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_BACK, FALSE );
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_JOIN, FALSE );
+  // Only keep close button enabled
+  gtk_widget_set_sensitive ( tpwin->button_insert, FALSE );
+  gtk_widget_set_sensitive ( tpwin->button_split, FALSE );
+  gtk_widget_set_sensitive ( tpwin->button_delete, FALSE );
+  gtk_widget_set_sensitive ( tpwin->button_back, FALSE );
+  gtk_widget_set_sensitive ( tpwin->button_forward, FALSE );
+
   gtk_label_set_text ( tpwin->diff_dist, NULL );
   gtk_label_set_text ( tpwin->diff_time, NULL );
   gtk_label_set_text ( tpwin->diff_speed, NULL );
@@ -216,12 +244,6 @@ void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin )
   gtk_label_set_text ( tpwin->hdop, NULL );
   gtk_label_set_text ( tpwin->pdop, NULL );
   gtk_label_set_text ( tpwin->sat, NULL );
-  tpwin->cur_tp = NULL;
-}
-
-void vik_trw_layer_tpwin_disable_join ( VikTrwLayerTpwin *tpwin )
-{
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_JOIN, FALSE );
 }
 
 void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *track_name )
@@ -230,19 +252,19 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr
   static struct LatLon ll;
   VikTrackpoint *tp = VIK_TRACKPOINT(tpl->data);
 
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_DELETE, TRUE );
+  /* Only can insert if not at the end (otherwise use extend track) */
+  gtk_widget_set_sensitive ( tpwin->button_insert, (gboolean) GPOINTER_TO_INT (tpl->next) );
+  gtk_widget_set_sensitive ( tpwin->button_delete, TRUE );
 
   /* We can only split up a track if it's not an endpoint. Makes sense to me. */
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_SPLIT, tpl->next && tpl->prev );
-
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_FORWARD, (gboolean) GPOINTER_TO_INT (tpl->next) );
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_BACK, (gboolean) GPOINTER_TO_INT (tpl->prev) );
+  gtk_widget_set_sensitive ( tpwin->button_split, tpl->next && tpl->prev );
 
-  /* we can only join tracks if there was a last tp, the last tp was an endpoint, _AND_ this tp is an endpoint */
-  SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_JOIN, tpwin->cur_tp && tpwin->cur_tp_is_endpoint && (!(tpl->next && tpl->prev)) );
+  gtk_widget_set_sensitive ( tpwin->button_forward, (gboolean) GPOINTER_TO_INT (tpl->next) );
+  gtk_widget_set_sensitive ( tpwin->button_back, (gboolean) GPOINTER_TO_INT (tpl->prev) );
 
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lat), TRUE );
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), TRUE );
+  gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), TRUE );
 
   gtk_label_set_text ( tpwin->track_name, track_name );
 
@@ -251,7 +273,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, VIK_METERS_TO_FEET(tp->altitude) );
+    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. */
 
@@ -270,9 +304,20 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr
     gtk_label_set_text (tpwin->localtime, NULL );
   }
 
+  vik_units_distance_t dist_units = a_vik_get_units_distance ();
   if ( tpwin->cur_tp )
   {
-    g_snprintf ( tmp_str, sizeof(tmp_str), "%.3f m", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)));
+    switch (dist_units) {
+    case VIK_UNITS_DISTANCE_KILOMETRES:
+      g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)));
+      break;
+    case VIK_UNITS_DISTANCE_MILES:
+      g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f yards", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))*1.0936133);
+      break;
+    default:
+      g_critical("Houston, we've had a problem. distance=%d", dist_units);
+    }
+
     gtk_label_set_text ( tpwin->diff_dist, tmp_str );
     if ( tp->has_timestamp && tpwin->cur_tp->has_timestamp )
     {
@@ -282,7 +327,24 @@ 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_MPS_TO_KPH(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) );
+         break;
+       case VIK_UNITS_SPEED_MILES_PER_HOUR:
+         g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", VIK_MPS_TO_MPH(vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord)) / (ABS(tp->timestamp - tpwin->cur_tp->timestamp))) );
+         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;
+       case VIK_UNITS_SPEED_KNOTS:
+         g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f knots", VIK_MPS_TO_KNOTS(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 );
       }
     }
@@ -293,17 +355,40 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr
     }
   }
 
-  g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->vdop );
+  switch (dist_units) {
+  case VIK_UNITS_DISTANCE_KILOMETRES:
+    g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->hdop );
+    gtk_label_set_text ( tpwin->hdop, tmp_str );
+    g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->pdop );
+    gtk_label_set_text ( tpwin->pdop, tmp_str );
+    break;
+  case VIK_UNITS_DISTANCE_MILES:
+    g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f yards", tp->hdop*1.0936133 );
+    gtk_label_set_text ( tpwin->hdop, tmp_str );
+    g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f yards", tp->pdop*1.0936133 );
+    gtk_label_set_text ( tpwin->pdop, tmp_str );
+    break;
+  default:
+    g_critical("Houston, we've had a problem. distance=%d", dist_units);
+  }
+
+  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", VIK_METERS_TO_FEET(tp->vdop) );
+    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), "%.5f m", tp->hdop );
-  gtk_label_set_text ( tpwin->hdop, tmp_str );
-  g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->pdop );
-  gtk_label_set_text ( tpwin->pdop, tmp_str );
+
   g_snprintf ( tmp_str, sizeof(tmp_str), "%d / %d", tp->nsats, tp->fix_mode );
   gtk_label_set_text ( tpwin->sat, tmp_str );
 
   tpwin->cur_tp = tp;
-  tpwin->cur_tp_is_endpoint = ! (tpl->next && tpl->prev);
 }
 
 void vik_trw_layer_tpwin_set_track_name ( VikTrwLayerTpwin *tpwin, const gchar *track_name )