]> git.street.me.uk Git - andy/viking.git/blobdiff - src/osm-traces.c
SF Features#76: Add ability to handle and name trackpoints.
[andy/viking.git] / src / osm-traces.c
index d1d263451a61e259f10ab71a24493f1d68953516..d4924b6eb8ac1e12bbdae2ba25c6b4bc6e0b1c80 100644 (file)
@@ -46,6 +46,9 @@
 #define VIKING_OSM_TRACES_PARAMS_GROUP_KEY "osm_traces"
 #define VIKING_OSM_TRACES_PARAMS_NAMESPACE "osm_traces."
 
+#define VIK_SETTINGS_OSM_TRACE_VIS "osm_trace_visibility"
+static gint last_active = -1;
+
 /**
  * Login to use for OSM uploading.
  */
@@ -84,6 +87,7 @@ typedef struct _OsmTracesInfo {
   gchar *name;
   gchar *description;
   gchar *tags;
+  gboolean anonymize_times; // ATM only available on a single track.
   const OsmTraceVis_t *vistype;
   VikTrwLayer *vtl;
   VikTrack *trk;
@@ -285,7 +289,15 @@ static void osm_traces_upload_thread ( OsmTracesInfo *oti, gpointer threaddata )
   if (oti->trk != NULL)
   {
     /* Upload only the selected track */
-    a_gpx_write_track_file(oti->trk, file, &options);
+    if ( oti->anonymize_times )
+    {
+      VikTrack *trk = vik_track_copy(oti->trk, TRUE);
+      vik_track_anonymize_times(trk);
+      a_gpx_write_track_file(trk, file, &options);
+      vik_track_free(trk);
+    }
+    else
+      a_gpx_write_track_file(oti->trk, file, &options);
   }
   else
   {
@@ -334,13 +346,8 @@ static void osm_traces_upload_thread ( OsmTracesInfo *oti, gpointer threaddata )
     else {
       msg = g_strdup_printf ( "%s : %s %d (@%s)", _("FAILED TO UPLOAD DATA TO OSM"), _("HTTP response code"), ans, timestr );
     }
-    // From the background so should use the signalling method to update display:
-    // TODO: This only works with statically assigned strings ATM
-    vik_window_signal_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(oti->vtl), msg, VIK_STATUSBAR_INFO );
-    // Thus can't free the memory yet...
-    // Luckily OSM traces isn't heavily used so this is not a significant memory leak
-    //g_free (msg);
-    // But this is better than potentially crashing from multi thread GUI updates
+    vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(oti->vtl), msg, VIK_STATUSBAR_INFO );
+    g_free (msg);
   }
   /* Removing temporary file */
   ret = g_unlink(filename);
@@ -400,6 +407,7 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk )
   GtkWidget *description_label, *description_entry;
   GtkWidget *tags_label, *tags_entry;
   GtkWidget *visibility;
+  GtkWidget *anonymize_checkbutton = NULL;
   const OsmTraceVis_t *vis_t;
 
   user_label = gtk_label_new(_("Email:"));
@@ -441,6 +449,16 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk )
   gtk_widget_set_tooltip_text(GTK_WIDGET(description_entry),
                         _("The description of the trace"));
 
+  if (trk != NULL) {
+    GtkWidget *label = gtk_label_new(_("Anonymize Times:"));
+    anonymize_checkbutton = gtk_check_button_new ();
+    gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), label, FALSE, FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), anonymize_checkbutton, FALSE, FALSE, 0);
+    gtk_widget_set_tooltip_text(GTK_WIDGET(anonymize_checkbutton),
+                                _("Anonymize times of the trace.\n"
+                                  "<small>You may choose to make the trace identifiable, yet mask the actual real time values</small>"));
+  }
+
   tags_label = gtk_label_new(_("Tags:"));
   tags_entry = gtk_entry_new();
   gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), tags_label, FALSE, FALSE, 0);
@@ -452,8 +470,28 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk )
   for (vis_t = OsmTraceVis; vis_t->combostr != NULL; vis_t++)
     vik_combo_box_text_append (visibility, vis_t->combostr);
 
-  /* Set identifiable by default */
-  gtk_combo_box_set_active(GTK_COMBO_BOX(visibility), 0);
+  // Set identifiable by default or use the settings for the value
+  if ( last_active < 0 ) {
+    gint find_entry = -1;
+    gint wanted_entry = -1;
+    gchar *vis = NULL;
+    if ( a_settings_get_string ( VIK_SETTINGS_OSM_TRACE_VIS, &vis ) ) {
+      // Use setting
+      if ( vis ) {
+        for (vis_t = OsmTraceVis; vis_t->apistr != NULL; vis_t++) {
+          find_entry++;
+          if (!strcmp(vis, vis_t->apistr)) {
+            wanted_entry = find_entry;
+          }
+        }
+      }
+      // If not found set it to the first entry, otherwise use the entry
+      last_active = ( wanted_entry < 0 ) ? 0 : wanted_entry;
+    }
+    else
+      last_active = 0;
+  }
+  gtk_combo_box_set_active(GTK_COMBO_BOX(visibility), last_active);
   gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dia))), GTK_WIDGET(visibility), FALSE, FALSE, 0);
 
   /* User should think about it first... */
@@ -479,6 +517,14 @@ static void osm_traces_upload_viktrwlayer ( VikTrwLayer *vtl, VikTrack *trk )
     info->vistype     = &OsmTraceVis[gtk_combo_box_get_active(GTK_COMBO_BOX(visibility))];
     info->vtl         = VIK_TRW_LAYER(g_object_ref(vtl));
     info->trk         = trk;
+    if (trk != NULL && anonymize_checkbutton != NULL )
+      info->anonymize_times = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(anonymize_checkbutton));
+    else
+      info->anonymize_times = FALSE;
+
+    // Save visibility value for default reuse
+    last_active = gtk_combo_box_get_active(GTK_COMBO_BOX(visibility));
+    a_settings_set_string ( VIK_SETTINGS_OSM_TRACE_VIS, OsmTraceVis[last_active].apistr );
 
     title = g_strdup_printf(_("Uploading %s to OSM"), info->name);