+
+ pass_along = g_malloc ( sizeof(gpointer) * 2 );
+ pass_along[0] = tr;
+ pass_along[1] = vlp;
+
+ 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;
+}
+
+#define METRIC 1
+#ifdef METRIC
+#define MTOK(v) ( (v)*3600.0/1000.0) /* m/s to km/h */
+#else
+#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, 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 )
+ return NULL;
+
+ pix = gdk_pixmap_new( window->window, PROFILE_WIDTH + MARGIN, PROFILE_HEIGHT, -1 );
+ image = gtk_image_new_from_pixmap ( pix, NULL );
+
+ for (i=0; i<PROFILE_WIDTH; i++) {
+ speeds[i] = MTOK(speeds[i]);
+ }
+
+ 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;
+ }
+
+ /* clear the image */
+ gdk_draw_rectangle(GDK_DRAWABLE(pix), window->style->bg_gc[0],
+ TRUE, 0, 0, MARGIN, PROFILE_HEIGHT);
+ gdk_draw_rectangle(GDK_DRAWABLE(pix), window->style->mid_gc[0],
+ TRUE, MARGIN, 0, PROFILE_WIDTH, PROFILE_HEIGHT);
+
+#if 0
+ /* XXX this can go out, it's just a helpful dev tool */
+ {
+ int j;
+ GdkGC **colors[8] = { window->style->bg_gc, window->style->fg_gc,
+ window->style->light_gc,
+ window->style->dark_gc, window->style->mid_gc,
+ window->style->text_gc, window->style->base_gc,
+ window->style->text_aa_gc };
+ for (i=0; i<5; i++) {
+ for (j=0; j<8; j++) {
+ gdk_draw_rectangle(GDK_DRAWABLE(pix), colors[j][i],
+ TRUE, i*20, j*20, 20, 20);
+ gdk_draw_rectangle(GDK_DRAWABLE(pix), window->style->black_gc,
+ FALSE, i*20, j*20, 20, 20);
+ }
+ }
+ }
+#else
+
+ /* draw grid */
+#define LABEL_FONT "Sans 8"
+ for (i=0; i<=LINES; i++) {
+ PangoFontDescription *pfd;
+ PangoLayout *pl = gtk_widget_create_pango_layout (GTK_WIDGET(image), NULL);
+ gchar s[32];
+
+ pfd = pango_font_description_from_string (LABEL_FONT);
+ pango_layout_set_font_description (pl, pfd);
+ pango_font_description_free (pfd);
+#ifdef METRIC
+ sprintf(s, "%5dkm/h", (int)(mins + (LINES-i)*(maxs-mins)/LINES));
+#else
+ sprintf(s, "%8dmph", (int)(mins + (LINES-i)*(maxs-mins)/LINES));
+#endif
+ pango_layout_set_text(pl, s, -1);
+ gdk_draw_layout(GDK_DRAWABLE(pix), window->style->fg_gc[0], 0,
+ CLAMP((int)i*PROFILE_HEIGHT/LINES - 5, 0, PROFILE_HEIGHT-15), pl);
+
+ gdk_draw_line (GDK_DRAWABLE(pix), window->style->dark_gc[0],
+ MARGIN, PROFILE_HEIGHT/LINES * i, MARGIN + PROFILE_WIDTH, PROFILE_HEIGHT/LINES * i);
+ }
+
+ /* draw speeds */
+ for ( i = 0; i < PROFILE_WIDTH; i++ )
+ gdk_draw_line ( GDK_DRAWABLE(pix), window->style->dark_gc[3],
+ i + MARGIN, PROFILE_HEIGHT, i + MARGIN, PROFILE_HEIGHT-PROFILE_HEIGHT*(speeds[i]-mins)/(maxs-mins) );
+#endif
+ /* draw border */
+ gdk_draw_rectangle(GDK_DRAWABLE(pix), window->style->black_gc, FALSE, MARGIN, 0, PROFILE_WIDTH-1, PROFILE_HEIGHT-1);
+
+ g_object_unref ( G_OBJECT(pix) );
+ g_free ( speeds );
+
+ 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;