aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2020-01-21 23:29:44 +0100
committerThomas White <taw@bitwiz.me.uk>2020-01-21 23:29:44 +0100
commitdb275d5f5503124d353393d78e899e2ecfdf03c3 (patch)
treef1a6cf53dde5b6ab1d0b0f7bb400557c1436dfb8
parent161ff9ecc9be47e9016ef5e347d347f7a336765b (diff)
Add basic timing ruler
-rw-r--r--libstorycode/gtk/timing_ruler.c21
-rw-r--r--libstorycode/narrative.c20
-rw-r--r--libstorycode/narrative.h2
-rw-r--r--libstorycode/narrative_render_cairo.c13
-rw-r--r--libstorycode/narrative_render_cairo.h2
5 files changed, 57 insertions, 1 deletions
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; i<n->n_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<item; i++ ) {
+ y += narrative_item_get_height(n, i);
+ }
+ return y;
+}
+
/* Given a y-coordinate range, works out which range of items (inclusive)
* are at least partially within the range */
diff --git a/libstorycode/narrative_render_cairo.h b/libstorycode/narrative_render_cairo.h
index 265b3d9..5c1880f 100644
--- a/libstorycode/narrative_render_cairo.h
+++ b/libstorycode/narrative_render_cairo.h
@@ -55,6 +55,8 @@ extern int narrative_render_cairo(Narrative *n, cairo_t *cr, Stylesheet *stylesh
extern void narrative_sort_positions(struct edit_pos *a, struct edit_pos *b);
+extern double narrative_get_item_y(Narrative *n, int item);
+
extern void narrative_get_item_range(Narrative *n, double min_y, double max_y,
int *start_item, int *end_item);