X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/1dd6d6d32cc924fdcd8e265631b6f0503595ad52..e06d3901b3cb4f2ff2c4001a174577421f6e25c2:/src/viktrwlayer_tpwin.c diff --git a/src/viktrwlayer_tpwin.c b/src/viktrwlayer_tpwin.c index 88365b11..22c84903 100644 --- a/src/viktrwlayer_tpwin.c +++ b/src/viktrwlayer_tpwin.c @@ -26,25 +26,33 @@ #include #include #include +#include #include "coords.h" #include "vikcoord.h" #include "viktrack.h" #include "viktrwlayer_tpwin.h" #include "vikwaypoint.h" +#include "vikutils.h" #include "dialog.h" #include "globals.h" - -#define SET_BUTTON_SENSITIVE(tpwin,num,sens) gtk_widget_set_sensitive ( GTK_WIDGET(g_list_nth_data((tpwin->buttons),(num))), (sens)); +#include "vikdatetime_edit_dialog.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; + GtkSpinButton *lat, *lon, *alt, *ts; + GtkWidget *trkpt_name; + GtkWidget *time; + GtkLabel *course, *diff_dist, *diff_time, *diff_speed, *speed, *hdop, *vdop, *pdop, *sat; + // 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; }; @@ -72,6 +80,23 @@ GType vik_trw_layer_tpwin_get_type (void) return tpwin_type; } +/** + * Just update the display for the time fields + */ +static void tpwin_update_times ( VikTrwLayerTpwin *tpwin, VikTrackpoint *tp ) +{ + if ( tp->has_timestamp ) { + gtk_spin_button_set_value ( tpwin->ts, tp->timestamp ); + gchar *msg = vu_get_time_string ( &(tp->timestamp), "%c", &(tp->coord), NULL ); + gtk_button_set_label ( GTK_BUTTON(tpwin->time), msg ); + g_free ( msg ); + } + else { + gtk_spin_button_set_value ( tpwin->ts, 0 ); + gtk_button_set_label ( GTK_BUTTON(tpwin->time), "" ); + } +} + static void tpwin_sync_ll_to_tp ( VikTrwLayerTpwin *tpwin ) { if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) @@ -110,48 +135,119 @@ static void tpwin_sync_alt_to_tp ( VikTrwLayerTpwin *tpwin ) } } +/** + * + */ +static void tpwin_sync_ts_to_tp ( VikTrwLayerTpwin *tpwin ) +{ + if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { + tpwin->cur_tp->timestamp = gtk_spin_button_get_value_as_int ( tpwin->ts ); + + tpwin_update_times ( tpwin, tpwin->cur_tp ); + } +} + +static time_t last_edit_time = 0; + +/** + * tpwin_sync_time_to_tp: + * + */ +static void tpwin_sync_time_to_tp ( VikTrwLayerTpwin *tpwin ) +{ + if ( !tpwin->cur_tp || tpwin->sync_to_tp_block ) + 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 (); + 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? + if ( mytime == 0 ) + return; + + // 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->time) ) ) + gtk_button_set_image ( GTK_BUTTON(tpwin->time), NULL ); + + tpwin_update_times ( tpwin, tpwin->cur_tp ); +} + +static gboolean tpwin_set_name ( VikTrwLayerTpwin *tpwin ) +{ + if ( tpwin->cur_tp && (!tpwin->sync_to_tp_block) ) { + vik_trackpoint_set_name ( tpwin->cur_tp, gtk_entry_get_text(GTK_ENTRY(tpwin->trkpt_name)) ); + } + return FALSE; +} + VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent ) { - static gchar *left_label_texts[] = { N_("Part of Track:"), - N_("Latitude:"), + static gchar *left_label_texts[] = { N_("Name:"), + N_("Latitude:"), N_("Longitude:"), - N_("Altitude:"), - N_("Timestamp:"), - N_("Time:") }; + N_("Altitude:"), + N_("Course:"), + N_("Timestamp:"), + N_("Time:") }; static gchar *right_label_texts[] = { N_("Distance Difference:"), N_("Time Difference:"), - N_("\"Speed\" Between:"), - N_("VDOP:"), - N_("HDOP:"), - N_("PDOP:"), - N_("SAT/FIX:") - }; + N_("\"Speed\" Between:"), + N_("Speed:"), + N_("VDOP:"), + N_("HDOP:"), + N_("PDOP:"), + N_("SAT/FIX:") }; VikTrwLayerTpwin *tpwin = VIK_TRW_LAYER_TPWIN ( g_object_new ( VIK_TRW_LAYER_TPWIN_TYPE, NULL ) ); GtkWidget *main_hbox, *left_vbox, *right_vbox; GtkWidget *diff_left_vbox, *diff_right_vbox; - 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]) ); + left_vbox = a_dialog_create_label_vbox ( left_label_texts, G_N_ELEMENTS(left_label_texts), 1, 3 ); + + tpwin->trkpt_name = gtk_entry_new(); + g_signal_connect_swapped ( G_OBJECT(tpwin->trkpt_name), "focus-out-event", G_CALLBACK(tpwin_set_name), tpwin ); - tpwin->track_name = GTK_LABEL(gtk_label_new(NULL)); - tpwin->ts = GTK_LABEL(gtk_label_new(NULL)); - tpwin->localtime = GTK_LABEL(gtk_label_new(NULL)); + tpwin->course = GTK_LABEL(gtk_label_new(NULL)); + tpwin->time = gtk_button_new(); + gtk_button_set_relief ( GTK_BUTTON(tpwin->time), GTK_RELIEF_NONE ); + g_signal_connect_swapped ( G_OBJECT(tpwin->time), "clicked", G_CALLBACK(tpwin_sync_time_to_tp), tpwin ); tpwin->lat = GTK_SPIN_BUTTON(gtk_spin_button_new( GTK_ADJUSTMENT(gtk_adjustment_new ( 0, -90, 90, 0.00005, 0.01, 0 )), 0.00005, 6)); @@ -166,35 +262,42 @@ 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 ( 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 ); + tpwin->ts = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0,2147483647,1)); //pow(2,31)-1 limit input to ~2038 for now + g_signal_connect_swapped ( G_OBJECT(tpwin->ts), "value-changed", G_CALLBACK(tpwin_sync_ts_to_tp), tpwin ); + gtk_spin_button_set_digits ( tpwin->ts, 0 ); + + right_vbox = gtk_vbox_new ( TRUE, 1 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->trkpt_name), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lat), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->lon), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->alt), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->course), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->ts), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(right_vbox), GTK_WIDGET(tpwin->time), FALSE, FALSE, 3 ); /* diff info */ - diff_left_vbox = a_dialog_create_label_vbox ( right_label_texts, sizeof(right_label_texts) / sizeof(right_label_texts[0]) ); + diff_left_vbox = a_dialog_create_label_vbox ( right_label_texts, G_N_ELEMENTS(right_label_texts), 1, 3 ); tpwin->diff_dist = GTK_LABEL(gtk_label_new(NULL)); tpwin->diff_time = GTK_LABEL(gtk_label_new(NULL)); tpwin->diff_speed = GTK_LABEL(gtk_label_new(NULL)); + tpwin->speed = GTK_LABEL(gtk_label_new(NULL)); tpwin->vdop = GTK_LABEL(gtk_label_new(NULL)); tpwin->hdop = GTK_LABEL(gtk_label_new(NULL)); tpwin->pdop = GTK_LABEL(gtk_label_new(NULL)); tpwin->sat = GTK_LABEL(gtk_label_new(NULL)); - 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 ); + diff_right_vbox = gtk_vbox_new ( TRUE, 1 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_dist), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_time), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->diff_speed), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->speed), FALSE, FALSE, 3 ); - 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 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->vdop), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->hdop), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->pdop), FALSE, FALSE, 3 ); + gtk_box_pack_start ( GTK_BOX(diff_right_vbox), GTK_WIDGET(tpwin->sat), FALSE, FALSE, 3 ); main_hbox = gtk_hbox_new( FALSE, 0 ); gtk_box_pack_start ( GTK_BOX(main_hbox), left_vbox, TRUE, TRUE, 0 ); @@ -202,68 +305,99 @@ VikTrwLayerTpwin *vik_trw_layer_tpwin_new ( GtkWindow *parent ) gtk_box_pack_start ( GTK_BOX(main_hbox), diff_left_vbox, TRUE, TRUE, 0 ); gtk_box_pack_start ( GTK_BOX(main_hbox), diff_right_vbox, TRUE, TRUE, 0 ); - gtk_box_pack_start ( GTK_BOX(GTK_DIALOG(tpwin)->vbox), main_hbox, FALSE, FALSE, 0 ); + gtk_box_pack_start ( GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(tpwin))), main_hbox, FALSE, FALSE, 0 ); tpwin->cur_tp = NULL; + GtkWidget *response_w = NULL; +#if GTK_CHECK_VERSION (2, 20, 0) + response_w = gtk_dialog_get_widget_for_response ( GTK_DIALOG(tpwin), VIK_TRW_LAYER_TPWIN_CLOSE ); +#endif + if ( response_w ) + gtk_widget_grab_focus ( response_w ); + return tpwin; } void vik_trw_layer_tpwin_set_empty ( VikTrwLayerTpwin *tpwin ) { - gtk_label_set_text ( tpwin->track_name, NULL ); - gtk_label_set_text ( tpwin->ts, NULL ); - gtk_label_set_text ( tpwin->localtime, NULL ); + gtk_editable_delete_text ( GTK_EDITABLE(tpwin->trkpt_name), 0, -1 ); + gtk_widget_set_sensitive ( tpwin->trkpt_name, FALSE ); + + gtk_button_set_label ( GTK_BUTTON(tpwin->time), "" ); + gtk_label_set_text ( tpwin->course, NULL ); gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lat), FALSE ); gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->lon), FALSE ); gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->alt), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), FALSE ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), 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 ); - SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_INSERT, 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 ); gtk_label_set_text ( tpwin->diff_dist, NULL ); gtk_label_set_text ( tpwin->diff_time, NULL ); gtk_label_set_text ( tpwin->diff_speed, NULL ); + gtk_label_set_text ( tpwin->speed, NULL ); gtk_label_set_text ( tpwin->vdop, NULL ); gtk_label_set_text ( tpwin->hdop, NULL ); gtk_label_set_text ( tpwin->pdop, NULL ); gtk_label_set_text ( tpwin->sat, NULL ); -} -void vik_trw_layer_tpwin_disable_join ( VikTrwLayerTpwin *tpwin ) -{ - SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_JOIN, FALSE ); + gtk_window_set_title ( GTK_WINDOW(tpwin), _("Trackpoint") ); } -void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, 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[25]; + static char tmp_str[64]; static struct LatLon ll; VikTrackpoint *tp = VIK_TRACKPOINT(tpl->data); - /* Only can insert if not at the end (otherwise use extend track) */ - SET_BUTTON_SENSITIVE ( tpwin, VIK_TRW_LAYER_TPWIN_INSERT, (gboolean) GPOINTER_TO_INT (tpl->next) ); + if ( tp->name ) + gtk_entry_set_text ( GTK_ENTRY(tpwin->trkpt_name), tp->name ); + else + gtk_editable_delete_text ( GTK_EDITABLE(tpwin->trkpt_name), 0, -1 ); + gtk_widget_set_sensitive ( tpwin->trkpt_name, TRUE ); - 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 ); + gtk_widget_set_sensitive ( tpwin->button_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) ); - - /* 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_widget_set_sensitive ( GTK_WIDGET(tpwin->ts), tp->has_timestamp ); + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), tp->has_timestamp ); + // Enable adding timestamps - but not on routepoints + if ( !tp->has_timestamp && !is_route ) { + gtk_widget_set_sensitive ( GTK_WIDGET(tpwin->time), TRUE ); + GtkWidget *img = gtk_image_new_from_stock ( GTK_STOCK_ADD, GTK_ICON_SIZE_MENU ); + gtk_button_set_image ( GTK_BUTTON(tpwin->time), img ); + } + else - gtk_label_set_text ( tpwin->track_name, track_name ); + vik_trw_layer_tpwin_set_track_name ( tpwin, track_name ); tpwin->sync_to_tp_block = TRUE; /* don't update while setting data. */ @@ -283,24 +417,11 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr g_critical("Houston, we've had a problem. height=%d", height_units); } + tpwin_update_times ( tpwin, tp ); - tpwin->sync_to_tp_block = FALSE; /* don't update whlie setting data. */ - - - if ( tp->has_timestamp ) - { - g_snprintf ( tmp_str, sizeof(tmp_str), "%ld", tp->timestamp ); - gtk_label_set_text ( tpwin->ts, tmp_str ); - g_snprintf ( tmp_str, MIN(25,sizeof(tmp_str)), "%s", ctime(&(tp->timestamp)) ); - /* max. len of 25 will snip off newline, which is good since it messes stuff up */ - gtk_label_set_text ( tpwin->localtime, tmp_str ); - } - else - { - gtk_label_set_text (tpwin->ts, NULL ); - gtk_label_set_text (tpwin->localtime, NULL ); - } + tpwin->sync_to_tp_block = FALSE; // don't update while setting data. + vik_units_speed_t speed_units = a_vik_get_units_speed (); vik_units_distance_t dist_units = a_vik_get_units_distance (); if ( tpwin->cur_tp ) { @@ -309,6 +430,7 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))); break; case VIK_UNITS_DISTANCE_MILES: + case VIK_UNITS_DISTANCE_NAUTICAL_MILES: g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f yards", vik_coord_diff(&(tp->coord), &(tpwin->cur_tp->coord))*1.0936133); break; default: @@ -324,7 +446,6 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr gtk_label_set_text ( tpwin->diff_speed, "--" ); else { - 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))) ); @@ -352,6 +473,33 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr } } + if ( isnan(tp->course) ) + g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); + else + g_snprintf ( tmp_str, sizeof(tmp_str), "%05.1f\302\260", tp->course ); + gtk_label_set_text ( tpwin->course, tmp_str ); + + if ( isnan(tp->speed) ) + g_snprintf ( tmp_str, sizeof(tmp_str), "--" ); + else { + switch (speed_units) { + case VIK_UNITS_SPEED_MILES_PER_HOUR: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f mph", VIK_MPS_TO_MPH(tp->speed) ); + break; + case VIK_UNITS_SPEED_METRES_PER_SECOND: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f m/s", tp->speed ); + break; + case VIK_UNITS_SPEED_KNOTS: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f knots", VIK_MPS_TO_KNOTS(tp->speed) ); + break; + default: + // VIK_UNITS_SPEED_KILOMETRES_PER_HOUR: + g_snprintf ( tmp_str, sizeof(tmp_str), "%.2f km/h", VIK_MPS_TO_KPH(tp->speed) ); + break; + } + } + gtk_label_set_text ( tpwin->speed, tmp_str ); + switch (dist_units) { case VIK_UNITS_DISTANCE_KILOMETRES: g_snprintf ( tmp_str, sizeof(tmp_str), "%.5f m", tp->hdop ); @@ -386,10 +534,12 @@ void vik_trw_layer_tpwin_set_tp ( VikTrwLayerTpwin *tpwin, GList *tpl, gchar *tr 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 ) { - gtk_label_set_text ( tpwin->track_name, track_name ); + gchar *tmp_name = g_strdup_printf ( "%s: %s", track_name, _("Trackpoint") ); + gtk_window_set_title ( GTK_WINDOW(tpwin), tmp_name ); + g_free ( tmp_name ); + //gtk_label_set_text ( tpwin->track_name, track_name ); }