aboutsummaryrefslogtreecommitdiff
path: root/libstorycode/gtk/gtknarrativeview.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2019-03-10 09:29:25 +0100
committerThomas White <taw@physics.org>2019-03-10 09:29:25 +0100
commit22f935dc19ff670e8168059663676d432bcaeef2 (patch)
tree87cd9a1e5a8b8cb471d8479fc5ac182115666c40 /libstorycode/gtk/gtknarrativeview.c
parentb147d7a36768dc5789ff47a77fd149034ee87d69 (diff)
Implement delete
Diffstat (limited to 'libstorycode/gtk/gtknarrativeview.c')
-rw-r--r--libstorycode/gtk/gtknarrativeview.c151
1 files changed, 90 insertions, 61 deletions
diff --git a/libstorycode/gtk/gtknarrativeview.c b/libstorycode/gtk/gtknarrativeview.c
index d33dc3b..47ee43c 100644
--- a/libstorycode/gtk/gtknarrativeview.c
+++ b/libstorycode/gtk/gtknarrativeview.c
@@ -143,6 +143,16 @@ static void rewrap_range(GtkNarrativeView *e, int min, int max)
}
+static void update_size(GtkNarrativeView *e)
+{
+ e->w = e->visible_width;
+ e->h = narrative_get_height(presentation_get_narrative(e->p));
+
+ set_vertical_params(e);
+ set_horizontal_params(e);
+}
+
+
static gboolean resize_sig(GtkWidget *widget, GdkEventConfigure *event,
GtkNarrativeView *e)
{
@@ -156,11 +166,7 @@ static gboolean resize_sig(GtkWidget *widget, GdkEventConfigure *event,
rewrap_range(e, 0, n->n_items-1);
- e->w = e->visible_width;
- e->h = narrative_get_height(presentation_get_narrative(e->p));
-
- set_vertical_params(e);
- set_horizontal_params(e);
+ update_size(e);
return FALSE;
}
@@ -496,6 +502,10 @@ static size_t pos_trail_to_offset(struct narrative_item *item, int offs, int tra
glong char_offs;
char *ptr;
+ if ( item->type == NARRATIVE_ITEM_SLIDE ) {
+ return offs;
+ }
+
char_offs = g_utf8_pointer_to_offset(item->text, item->text+offs);
char_offs += trail;
ptr = g_utf8_offset_to_pointer(item->text, char_offs);
@@ -619,49 +629,12 @@ static void check_cursor_visible(GtkNarrativeView *e)
}
-static void do_backspace(GtkNarrativeView *e)
+static struct narrative_item *get_current_item(GtkNarrativeView *e,
+ Narrative **pn)
{
-// double wrapw = e->cursor_frame->w - e->cursor_frame->pad_l - e->cursor_frame->pad_r;
-//
-// if ( e->sel_active ) {
-//
-// /* Delete the selected block */
-// delete_text_from_frame(e->cursor_frame, e->sel_start, e->sel_end, wrapw);
-//
-// /* Cursor goes at start of deletion */
-// sort_positions(&e->sel_start, &e->sel_end);
-// e->cpos = e->sel_start;
-// e->sel_active = 0;
-//
-// } else {
-//
-// if ( para_type(e->cursor_frame->paras[e->cpos.para]) == PARA_TYPE_TEXT ) {
-//
-// /* Delete one character */
-// struct edit_pos p1, p2;
-//
-// p1 = e->cpos;
-//
-// p2 = p1;
-//
-// cursor_moveh(e->cursor_frame, &p2, -1);
-// show_edit_pos(p1);
-// show_edit_pos(p2);
-//
-// delete_text_from_frame(e->cursor_frame, p1, p2, wrapw);
-// e->cpos = p2;
-//
-// } else {
-//
-// /* FIXME: Implement this */
-// fprintf(stderr, "Deleting non-text paragraph\n");
-//
-// }
-//
-// }
-
- emit_change_sig(e);
- redraw(e);
+ Narrative *n = presentation_get_narrative(e->p);
+ if ( pn != NULL ) *pn = n;
+ return &n->items[e->cpos.para];
}
@@ -670,7 +643,26 @@ static size_t end_offset_of_para(Narrative *n, int pnum)
assert(pnum >= 0);
if ( n->items[pnum].type == NARRATIVE_ITEM_SLIDE ) return 0;
return strlen(n->items[pnum].text);
+}
+
+static void sort_positions(struct edit_pos *a, struct edit_pos *b)
+{
+ if ( a->para > b->para ) {
+ size_t tpos;
+ int tpara, ttrail;
+ tpara = b->para; tpos = b->pos; ttrail = b->trail;
+ b->para = a->para; b->pos = a->pos; b->trail = a->trail;
+ a->para = tpara; a->pos = tpos; a->trail = ttrail;
+ }
+
+ if ( (a->para == b->para) && (a->pos > b->pos) )
+ {
+ size_t tpos = b->pos;
+ int ttrail = b->trail;
+ b->pos = a->pos; b->trail = a->trail;
+ a->pos = tpos; a->trail = ttrail;
+ }
}
@@ -730,6 +722,53 @@ static void cursor_moveh(Narrative *n, struct edit_pos *cp, signed int dir)
}
+static void do_backspace(GtkNarrativeView *e)
+{
+ Narrative *n;
+ size_t o1, o2;
+
+ n = presentation_get_narrative(e->p);
+
+ if ( e->sel_active ) {
+
+ /* Delete the selected block */
+ sort_positions(&e->sel_start, &e->sel_end);
+ o1 = pos_trail_to_offset(&n->items[e->sel_start.para],
+ e->sel_start.pos, e->sel_start.trail);
+ o2 = pos_trail_to_offset(&n->items[e->sel_end.para],
+ e->sel_end.pos, e->sel_end.trail);
+ narrative_delete_block(n, e->sel_start.para, o1,
+ e->sel_end.para, o2);
+
+ /* Cursor goes at start of deletion */
+ e->cpos = e->sel_start;
+ e->sel_active = 0;
+
+ } else {
+
+ struct edit_pos p1, p2;
+
+ /* Delete one character, as represented visually */
+ p2 = e->cpos;
+ p1 = p2;
+ cursor_moveh(n, &p1, -1);
+ o1 = pos_trail_to_offset(&n->items[p1.para], p1.pos, p1.trail);
+ o2 = pos_trail_to_offset(&n->items[p2.para], p2.pos, p2.trail);
+ narrative_delete_block(n, p1.para, o1, p2.para, o2);
+ e->cpos = p1;
+
+ }
+
+ /* The only paragraphs which still exist and might have been
+ * affected by the deletion are sel_start.para and the one
+ * immediately afterwards. */
+ rewrap_range(e, e->sel_start.para, e->sel_start.para+1);
+ update_size(e);
+ emit_change_sig(e);
+ redraw(e);
+}
+
+
static void insert_text_in_paragraph(struct narrative_item *item, size_t offs,
char *t)
{
@@ -753,12 +792,11 @@ static void insert_text(char *t, GtkNarrativeView *e)
do_backspace(e);
}
- n = presentation_get_narrative(e->p);
- item = &n->items[e->cpos.para];
+ item = get_current_item(e, &n);
if ( strcmp(t, "\n") == 0 ) {
//split_paragraph_at_cursor(e); FIXME
- //update_size(e);
+ update_size(e);
cursor_moveh(n, &e->cpos, +1);
check_cursor_visible(e);
emit_change_sig(e);
@@ -773,7 +811,7 @@ static void insert_text(char *t, GtkNarrativeView *e)
off = pos_trail_to_offset(item, e->cpos.pos, e->cpos.trail);
insert_text_in_paragraph(item, off, t);
rewrap_range(e, e->cpos.para, e->cpos.para);
- //update_size(e);
+ update_size(e);
cursor_moveh(n, &e->cpos, +1);
} else {
@@ -899,14 +937,6 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
switch ( event->keyval ) {
- case GDK_KEY_Escape :
- if ( !e->para_highlight ) {
- //sc_editor_remove_cursor(e);
- redraw(e);
- claim = 1;
- }
- break;
-
case GDK_KEY_Left :
cursor_moveh(n, &e->cpos, -1);
redraw(e);
@@ -931,14 +961,13 @@ static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
claim = 1;
break;
-
case GDK_KEY_Return :
im_commit_sig(NULL, "\n", e);
claim = 1;
break;
case GDK_KEY_BackSpace :
- //do_backspace(e->selection, e);
+ do_backspace(e);
claim = 1;
break;