diff options
author | Thomas White <taw@physics.org> | 2019-03-10 09:29:25 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2019-03-10 09:29:25 +0100 |
commit | 22f935dc19ff670e8168059663676d432bcaeef2 (patch) | |
tree | 87cd9a1e5a8b8cb471d8479fc5ac182115666c40 /libstorycode/narrative.c | |
parent | b147d7a36768dc5789ff47a77fd149034ee87d69 (diff) |
Implement delete
Diffstat (limited to 'libstorycode/narrative.c')
-rw-r--r-- | libstorycode/narrative.c | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/libstorycode/narrative.c b/libstorycode/narrative.c index 18e2203..8cb54c3 100644 --- a/libstorycode/narrative.c +++ b/libstorycode/narrative.c @@ -41,8 +41,29 @@ Narrative *narrative_new() return n; } + +static void narrative_item_destroy(struct narrative_item *item) +{ + free(item->text); +#ifdef HAVE_PANGO + if ( item->layout != NULL ) { + g_object_unref(item->layout); + } +#endif +#ifdef HAVE_CAIRO + if ( item->slide_thumbnail != NULL ) { + cairo_surface_destroy(item->slide_thumbnail); + } +#endif +} + + void narrative_free(Narrative *n) { + int i; + for ( i=0; i<n->n_items; i++ ) { + narrative_item_destroy(&n->items[i]); + } free(n->items); free(n); } @@ -51,10 +72,16 @@ void narrative_free(Narrative *n) static struct narrative_item *add_item(Narrative *n) { struct narrative_item *new_items; + struct narrative_item *item; new_items = realloc(n->items, (n->n_items+1)*sizeof(struct narrative_item)); if ( new_items == NULL ) return NULL; n->items = new_items; - return &n->items[n->n_items++]; + item = &n->items[n->n_items++]; + item->layout = NULL; + item->text = NULL; + item->slide = NULL; + item->slide_thumbnail = NULL; + return item; } @@ -111,3 +138,51 @@ void narrative_add_slide(Narrative *n, Slide *slide) item->slide = slide; item->slide_thumbnail = NULL; } + + +static void delete_item(Narrative *n, int del) +{ + int i; + narrative_item_destroy(&n->items[del]); + for ( i=del; i<n->n_items-1; i++ ) { + n->items[i] = n->items[i+1]; + } + n->n_items--; +} + + +/* Delete from item i1 offset o1 to item i2 offset o2, inclusive */ +void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2) +{ + int i; + + /* Starting item */ + if ( n->items[i1].type == NARRATIVE_ITEM_SLIDE ) { + delete_item(n, i1); + i1--; + i2--; + } else { + if ( i1 == i2 ) { + memmove(&n->items[i1].text[o1], + &n->items[i1].text[o2], + strlen(n->items[i1].text)-o2+1); + return; /* easy case */ + } else { + n->items[i1].text[o1] = '\0'; + } + } + + /* Middle items */ + for ( i=i1+1; i<i2; i++ ) { + delete_item(n, i); + i2--; + } + + /* Last item */ + if ( n->items[i2].type == NARRATIVE_ITEM_SLIDE ) { + delete_item(n, i2); + } else { + memmove(&n->items[i2].text[0], + &n->items[i2].text[o2], o2); + } +} |