tt->length = tt->length + vik_track_get_length (tr);
// Ensure times are available
- if ( tr->trackpoints &&
- vik_track_get_tp_first(tr)->has_timestamp &&
- vik_track_get_tp_last(tr)->has_timestamp ) {
+ if ( tr->trackpoints && vik_track_get_tp_first(tr)->has_timestamp ) {
+ // Get trkpt only once - as using vik_track_get_tp_last() iterates whole track each time
+ VikTrackpoint *trkpt_last = vik_track_get_tp_last(tr);
+ if ( trkpt_last->has_timestamp ) {
+ time_t t1, t2;
+ t1 = vik_track_get_tp_first(tr)->timestamp;
+ t2 = trkpt_last->timestamp;
- time_t t1, t2;
- t1 = vik_track_get_tp_first(tr)->timestamp;
- t2 = vik_track_get_tp_last(tr)->timestamp;
+ // Assume never actually have a track with a time of 0 (1st Jan 1970)
+ // Hence initialize to the first 'proper' value
+ if ( tt->start_time == 0 )
+ tt->start_time = t1;
+ if ( tt->end_time == 0 )
+ tt->end_time = t2;
- // Assume never actually have a track with a time of 0 (1st Jan 1970)
- // Hence initialize to the first 'proper' value
- if ( tt->start_time == 0 )
- tt->start_time = t1;
- if ( tt->end_time == 0 )
- tt->end_time = t2;
+ // Update find the earliest / last times
+ if ( t1 < tt->start_time )
+ tt->start_time = t1;
+ if ( t2 > tt->end_time )
+ tt->end_time = t2;
- // Update find the earliest / last times
- if ( t1 < tt->start_time )
- tt->start_time = t1;
- if ( t2 > tt->end_time )
- tt->end_time = t2;
-
- // Keep track of total time
- // there maybe gaps within a track (eg segments)
- // but this should be generally good enough for a simple indicator
- tt->duration = tt->duration + (int)(t2-t1);
+ // Keep track of total time
+ // there maybe gaps within a track (eg segments)
+ // but this should be generally good enough for a simple indicator
+ tt->duration = tt->duration + (int)(t2-t1);
+ }
}
}
if ( tr->trackpoints && vik_track_get_tp_first(tr)->has_timestamp ) {
// %x The preferred date representation for the current locale without the time.
strftime (time_buf1, sizeof(time_buf1), "%x: ", gmtime(&(vik_track_get_tp_first(tr)->timestamp)));
- if ( vik_track_get_tp_last(tr)->has_timestamp ) {
- gint dur = ( (vik_track_get_tp_last(tr)->timestamp) - (vik_track_get_tp_first(tr)->timestamp) );
- if ( dur > 0 )
- g_snprintf ( time_buf2, sizeof(time_buf2), _("- %d:%02d hrs:mins"), (int)round(dur/3600), (int)round((dur/60)%60) );
- }
+ time_t dur = vik_track_get_duration ( tr );
+ if ( dur > 0 )
+ g_snprintf ( time_buf2, sizeof(time_buf2), _("- %d:%02d hrs:mins"), (int)round(dur/3600), (int)round((dur/60)%60) );
}
// Get length and consider the appropriate distance units
gdouble tr_len = vik_track_get_length(tr);
*(user_data->result) = g_list_prepend(*(user_data->result), key);
}
-/* called for each key in track hash table. if original track user_data[1] is close enough
- * to the passed one, add it to list in user_data[0]
+/**
+ * find_nearby_tracks_by_time:
+ *
+ * Called for each track in track hash table.
+ * If the original track (in user_data[1]) is close enough (threshold period in user_data[2])
+ * to the current track, then the current track is added to the list in user_data[0]
*/
static void find_nearby_tracks_by_time (gpointer key, gpointer value, gpointer user_data)
{
- time_t t1, t2;
- VikTrackpoint *p1, *p2;
VikTrack *trk = VIK_TRACK(value);
GList **nearby_tracks = ((gpointer *)user_data)[0];
+ VikTrack *orig_trk = VIK_TRACK(((gpointer *)user_data)[1]);
+
+ if ( !orig_trk || !orig_trk->trackpoints )
+ return;
/* outline:
* detect reasons for not merging, and return
return;
}
- t1 = vik_track_get_tp_first(trk)->timestamp;
- t2 = vik_track_get_tp_last(trk)->timestamp;
+ time_t t1 = vik_track_get_tp_first(orig_trk)->timestamp;
+ time_t t2 = vik_track_get_tp_last(orig_trk)->timestamp;
if (trk->trackpoints) {
- p1 = vik_track_get_tp_first(trk);
- p2 = vik_track_get_tp_last(trk);
+
+ VikTrackpoint *p1 = vik_track_get_tp_first(trk);
+ VikTrackpoint *p2 = vik_track_get_tp_last(trk);
if (!p1->has_timestamp || !p2->has_timestamp) {
//g_print("no timestamp\n");
}
params[0] = &nearby_tracks;
- params[1] = (gpointer)trps;
+ params[1] = orig_trk;
params[2] = GUINT_TO_POINTER (threshold_in_minutes*60); // In seconds
/* get a list of adjacent-in-time tracks */
VikWaypoint *wp = g_hash_table_lookup ( vtl->waypoints, values[MA_SUBLAYER_ID] );
if ( !wp )
return;
- if ( !strncmp(wp->comment, "http", 4) ) {
+ if ( wp->url ) {
+ open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), wp->url);
+ } else if ( !strncmp(wp->comment, "http", 4) ) {
open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), wp->comment);
} else if ( !strncmp(wp->description, "http", 4) ) {
open_url(VIK_GTK_WINDOW_FROM_LAYER(VIK_LAYER(vtl)), wp->description);
if ( wp )
{
- if ( ( wp->comment && !strncmp(wp->comment, "http", 4) ) ||
+ if ( wp->url ||
+ ( wp->comment && !strncmp(wp->comment, "http", 4) ) ||
( wp->description && !strncmp(wp->description, "http", 4) )) {
item = gtk_image_menu_item_new_with_mnemonic ( _("Visit _Webpage") );
gtk_image_menu_item_set_image ( (GtkImageMenuItem*)item, gtk_image_new_from_stock (GTK_STOCK_NETWORK, GTK_ICON_SIZE_MENU) );