From f5fd7623a14dd51a59657cbab4d5953b1b2e48ff Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 23 Mar 2019 22:44:02 +0100 Subject: Implement slide text deletion --- libstorycode/slide.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'libstorycode/slide.c') diff --git a/libstorycode/slide.c b/libstorycode/slide.c index cb2a5a1..a3dfcc7 100644 --- a/libstorycode/slide.c +++ b/libstorycode/slide.c @@ -28,6 +28,11 @@ #include #include #include +#include + +#ifdef HAVE_PANGO +#include +#endif #include "slide.h" #include "slide_priv.h" @@ -326,3 +331,62 @@ void slide_item_split_text_paragraph(SlideItem *item, int para, size_t off) item->paras[para+1].layout = NULL; item->paras[para].text[off] = '\0'; } + + +static void delete_paragraph(SlideItem *item, int del) +{ + int i; + +#ifdef HAVE_PANGO + g_object_unref(item->paras[del].layout); +#endif + free(item->paras[del].text); + + for ( i=del; in_paras-1; i++ ) { + item->paras[i] = item->paras[i+1]; + } + item->n_paras--; +} + + +void slide_item_delete_text(SlideItem *item, int i1, size_t o1, int i2, size_t o2) +{ + int i; + int n_del = 0; + + /* Starting item */ + if ( i1 == i2 ) { + memmove(&item->paras[i1].text[o1], + &item->paras[i1].text[o2], + strlen(item->paras[i1].text)-o2+1); + return; /* easy case */ + } else { + item->paras[i1].text[o1] = '\0'; + } + + /* Middle items */ + for ( i=i1+1; iparas[i2].text[0], + &item->paras[i2].text[o2], + strlen(&item->paras[i2].text[o2])+1); + + assert(i1 != i2); + char *new_text; + size_t len = strlen(item->paras[i1].text); + len += strlen(item->paras[i2].text); + new_text = malloc(len+1); + if ( new_text == NULL ) return; + strcpy(new_text, item->paras[i1].text); + strcat(new_text, item->paras[i2].text); + free(item->paras[i1].text); + item->paras[i1].text = new_text; + delete_paragraph(item, i2); +} -- cgit v1.2.3