]> git.street.me.uk Git - andy/viking.git/commitdiff
Allow setting timestamps on trackpoints and waypoints that previously had none.
authorRob Norris <rw_norris@hotmail.com>
Thu, 24 Apr 2014 21:25:44 +0000 (22:25 +0100)
committerRob Norris <rw_norris@hotmail.com>
Fri, 25 Apr 2014 22:42:23 +0000 (23:42 +0100)
src/dialog.c
src/viktrwlayer.c
src/viktrwlayer_tpwin.c
src/viktrwlayer_tpwin.h

index ca6bcdb16c64fd532ec19af3b8a3c8aad310ddb5..c5f506642f223bf8551f72898e2f6463436d58c9 100644 (file)
@@ -206,6 +206,10 @@ static void time_edit_click ( GtkWidget *widget, VikWaypoint *wp )
   // Otherwise use new value in the edit buffer
   edit_wp->timestamp = mytime;
 
+  // Clear the previous 'Add' image as now a time is set
+  if ( gtk_button_get_image ( GTK_BUTTON(widget) ) )
+    gtk_button_set_image ( GTK_BUTTON(widget), NULL );
+
   update_time ( widget, edit_wp->timestamp );
 }
 
@@ -375,25 +379,34 @@ gchar *a_dialog_waypoint ( GtkWindow *parent, gchar *default_name, VikTrwLayer *
     }
   }
 
+  timelabel = gtk_label_new ( _("Time:") );
+  timevaluebutton = gtk_button_new();
+  gtk_button_set_relief ( GTK_BUTTON(timevaluebutton), GTK_RELIEF_NONE );
 
   if ( !edit_wp )
     edit_wp = vik_waypoint_new ();
+
+  // TODO: Consider if there should be a remove time button...
+
   if ( !is_new && wp->has_timestamp ) {
-    timelabel = gtk_label_new ( _("Time:") );
-    timevaluebutton = gtk_button_new();
-    gtk_button_set_relief ( GTK_BUTTON(timevaluebutton), GTK_RELIEF_NONE );
     update_time ( timevaluebutton, wp->timestamp );
-    g_signal_connect ( G_OBJECT(timevaluebutton), "clicked", G_CALLBACK(time_edit_click), edit_wp );
   }
+  else {
+    GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU );
+    gtk_button_set_image ( GTK_BUTTON(timevaluebutton), img );
+    // Initially use current time or otherwise whatever the last value used was
+    if ( edit_wp->timestamp == 0 ) {
+      time ( &edit_wp->timestamp );
+    }
+  }
+  g_signal_connect ( G_OBJECT(timevaluebutton), "clicked", G_CALLBACK(time_edit_click), edit_wp );
 
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), latlabel, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), latentry, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lonlabel, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), lonentry, FALSE, FALSE, 0);
-  if ( timelabel ) {
-    gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), timelabel, FALSE, FALSE, 0);
-    gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), timevaluebutton, FALSE, FALSE, 0);
-  }
+  gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), timelabel, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), timevaluebutton, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), altlabel, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), altentry, FALSE, FALSE, 0);
   gtk_box_pack_start (GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), commentlabel, FALSE, FALSE, 0);
index e647d887dc8cec4e83e16bbd722529292f7bfb20..fd616fd190d1bda28e61c92c1982ff212b094ad5 100644 (file)
@@ -8507,7 +8507,7 @@ static void trw_layer_tpwin_response ( VikTrwLayer *vtl, gint response )
   if ( response == VIK_TRW_LAYER_TPWIN_SPLIT && vtl->current_tpl->next && vtl->current_tpl->prev )
   {
     trw_layer_split_at_selected_trackpoint ( vtl, vtl->current_tp_track->is_route ? VIK_TRW_LAYER_SUBLAYER_ROUTE : VIK_TRW_LAYER_SUBLAYER_TRACK );
-    vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+    vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
   }
   else if ( response == VIK_TRW_LAYER_TPWIN_DELETE )
   {
@@ -8521,20 +8521,20 @@ static void trw_layer_tpwin_response ( VikTrwLayer *vtl, gint response )
 
     if ( vtl->current_tpl )
       // Reset dialog with the available adjacent trackpoint
-      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
 
     vik_layer_emit_update(VIK_LAYER(vtl));
   }
   else if ( response == VIK_TRW_LAYER_TPWIN_FORWARD && vtl->current_tpl->next )
   {
     if ( vtl->current_tp_track )
-      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl = vtl->current_tpl->next, vtl->current_tp_track->name );
+      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl = vtl->current_tpl->next, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
     vik_layer_emit_update(VIK_LAYER(vtl)); /* TODO longone: either move or only update if tp is inside drawing window */
   }
   else if ( response == VIK_TRW_LAYER_TPWIN_BACK && vtl->current_tpl->prev )
   {
     if ( vtl->current_tp_track )
-      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl = vtl->current_tpl->prev, vtl->current_tp_track->name );
+      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl = vtl->current_tpl->prev, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
     vik_layer_emit_update(VIK_LAYER(vtl));
   }
   else if ( response == VIK_TRW_LAYER_TPWIN_INSERT && vtl->current_tpl->next )
@@ -8661,7 +8661,7 @@ static void trw_layer_tpwin_init ( VikTrwLayer *vtl )
 
   if ( vtl->current_tpl )
     if ( vtl->current_tp_track )
-      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
   /* set layer name and TP data */
 }
 
@@ -8869,7 +8869,7 @@ static gboolean trw_layer_select_release ( VikTrwLayer *vtl, GdkEventButton *eve
 
         if ( vtl->tpwin )
           if ( vtl->current_tp_track )
-            vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+            vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
         // NB don't reset the selected trackpoint, thus ensuring it's still in the tpwin
       }
     }
@@ -8984,7 +8984,7 @@ static gboolean trw_layer_select_click ( VikTrwLayer *vtl, GdkEventButton *event
       set_statusbar_msg_info_trkpt ( vtl, tp_params.closest_tp );
 
       if ( vtl->tpwin )
-       vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+        vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
 
       vik_layer_emit_update ( VIK_LAYER(vtl) );
       return TRUE;
@@ -9019,7 +9019,7 @@ static gboolean trw_layer_select_click ( VikTrwLayer *vtl, GdkEventButton *event
       set_statusbar_msg_info_trkpt ( vtl, tp_params.closest_tp );
 
       if ( vtl->tpwin )
-       vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+        vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
 
       vik_layer_emit_update ( VIK_LAYER(vtl) );
       return TRUE;
@@ -9928,7 +9928,7 @@ static gboolean tool_edit_trackpoint_release ( VikTrwLayer *vtl, GdkEventButton
 
     /* diff dist is diff from orig */
     if ( vtl->tpwin )
-      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name );
+      vik_trw_layer_tpwin_set_tp ( vtl->tpwin, vtl->current_tpl, vtl->current_tp_track->name, vtl->current_tp_track->is_route );
 
     vik_layer_emit_update ( VIK_LAYER(vtl) );
     return TRUE;
index 45d2359117ae605da992ef9c9220d6a2b6814615..8cf4a9703d021f97882d2290b175d07ff2c115cf 100644 (file)
@@ -147,6 +147,8 @@ static void tpwin_sync_ts_to_tp ( VikTrwLayerTpwin *tpwin )
   }
 }
 
+static time_t last_edit_time = 0;
+
 /**
  * tpwin_sync_time_to_tp:
  *
@@ -155,15 +157,17 @@ static void tpwin_sync_time_to_tp ( VikTrwLayerTpwin *tpwin )
 {
   if ( !tpwin->cur_tp || tpwin->sync_to_tp_block )
     return;
-  // Currently disable setting the time via this way when the point doesn't have one
-  if ( !tpwin->cur_tp->has_timestamp )
-    return;
+
+  if ( tpwin->cur_tp->has_timestamp )
+    last_edit_time = tpwin->cur_tp->timestamp;
+  else if ( last_edit_time == 0 )
+    time ( &last_edit_time );
 
   GTimeZone *gtz = g_time_zone_new_local ();
-  guint mytime = vik_datetime_edit_dialog ( GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(&tpwin->parent))),
-                                            _("Date/Time Edit"),
-                                            tpwin->cur_tp->timestamp,
-                                            gtz );
+  time_t mytime = vik_datetime_edit_dialog ( GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(&tpwin->parent))),
+                                             _("Date/Time Edit"),
+                                             last_edit_time,
+                                             gtz );
   g_time_zone_unref ( gtz );
 
   // Was the dialog cancelled?
@@ -172,8 +176,13 @@ static void tpwin_sync_time_to_tp ( VikTrwLayerTpwin *tpwin )
 
   // Otherwise use the new value
   tpwin->cur_tp->timestamp = mytime;
+  tpwin->cur_tp->has_timestamp = TRUE;
   // TODO: consider warning about unsorted times?
 
+  // Clear the previous 'Add' image as now a time is set
+  if ( gtk_button_get_image ( GTK_BUTTON(tpwin->localtime) ) )
+    gtk_button_set_image ( GTK_BUTTON(tpwin->localtime), NULL );
+
   tpwin_update_times ( tpwin, tpwin->cur_tp );
 }
 
@@ -343,7 +352,17 @@ void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin )
   gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") );
 }
 
-void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name )
+/**
+ * vik_trw_layer_tpwin_set_tp:
+ * @tpwin:      The Trackpoint Edit Window
+ * @tpl:        The #Glist of trackpoints pointing at the current trackpoint
+ * @track_name: The name of the track in which the trackpoint belongs
+ * @is_route:   Is the track of the trackpoint actually a route?
+ *
+ * Sets the Trackpoint Edit Window to the values of the current trackpoint given in @tpl.
+ *
+ */
+void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name, gboolean is_route )
 {
   static char tmp_str[64];
   static struct LatLon ll;
@@ -370,6 +389,13 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gch
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), TRUE );
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), tp->has_timestamp );
   gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->localtime), tp->has_timestamp );
+  // Enable adding timestamps - but not on routepoints
+  if ( !tp->has_timestamp && !is_route ) {
+    gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->localtime), TRUE );
+    GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU );
+    gtk_button_set_image ( GTK_BUTTON(tpwin->localtime), img );
+  }
+  else
 
   vik_trw_layer_tpwin_set_track_name ( tpwin, track_name );
 
index 7812c9760542f956717a433a5946dfc74ea11ebd..67251a3f5acc61b2b8455688cf1842298fea4674 100644 (file)
@@ -57,7 +57,7 @@ GType vik_trw_layer_tpwin_get_type ();
 VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent );
 void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin );
 void vik_trw_layer_tpwin_disable_join ( VikTrwLayerTpwin *tpwin );
-void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name );
+void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, const gchar *track_name, gboolean is_route );
 void vik_trw_layer_tpwin_set_track_name ( VikTrwLayerTpwin *tpwin, const gchar *track_name );
 
 G_END_DECLS