X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/8c4f1350d63e7d8bee903123eed8a48263787265..8cd10bb4dc58e659a2f1527c4eb5927320540898:/src/viktrwlayer_propwin.c?ds=sidebyside diff --git a/src/viktrwlayer_propwin.c b/src/viktrwlayer_propwin.c index cac40b29..1e98f1f5 100644 --- a/src/viktrwlayer_propwin.c +++ b/src/viktrwlayer_propwin.c @@ -57,17 +57,51 @@ static void minmax_alt(const gdouble *altitudes, gdouble *min, gdouble *max) } } +static GtkWidget *label_date; + #define MARGIN 50 #define LINES 5 void track_profile_click( GtkWidget *image, GdkEventButton *event, gpointer *pass_along ) { + gdouble x = event->x - image->allocation.width / 2 + PROFILE_WIDTH / 2 - MARGIN / 2; + if (x < 0) + x = 0; + if (x > PROFILE_WIDTH) + x = PROFILE_WIDTH; VikTrack *tr = pass_along[0]; - VikCoord *coord = vik_track_get_closest_tp_by_percentage_dist ( tr, (gdouble) (event->x - MARGIN - 2) / PROFILE_WIDTH ); - if ( coord ) { + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_dist ( tr, (gdouble) x / PROFILE_WIDTH ); + if ( trackpoint ) { + VikCoord coord = trackpoint->coord; VikLayersPanel *vlp = pass_along[1]; - vik_viewport_set_center_coord ( vik_layers_panel_get_viewport(vlp), coord ); + vik_viewport_set_center_coord ( vik_layers_panel_get_viewport(vlp), &coord ); vik_layers_panel_emit_update ( vlp ); - g_free ( coord ); + } +} +void track_profile_move( GtkWidget *image, GdkEventMotion *event, gpointer *pass_along ) +{ + VikTrack *tr = pass_along[0]; + int mouse_x, mouse_y; + GdkModifierType state; + + if (event->is_hint) + gdk_window_get_pointer (event->window, &mouse_x, &mouse_y, &state); + else + mouse_x = event->x; + + gdouble x = mouse_x - image->allocation.width / 2 + PROFILE_WIDTH / 2 - MARGIN / 2; + if (x < 0) + x = 0; + if (x > PROFILE_WIDTH) + x = PROFILE_WIDTH; + + VikTrackpoint *trackpoint = vik_track_get_closest_tp_by_percentage_dist ( tr, (gdouble) x / PROFILE_WIDTH ); + if (trackpoint) { + time_t t1 = trackpoint->timestamp; + static gchar tmp_buf[25]; + strncpy(tmp_buf, ctime(&t1), sizeof(tmp_buf)); + tmp_buf[strlen(tmp_buf)-1] = 0; + + gtk_label_set_text(GTK_LABEL(label_date), tmp_buf); } } @@ -75,9 +109,9 @@ GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, VikTrack *tr, gdoub { GdkPixmap *pix; GtkWidget *image; - GtkWidget *eventbox; gdouble *altitudes = vik_track_make_elevation_map ( tr, PROFILE_WIDTH ); gdouble mina, maxa; + GtkWidget *eventbox; gpointer *pass_along; guint i; @@ -152,8 +186,12 @@ GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, VikTrack *tr, gdoub eventbox = gtk_event_box_new (); g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_profile_click), pass_along ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_profile_move), pass_along ); g_signal_connect_swapped ( G_OBJECT(eventbox), "destroy", G_CALLBACK(g_free), pass_along ); gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK + | GDK_POINTER_MOTION_MASK + | GDK_POINTER_MOTION_HINT_MASK); return eventbox; } @@ -165,13 +203,18 @@ GtkWidget *vik_trw_layer_create_profile ( GtkWidget *window, VikTrack *tr, gdoub #define MTOK(v) ( (v)*3600.0/1000.0 * 0.6214) /* m/s to mph - we'll handle this globally eventually but for now ...*/ #endif -GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr) +GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr, gpointer vlp) { GdkPixmap *pix; GtkWidget *image; gdouble mins, maxs; guint i; + GtkWidget *eventbox; + gpointer *pass_along; + pass_along = g_malloc ( sizeof(gpointer) * 2 ); + pass_along[0] = tr; + pass_along[1] = vlp; gdouble *speeds = vik_track_make_speed_map ( tr, PROFILE_WIDTH ); if ( speeds == NULL ) @@ -185,6 +228,8 @@ GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr) } minmax_alt(speeds, &mins, &maxs); + mins = 0; /* splines sometimes give negative speeds */ + maxs = maxs * 110 / 100; if (maxs-mins < MIN_SPEED_DIFF) { maxs = mins + MIN_SPEED_DIFF; } @@ -248,7 +293,17 @@ GtkWidget *vik_trw_layer_create_vtdiag ( GtkWidget *window, VikTrack *tr) g_object_unref ( G_OBJECT(pix) ); g_free ( speeds ); - return image; + + eventbox = gtk_event_box_new (); + g_signal_connect ( G_OBJECT(eventbox), "button_press_event", G_CALLBACK(track_profile_click), pass_along ); + g_signal_connect ( G_OBJECT(eventbox), "motion_notify_event", G_CALLBACK(track_profile_move), pass_along ); + g_signal_connect_swapped ( G_OBJECT(eventbox), "destroy", G_CALLBACK(g_free), pass_along ); + gtk_container_add ( GTK_CONTAINER(eventbox), image ); + gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK + | GDK_POINTER_MOTION_MASK + | GDK_POINTER_MOTION_HINT_MASK); + + return eventbox; } #undef MARGIN #undef LINES @@ -269,86 +324,91 @@ gint vik_trw_layer_propwin_run ( GtkWindow *parent, VikTrack *tr, gpointer vlp ) GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); - GtkWidget *left_vbox, *right_vbox, *hbox; + GtkTable *table; GtkWidget *e_cmt; - GtkWidget *l_len, *l_tps, *l_segs, *l_dups, *l_maxs, *l_avgs, *l_avgd, *l_elev, *l_galo, *l_begin, *l_end, *l_dur; gdouble tr_len; guint32 tp_count, seg_count; gint resp; gdouble min_alt, max_alt; GtkWidget *profile = vik_trw_layer_create_profile(GTK_WIDGET(parent),tr,&min_alt,&max_alt,vlp); - GtkWidget *vtdiag = vik_trw_layer_create_vtdiag(GTK_WIDGET(parent), tr); + GtkWidget *vtdiag = vik_trw_layer_create_vtdiag(GTK_WIDGET(parent), tr, vlp); GtkWidget *graphs = gtk_notebook_new(); - static gchar *label_texts[] = { "Comment:", "Track Length:", "Trackpoints:", "Segments:", "Duplicate Points:", "Max Speed:", "Avg. Speed:", "Avg. Dist. Between TPs:", "Elevation Range:", "Total Elevation Gain/Loss:", "Start:", "End:", "Duration:" }; + GtkWidget *content[20]; + int cnt; + int i; + + static gchar *label_texts[] = { "Comment:", "Track Length:", "Trackpoints:", "Segments:", "Duplicate Points:", "Max Speed:", "Avg. Speed:", "Avg. Dist. Between TPs:", "Elevation Range:", "Total Elevation Gain/Loss:", "Start:", "End:", "Duration:", "Selected date" }; static gchar tmp_buf[25]; gdouble tmp_speed; - left_vbox = a_dialog_create_label_vbox ( label_texts, sizeof(label_texts) / sizeof(label_texts[0]) ); - right_vbox = gtk_vbox_new ( TRUE, 3 ); - + cnt = 0; e_cmt = gtk_entry_new (); if ( tr->comment ) gtk_entry_set_text ( GTK_ENTRY(e_cmt), tr->comment ); g_signal_connect_swapped ( e_cmt, "activate", G_CALLBACK(a_dialog_response_accept), GTK_DIALOG(dialog) ); + content[cnt++] = e_cmt; tr_len = vik_track_get_length(tr); g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m", tr_len ); - l_len = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); tp_count = vik_track_get_tp_count(tr); g_snprintf(tmp_buf, sizeof(tmp_buf), "%u", tp_count ); - l_tps = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); seg_count = vik_track_get_segment_count(tr) ; g_snprintf(tmp_buf, sizeof(tmp_buf), "%u", seg_count ); - l_segs = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); g_snprintf(tmp_buf, sizeof(tmp_buf), "%lu", vik_track_get_dup_point_count(tr) ); - l_dups = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); tmp_speed = vik_track_get_max_speed(tr); if ( tmp_speed == 0 ) g_snprintf(tmp_buf, sizeof(tmp_buf), "No Data"); else g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed ); - l_maxs = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); tmp_speed = vik_track_get_average_speed(tr); if ( tmp_speed == 0 ) g_snprintf(tmp_buf, sizeof(tmp_buf), "No Data"); else g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m/s", tmp_speed ); - l_avgs = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); g_snprintf(tmp_buf, sizeof(tmp_buf), "%.2f m", (tp_count - seg_count) == 0 ? 0 : tr_len / ( tp_count - seg_count ) ); - l_avgd = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); if ( min_alt == VIK_DEFAULT_ALTITUDE ) g_snprintf(tmp_buf, sizeof(tmp_buf), "No Data"); else g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m - %.0f m", min_alt, max_alt ); - l_elev = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); vik_track_get_total_elevation_gain(tr, &max_alt, &min_alt ); - if ( max_alt == VIK_DEFAULT_ALTITUDE ) + if ( min_alt == VIK_DEFAULT_ALTITUDE ) g_snprintf(tmp_buf, sizeof(tmp_buf), "No Data"); else g_snprintf(tmp_buf, sizeof(tmp_buf), "%.0f m / %.0f m", max_alt, min_alt ); - l_galo = gtk_label_new ( tmp_buf ); + content[cnt++] = gtk_label_new ( tmp_buf ); - - gtk_box_pack_start (GTK_BOX(right_vbox), e_cmt, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_len, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_tps, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_segs, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_dups, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_maxs, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_avgs, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_avgd, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_elev, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX(right_vbox), l_galo, FALSE, FALSE, 0); +#if 0 +#define PACK(w) gtk_box_pack_start (GTK_BOX(right_vbox), w, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(right_vbox), e_cmt, FALSE, FALSE, 0); + PACK(l_len); + PACK(l_tps); + PACK(l_segs); + PACK(l_dups); + PACK(l_maxs); + PACK(l_avgs); + PACK(l_avgd); + PACK(l_elev); + PACK(l_galo); +#undef PACK; +#endif if ( tr->trackpoints && VIK_TRACKPOINT(tr->trackpoints->data)->timestamp ) { @@ -358,27 +418,38 @@ gint vik_trw_layer_propwin_run ( GtkWindow *parent, VikTrack *tr, gpointer vlp ) strncpy(tmp_buf, ctime(&t1), sizeof(tmp_buf)); tmp_buf[strlen(tmp_buf)-1] = 0; - l_begin = gtk_label_new(tmp_buf); + content[cnt++] = gtk_label_new(tmp_buf); strncpy(tmp_buf, ctime(&t2), sizeof(tmp_buf)); tmp_buf[strlen(tmp_buf)-1] = 0; - l_end = gtk_label_new(tmp_buf); + content[cnt++] = gtk_label_new(tmp_buf); g_snprintf(tmp_buf, sizeof(tmp_buf), "%d minutes", (int)(t2-t1)/60); - l_dur = gtk_label_new(tmp_buf); + content[cnt++] = gtk_label_new(tmp_buf); } else { - l_begin = gtk_label_new("No Data"); - l_end = gtk_label_new("No Data"); - l_dur = gtk_label_new("No Data"); + content[cnt++] = gtk_label_new("No Data"); + content[cnt++] = gtk_label_new("No Data"); + content[cnt++] = gtk_label_new("No Data"); + } + label_date = gtk_label_new("No Data"); + content[cnt++] = label_date; + + table = GTK_TABLE(gtk_table_new (cnt, 2, FALSE)); + gtk_table_set_col_spacing (table, 0, 10); + for (i=0; ivbox), hbox, FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), GTK_WIDGET(table), FALSE, FALSE, 0); if ( profile ) gtk_notebook_append_page(GTK_NOTEBOOK(graphs), profile, gtk_label_new("Elevation-distance"));