#include "viking.h"
#include "vikviewport.h" /* ugh */
#include "vikutils.h"
+#include "ui_util.h"
#include <gdk-pixbuf/gdk-pixdata.h>
typedef enum {
VikTrackpoint *blob_tp;
gboolean is_blob_drawn;
time_t duration;
+ gchar *tz; // TimeZone at track's location
} PropWidgets;
static PropWidgets *prop_widgets_new()
case VIK_UNITS_DISTANCE_MILES:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(meters_from_start) );
break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(meters_from_start) );
+ break;
default:
g_critical("Houston, we've had a problem. distance=%d", dist_units);
}
case VIK_UNITS_DISTANCE_MILES:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(meters_from_start) );
break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(meters_from_start) );
+ break;
default:
g_critical("Houston, we've had a problem. distance=%d", dist_units);
}
}
//
-static void real_time_label_update (GtkWidget *widget, VikTrackpoint *trackpoint)
+static void real_time_label_update ( PropWidgets *widgets, GtkWidget *widget, VikTrackpoint *trackpoint)
{
static gchar tmp_buf[64];
if ( trackpoint->has_timestamp ) {
}
if (trackpoint && widgets->w_cur_time_real) {
- real_time_label_update ( widgets->w_cur_time_real, trackpoint );
+ real_time_label_update ( widgets, widgets->w_cur_time_real, trackpoint );
}
gint ix = (gint)x;
}
if (trackpoint && widgets->w_cur_dist_time_real) {
- real_time_label_update ( widgets->w_cur_dist_time_real, trackpoint );
+ real_time_label_update ( widgets, widgets->w_cur_dist_time_real, trackpoint );
}
gint ix = (gint)x;
if (trackpoint && widgets->w_cur_dist_dist) {
static gchar tmp_buf[20];
- if ( a_vik_get_units_distance () == VIK_UNITS_DISTANCE_MILES )
+ switch ( a_vik_get_units_distance () ) {
+ case VIK_UNITS_DISTANCE_MILES:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", widgets->distances[ix]);
- else
+ break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", widgets->distances[ix]);
+ break;
+ default:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f km", widgets->distances[ix]);
+ break;
+ }
gtk_label_set_text(GTK_LABEL(widgets->w_cur_dist_dist), tmp_buf);
}
}
if (trackpoint && widgets->w_cur_elev_time_real) {
- real_time_label_update ( widgets->w_cur_elev_time_real, trackpoint );
+ real_time_label_update ( widgets, widgets->w_cur_elev_time_real, trackpoint );
}
gint ix = (gint)x;
case VIK_UNITS_DISTANCE_MILES:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(meters_from_start) );
break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(meters_from_start) );
+ break;
default:
g_critical("Houston, we've had a problem. distance=%d", dist_units);
}
static void draw_grid_x_distance ( GtkWidget *window, GtkWidget *image, PropWidgets *widgets, GdkPixmap *pix, guint ii, gdouble dd, guint xx, vik_units_distance_t dist_units )
{
gchar *label_markup = NULL;
- if ( dist_units == VIK_UNITS_DISTANCE_MILES )
+ switch ( dist_units ) {
+ case VIK_UNITS_DISTANCE_MILES:
if ( ii > 4 )
label_markup = g_strdup_printf ( "<span size=\"small\">%d %s</span>", (guint)dd, _("miles") );
else
label_markup = g_strdup_printf ( "<span size=\"small\">%.1f %s</span>", dd, _("miles") );
- else
+ break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ if ( ii > 4 )
+ label_markup = g_strdup_printf ( "<span size=\"small\">%d %s</span>", (guint)dd, _("NM") );
+ else
+ label_markup = g_strdup_printf ( "<span size=\"small\">%.1f %s</span>", dd, _("NM") );
+ break;
+ default:
+ // VIK_UNITS_DISTANCE_KILOMETRES:
if ( ii > 4 )
label_markup = g_strdup_printf ( "<span size=\"small\">%d %s</span>", (guint)dd, _("km") );
else
label_markup = g_strdup_printf ( "<span size=\"small\">%.1f %s</span>", dd, _("km") );
+ break;
+ }
if ( label_markup ) {
PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(image), NULL);
{
// Set to display units from length in metres.
gdouble length = widgets->track_length_inc_gaps;
- if ( dist_units == VIK_UNITS_DISTANCE_MILES )
- length = VIK_METERS_TO_MILES(length);
- else
- // KM
- length = length/1000.0;
-
+ switch (dist_units) {
+ case VIK_UNITS_DISTANCE_MILES:
+ length = VIK_METERS_TO_MILES(length);
+ break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ length = VIK_METERS_TO_NAUTICAL_MILES(length);
+ break;
+ default:
+ // KM
+ length = length/1000.0;
+ break;
+ }
guint index = get_distance_chunk_index ( length );
gdouble dist_per_pixel = length/widgets->profile_width;
// Convert into appropriate units
vik_units_distance_t dist_units = a_vik_get_units_distance ();
- if ( dist_units == VIK_UNITS_DISTANCE_MILES ) {
- for ( i = 0; i < widgets->profile_width; i++ ) {
- widgets->distances[i] = VIK_METERS_TO_MILES(widgets->distances[i]);
- }
- }
- else {
- // Metres - but want in kms
- for ( i = 0; i < widgets->profile_width; i++ ) {
- widgets->distances[i] = widgets->distances[i]/1000.0;
- }
+ switch ( dist_units ) {
+ case VIK_UNITS_DISTANCE_MILES:
+ for ( i = 0; i < widgets->profile_width; i++ ) {
+ widgets->distances[i] = VIK_METERS_TO_MILES(widgets->distances[i]);
+ }
+ break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ for ( i = 0; i < widgets->profile_width; i++ ) {
+ widgets->distances[i] = VIK_METERS_TO_NAUTICAL_MILES(widgets->distances[i]);
+ }
+ break;
+ default:
+ // Metres - but want in kms
+ for ( i = 0; i < widgets->profile_width; i++ ) {
+ widgets->distances[i] = widgets->distances[i]/1000.0;
+ }
+ break;
}
widgets->duration = vik_track_get_duration ( widgets->tr );
// Assign locally
// mind = 0.0; - Thus not used
gdouble maxd;
- if ( dist_units == VIK_UNITS_DISTANCE_MILES )
+ switch ( dist_units ) {
+ case VIK_UNITS_DISTANCE_MILES:
maxd = VIK_METERS_TO_MILES(vik_track_get_length_including_gaps (tr));
- else
+ break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ maxd = VIK_METERS_TO_NAUTICAL_MILES(vik_track_get_length_including_gaps (tr));
+ break;
+ default:
maxd = vik_track_get_length_including_gaps (tr) / 1000.0;
+ break;
+ }
/* Find suitable chunk index */
gdouble dummy = 0.0; // expect this to remain the same! (not that it's used)
for (i=0; i<=LINES; i++) {
gchar s[32];
- if ( dist_units == VIK_UNITS_DISTANCE_MILES )
+ switch ( dist_units ) {
+ case VIK_UNITS_DISTANCE_MILES:
sprintf(s, _("%.1f miles"), ((LINES-i)*chunksd[widgets->cid]));
- else
+ break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ sprintf(s, _("%.1f NM"), ((LINES-i)*chunksd[widgets->cid]));
+ break;
+ default:
sprintf(s, _("%.1f km"), ((LINES-i)*chunksd[widgets->cid]));
+ break;
+ }
draw_grid_y ( window, image, widgets, pix, s, i );
}
case VIK_UNITS_DISTANCE_MILES:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f miles", VIK_METERS_TO_MILES(tr_len) );
break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f NM", VIK_METERS_TO_NAUTICAL_MILES(tr_len) );
+ break;
default:
g_critical("Houston, we've had a problem. distance=%d", dist_units);
}
- widgets->w_track_length = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_track_length = content[cnt++] = ui_label_new_selectable ( tmp_buf );
tp_count = vik_track_get_tp_count(tr);
g_snprintf(tmp_buf, sizeof(tmp_buf), "%lu", tp_count );
- widgets->w_tp_count = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_tp_count = content[cnt++] = ui_label_new_selectable ( tmp_buf );
seg_count = vik_track_get_segment_count(tr) ;
g_snprintf(tmp_buf, sizeof(tmp_buf), "%u", seg_count );
- widgets->w_segment_count = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_segment_count = content[cnt++] = ui_label_new_selectable ( tmp_buf );
g_snprintf(tmp_buf, sizeof(tmp_buf), "%lu", vik_track_get_dup_point_count(tr) );
- widgets->w_duptp_count = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_duptp_count = content[cnt++] = ui_label_new_selectable ( tmp_buf );
vik_units_speed_t speed_units = a_vik_get_units_speed ();
tmp_speed = vik_track_get_max_speed(tr);
g_critical("Houston, we've had a problem. speed=%d", speed_units);
}
}
- widgets->w_max_speed = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_max_speed = content[cnt++] = ui_label_new_selectable ( tmp_buf );
tmp_speed = vik_track_get_average_speed(tr);
if ( tmp_speed == 0 )
g_critical("Houston, we've had a problem. speed=%d", speed_units);
}
}
- widgets->w_avg_speed = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_avg_speed = content[cnt++] = ui_label_new_selectable ( tmp_buf );
// Use 60sec as the default period to be considered stopped
// this is the TrackWaypoint draw stops default value 'vtl->stop_length'
g_critical("Houston, we've had a problem. speed=%d", speed_units);
}
}
- widgets->w_mvg_speed = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_mvg_speed = content[cnt++] = ui_label_new_selectable ( tmp_buf );
switch (dist_units) {
case VIK_UNITS_DISTANCE_KILOMETRES:
case VIK_UNITS_DISTANCE_MILES:
g_snprintf(tmp_buf, sizeof(tmp_buf), "%.3f miles", (tp_count - seg_count) == 0 ? 0 : VIK_METERS_TO_MILES(tr_len / ( tp_count - seg_count )) );
break;
+ case VIK_UNITS_DISTANCE_NAUTICAL_MILES:
+ g_snprintf(tmp_buf, sizeof(tmp_buf), "%.3f NM", (tp_count - seg_count) == 0 ? 0 : VIK_METERS_TO_NAUTICAL_MILES(tr_len / ( tp_count - seg_count )) );
+ break;
default:
g_critical("Houston, we've had a problem. distance=%d", dist_units);
}
- widgets->w_avg_dist = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_avg_dist = content[cnt++] = ui_label_new_selectable ( tmp_buf );
vik_units_height_t height_units = a_vik_get_units_height ();
if ( min_alt == VIK_DEFAULT_ALTITUDE )
g_critical("Houston, we've had a problem. height=%d", height_units);
}
}
- widgets->w_elev_range = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_elev_range = content[cnt++] = ui_label_new_selectable ( tmp_buf );
vik_track_get_total_elevation_gain(tr, &max_alt, &min_alt );
if ( min_alt == VIK_DEFAULT_ALTITUDE )
g_critical("Houston, we've had a problem. height=%d", height_units);
}
}
- widgets->w_elev_gain = content[cnt++] = gtk_label_new ( tmp_buf );
+ widgets->w_elev_gain = content[cnt++] = ui_label_new_selectable ( tmp_buf );
#if 0
#define PACK(w) gtk_box_pack_start (GTK_BOX(right_vbox), w, FALSE, FALSE, 0);
struct LatLon center = { (tr->bbox.north+tr->bbox.south)/2, (tr->bbox.east+tr->bbox.west)/2 };
vik_coord_load_from_latlon ( &vc, vik_trw_layer_get_coord_mode(vtl), ¢er );
+ widgets->tz = vu_get_tz_at_location ( &vc );
+
gchar *msg;
- msg = vu_get_time_string ( &t1, "%c", &vc, NULL );
- widgets->w_time_start = content[cnt++] = gtk_label_new(msg);
+ msg = vu_get_time_string ( &t1, "%c", &vc, widgets->tz );
+ widgets->w_time_start = content[cnt++] = ui_label_new_selectable(msg);
g_free ( msg );
- msg = vu_get_time_string ( &t2, "%c", &vc, NULL );
- widgets->w_time_end = content[cnt++] = gtk_label_new(msg);
+ msg = vu_get_time_string ( &t2, "%c", &vc, widgets->tz );
+ widgets->w_time_end = content[cnt++] = ui_label_new_selectable(msg);
g_free ( msg );
g_snprintf(tmp_buf, sizeof(tmp_buf), _("%d minutes"), (int)(t2-t1)/60);
- widgets->w_time_dur = content[cnt++] = gtk_label_new(tmp_buf);
+ widgets->w_time_dur = content[cnt++] = ui_label_new_selectable(tmp_buf);
} else {
widgets->w_time_start = content[cnt++] = gtk_label_new(_("No Data"));
widgets->w_time_end = content[cnt++] = gtk_label_new(_("No Data"));
if ( widgets->elev_box ) {
GtkWidget *page = NULL;
- widgets->w_cur_dist = gtk_label_new(_("No Data"));
- widgets->w_cur_elevation = gtk_label_new(_("No Data"));
+ widgets->w_cur_dist = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_elevation = ui_label_new_selectable(_("No Data"));
widgets->w_show_dem = gtk_check_button_new_with_mnemonic(_("Show D_EM"));
widgets->w_show_alt_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed"));
page = create_graph_page (widgets->elev_box,
if ( widgets->gradient_box ) {
GtkWidget *page = NULL;
- widgets->w_cur_gradient_dist = gtk_label_new(_("No Data"));
- widgets->w_cur_gradient_gradient = gtk_label_new(_("No Data"));
+ widgets->w_cur_gradient_dist = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_gradient_gradient = ui_label_new_selectable(_("No Data"));
widgets->w_show_gradient_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed"));
page = create_graph_page (widgets->gradient_box,
_("<b>Track Distance:</b>"), widgets->w_cur_gradient_dist,
if ( widgets->speed_box ) {
GtkWidget *page = NULL;
- widgets->w_cur_time = gtk_label_new(_("No Data"));
- widgets->w_cur_speed = gtk_label_new(_("No Data"));
- widgets->w_cur_time_real = gtk_label_new(_("No Data"));
+ widgets->w_cur_time = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_speed = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_time_real = ui_label_new_selectable(_("No Data"));
widgets->w_show_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed"));
page = create_graph_page (widgets->speed_box,
_("<b>Track Time:</b>"), widgets->w_cur_time,
if ( widgets->dist_box ) {
GtkWidget *page = NULL;
- widgets->w_cur_dist_time = gtk_label_new(_("No Data"));
- widgets->w_cur_dist_dist = gtk_label_new(_("No Data"));
- widgets->w_cur_dist_time_real = gtk_label_new(_("No Data"));
+ widgets->w_cur_dist_time = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_dist_dist = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_dist_time_real = ui_label_new_selectable(_("No Data"));
widgets->w_show_dist_speed = gtk_check_button_new_with_mnemonic(_("Show S_peed"));
page = create_graph_page (widgets->dist_box,
_("<b>Track Distance:</b>"), widgets->w_cur_dist_dist,
if ( widgets->elev_time_box ) {
GtkWidget *page = NULL;
- widgets->w_cur_elev_time = gtk_label_new(_("No Data"));
- widgets->w_cur_elev_elev = gtk_label_new(_("No Data"));
- widgets->w_cur_elev_time_real = gtk_label_new(_("No Data"));
+ widgets->w_cur_elev_time = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_elev_elev = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_elev_time_real = ui_label_new_selectable(_("No Data"));
widgets->w_show_elev_speed = gtk_check_button_new_with_mnemonic(_("Show S_peed"));
widgets->w_show_elev_dem = gtk_check_button_new_with_mnemonic(_("Show D_EM"));
page = create_graph_page (widgets->elev_time_box,
if ( widgets->speed_dist_box ) {
GtkWidget *page = NULL;
- widgets->w_cur_speed_dist = gtk_label_new(_("No Data"));
- widgets->w_cur_speed_speed = gtk_label_new(_("No Data"));
+ widgets->w_cur_speed_dist = ui_label_new_selectable(_("No Data"));
+ widgets->w_cur_speed_speed = ui_label_new_selectable(_("No Data"));
widgets->w_show_sd_gps_speed = gtk_check_button_new_with_mnemonic(_("Show _GPS Speed"));
page = create_graph_page (widgets->speed_dist_box,
_("<b>Track Distance:</b>"), widgets->w_cur_speed_dist,