From db275d5f5503124d353393d78e899e2ecfdf03c3 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Tue, 21 Jan 2020 23:29:44 +0100 Subject: Add basic timing ruler --- libstorycode/gtk/timing_ruler.c | 21 ++++++++++++++++++++- libstorycode/narrative.c | 20 ++++++++++++++++++++ libstorycode/narrative.h | 2 ++ libstorycode/narrative_render_cairo.c | 13 +++++++++++++ libstorycode/narrative_render_cairo.h | 2 ++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/libstorycode/gtk/timing_ruler.c b/libstorycode/gtk/timing_ruler.c index 66b925e..6ace1b1 100644 --- a/libstorycode/gtk/timing_ruler.c +++ b/libstorycode/gtk/timing_ruler.c @@ -44,7 +44,9 @@ void draw_ruler(cairo_t *cr, GtkNarrativeView *e) int start_item, end_item; int i; double start_item_time = 0.0; + double end_item_time = 0.0; double t; + double old_y; /* Background */ cairo_set_source_rgba(cr, 0.9, 0.9, 0.9, 1.0); @@ -60,7 +62,24 @@ void draw_ruler(cairo_t *cr, GtkNarrativeView *e) } t = start_item_time; for ( i=start_item; i<=end_item; i++ ) { - //printf("%4i: %.2f mins\n", i, t); t += e->n->items[i].estd_duration; } + end_item_time = t; + + old_y = 0.0; + for ( i=start_item_time; i<=end_item_time+1; i++ ) { + double y0, y1, y; + double yitem = narrative_find_time_pos(e->n, i); + y0 = narrative_get_item_y(e->n, yitem); + y1 = narrative_get_item_y(e->n, yitem+1); + y = y0 + (y1 - y0)*(yitem-trunc(yitem)); + cairo_rectangle(cr, 0.0, old_y, 100.0, y-old_y); + old_y = y; + if ( i % 2 ) { + cairo_set_source_rgb(cr, 0.9, 0.9, 0.9); + } else { + cairo_set_source_rgb(cr, 0.8, 0.8, 0.8); + } + cairo_fill(cr); + } } diff --git a/libstorycode/narrative.c b/libstorycode/narrative.c index c9c94d6..6bedd30 100644 --- a/libstorycode/narrative.c +++ b/libstorycode/narrative.c @@ -766,6 +766,26 @@ static double timing_from_wordcount(struct narrative_item *item) } +/* Find the position (in units of narrative items) of time 'minutes' */ +double narrative_find_time_pos(Narrative *n, double minutes) +{ + int i; + double t = 0.0; + + if ( minutes == 0.0 ) return 0.0; + + for ( i=0; in_items; i++ ) { + double idur = n->items[i].estd_duration; + if ( t + idur > minutes ) { + /* It's in this item */ + return (double)i + (minutes - t)/idur; + } + t += n->items[i].estd_duration; + } + return n->n_items; +} + + void update_timing(struct narrative_item *item) { switch ( item->type ) { diff --git a/libstorycode/narrative.h b/libstorycode/narrative.h index 54ad380..6881829 100644 --- a/libstorycode/narrative.h +++ b/libstorycode/narrative.h @@ -74,6 +74,8 @@ extern Slide *narrative_get_slide_by_number(Narrative *n, int pos); extern int narrative_get_slide_number_for_para(Narrative *n, int para); extern int narrative_get_slide_number_for_slide(Narrative *n, Slide *s); +extern double narrative_find_time_pos(Narrative *n, double minutes); + extern char *narrative_range_as_text(Narrative *n, int p1, size_t o1, int p2, size_t o2); extern char *narrative_range_as_storycode(Narrative *n, int p1, size_t o1, int p2, size_t o2); diff --git a/libstorycode/narrative_render_cairo.c b/libstorycode/narrative_render_cairo.c index f23f18c..ee5e67d 100644 --- a/libstorycode/narrative_render_cairo.c +++ b/libstorycode/narrative_render_cairo.c @@ -504,6 +504,19 @@ int narrative_render_item_cairo(Narrative*n, cairo_t *cr, int i) return 0; } +double narrative_get_item_y(Narrative *n, int item) +{ + int i; + double y = 0.0; + + if ( item >= n->n_items ) return +INFINITY; + + for ( i=0; i