iadd undo support for box, visual, cut/paste - gramscii - A simple editor for ASCII box-and-arrow charts Err bitreich.org 70 1Log /scm/gramscii/log.gph bitreich.org 70 1Files /scm/gramscii/files.gph bitreich.org 70 1Refs /scm/gramscii/refs.gph bitreich.org 70 1Tags /scm/gramscii/tag bitreich.org 70 1README /scm/gramscii/file/README.md.gph bitreich.org 70 1LICENSE /scm/gramscii/file/COPYING.gph bitreich.org 70 i--- Err bitreich.org 70 1commit f3100ddd486d6f39b0c97c9c492bb6020bf3caf1 /scm/gramscii/commit/f3100ddd486d6f39b0c97c9c492bb6020bf3caf1.gph bitreich.org 70 1parent 526ce3a130732d4a2374a6e36a689d9e0cf5cc34 /scm/gramscii/commit/526ce3a130732d4a2374a6e36a689d9e0cf5cc34.gph bitreich.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org bitreich.org 70 iDate: Wed, 31 Jul 2019 11:19:55 +0100 Err bitreich.org 70 i Err bitreich.org 70 iadd undo support for box, visual, cut/paste Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M TODO | 4 ++++ Err bitreich.org 70 i M draw.c | 32 +++++++++++++++++-------------- Err bitreich.org 70 i M gramscii.1 | 24 ++++++++++++++++++++++-- Err bitreich.org 70 i M gramscii.h | 4 ++-- Err bitreich.org 70 i M lineset.c | 38 +++++++++++++++++-------------- Err bitreich.org 70 i M screen.c | 4 ++-- Err bitreich.org 70 i Err bitreich.org 70 i6 files changed, 69 insertions(+), 37 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/gramscii/file/TODO.gph bitreich.org 70 i@@ -1,5 +1,9 @@ Err bitreich.org 70 i + optimize redraws (redraw only the modified rectangle) Err bitreich.org 70 i + undo (by storing lines changed across insert/remove operations) Err bitreich.org 70 i+ * re-organise undo-ring management Err bitreich.org 70 i+ - add undo for arrow mode Err bitreich.org 70 i+ - add undo for text mode Err bitreich.org 70 i+ - add undo for erase mode Err bitreich.org 70 i - fix bug with 'g' commands in arrow mode Err bitreich.org 70 i - add screen geometry option (-g 25x80?) Err bitreich.org 70 i - read file at point Err bitreich.org 70 1diff --git a/draw.c b/draw.c /scm/gramscii/file/draw.c.gph bitreich.org 70 i@@ -112,7 +112,7 @@ void draw_box(int x1, int y1, int fix){ Err bitreich.org 70 i Err bitreich.org 70 i if (fix == FIX){ Err bitreich.org 70 i f = set_xy; Err bitreich.org 70 i- copy_lines_to_ring(ymin, ymax, CUR); Err bitreich.org 70 i+ copy_lines_to_ring(ymin, ymax, PRV_STATE); Err bitreich.org 70 i } Err bitreich.org 70 i else Err bitreich.org 70 i f = draw_xy; Err bitreich.org 70 i@@ -130,7 +130,7 @@ void draw_box(int x1, int y1, int fix){ Err bitreich.org 70 i f(xmax, ymin, corner); Err bitreich.org 70 i f(xmax, ymax, corner); Err bitreich.org 70 i if (fix == FIX) Err bitreich.org 70 i- copy_lines_to_ring(ymin, ymax, LST); Err bitreich.org 70 i+ copy_lines_to_ring(ymin, ymax, NEW_STATE); Err bitreich.org 70 i show_cursor(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -316,10 +316,10 @@ void visual_box(FILE *fc){ Err bitreich.org 70 i case 'x':/* erase */ Err bitreich.org 70 i if (c == 'x') Err bitreich.org 70 i yank_region(MIN(orig_x,x), MIN(orig_y,y), MAX(orig_x, x), MAX(orig_y, y)); Err bitreich.org 70 i- copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), CUR); Err bitreich.org 70 i+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), PRV_STATE); Err bitreich.org 70 i erase_box(orig_x, orig_y, f); Err bitreich.org 70 i erase_blank_lines(MIN(y,orig_y), MAX(y, orig_y)); Err bitreich.org 70 i- copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), LST); Err bitreich.org 70 i+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), NEW_STATE); Err bitreich.org 70 i Err bitreich.org 70 i modified = 1; Err bitreich.org 70 i goto vis_exit; Err bitreich.org 70 i@@ -345,9 +345,9 @@ void paste(){ Err bitreich.org 70 i int y2; Err bitreich.org 70 i Err bitreich.org 70 i y2 = y + cutbuf.num - 1; Err bitreich.org 70 i- copy_lines_to_ring(y, y2, CUR); Err bitreich.org 70 i+ copy_lines_to_ring(y, y2, PRV_STATE); Err bitreich.org 70 i paste_region(x, y); Err bitreich.org 70 i- copy_lines_to_ring(y, y2, LST); Err bitreich.org 70 i+ copy_lines_to_ring(y, y2, NEW_STATE); Err bitreich.org 70 i redraw(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -356,28 +356,32 @@ void put_lines(lineset_t *u){ Err bitreich.org 70 i Err bitreich.org 70 i for (i=0; i< u->num; i++){ Err bitreich.org 70 i n = u->l[i].n; Err bitreich.org 70 i- ensure_line_length(&(screen.l[i]), u->l[i].lst); Err bitreich.org 70 i+ ensure_line_length(&(screen.l[i]), strlen(u->l[i].s)); Err bitreich.org 70 i strcpy(screen.l[n].s, u->l[i].s); Err bitreich.org 70 i- screen.l[n].lst = u->l[i].lst; Err bitreich.org 70 i+ screen.l[n].lst = strlen(u->l[i].s)-1; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void undo_change(){ Err bitreich.org 70 i if (undo_cur >= 0){ Err bitreich.org 70 i+ if (undo_cur > undo_lst) Err bitreich.org 70 i+ undo_cur = undo_lst; Err bitreich.org 70 i put_lines(& (undo[undo_cur])); Err bitreich.org 70 i- undo_cur --; Err bitreich.org 70 i+ undo_cur -= 2; Err bitreich.org 70 i+ modified = 1; Err bitreich.org 70 i } Err bitreich.org 70 i redraw(); Err bitreich.org 70 i- modified = 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void redo_change(){ Err bitreich.org 70 i- if (undo_cur < undo_lst){ Err bitreich.org 70 i- undo_cur ++; Err bitreich.org 70 i- put_lines(& (undo[undo_cur])); Err bitreich.org 70 i+ if (undo_cur <= undo_lst-2){ Err bitreich.org 70 i+ if (undo_cur > 0) Err bitreich.org 70 i+ put_lines(& (undo[undo_cur+1])); Err bitreich.org 70 i+ undo_cur +=2; Err bitreich.org 70 i+ put_lines(& (undo[undo_cur+1])); Err bitreich.org 70 i+ modified = 1; Err bitreich.org 70 i } Err bitreich.org 70 i redraw(); Err bitreich.org 70 i- modified = 1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/gramscii.1 b/gramscii.1 /scm/gramscii/file/gramscii.1.gph bitreich.org 70 i@@ -63,6 +63,26 @@ buffer contains the rectangle yanked/cut in Err bitreich.org 70 i .B visual Err bitreich.org 70 i mode. Err bitreich.org 70 i .TP 5m Err bitreich.org 70 i+.BI u Err bitreich.org 70 i+Undo the last change. gramscii supports an undo history of indefinite Err bitreich.org 70 i+length. The command Err bitreich.org 70 i+.BI u Err bitreich.org 70 i+gets the last change from the history, and moves the history pointer Err bitreich.org 70 i+back by one change. See the related command Err bitreich.org 70 i+.BI U Err bitreich.org 70 i+below. Err bitreich.org 70 i+.TP 5m Err bitreich.org 70 i+.BI U Err bitreich.org 70 i+Redo, i.e., cancel a previous Err bitreich.org 70 i+.BI u Err bitreich.org 70 i+command. gramscii supports an undo history of indefinite length. The Err bitreich.org 70 i+command Err bitreich.org 70 i+.BI U Err bitreich.org 70 i+moves to the following change, if possible. For instance, the sequence Err bitreich.org 70 i+.BI uuU Err bitreich.org 70 i+will go back two changes, and then forward one, effectively resetting Err bitreich.org 70 i+the state of the screen to what it was before the last change occurred. Err bitreich.org 70 i+.TP 5m Err bitreich.org 70 i .BI q Err bitreich.org 70 i Quit gramscii, and prompt for a filename if the current screen contains Err bitreich.org 70 i unsaved changes. Err bitreich.org 70 i@@ -516,8 +536,8 @@ support scrolling and "virtual" screens of any (reasonable) size. Err bitreich.org 70 i .PP Err bitreich.org 70 i gramscii currently does Err bitreich.org 70 i .B not Err bitreich.org 70 i-provide an "undo" command. This requires a restructuring of buffer Err bitreich.org 70 i-management, and will most probably be implemented in a future release. Err bitreich.org 70 i+support "undo" commands for arrow, text, and erase mode. This will be Err bitreich.org 70 i+added soon. Err bitreich.org 70 i .SH AUTHORS Err bitreich.org 70 i gramscii is written and maintained by Vincenzo "KatolaZ" Nicosia Err bitreich.org 70 i . You can use, copy, modify, and redistribute Err bitreich.org 70 1diff --git a/gramscii.h b/gramscii.h /scm/gramscii/file/gramscii.h.gph bitreich.org 70 i@@ -44,8 +44,8 @@ Err bitreich.org 70 i #define VIDEO_NRM 0 Err bitreich.org 70 i #define VIDEO_REV 7 Err bitreich.org 70 i Err bitreich.org 70 i-#define CUR 0x01 Err bitreich.org 70 i-#define LST 0x02 Err bitreich.org 70 i+#define PRV_STATE 0x01 Err bitreich.org 70 i+#define NEW_STATE 0x02 Err bitreich.org 70 i Err bitreich.org 70 i /** types **/ Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/lineset.c b/lineset.c /scm/gramscii/file/lineset.c.gph bitreich.org 70 i@@ -127,19 +127,24 @@ void paste_region(int x1, int y1){ Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void copy_lines_to_ring(int y1, int y2, int which){ Err bitreich.org 70 i- lineset_t *tmp; Err bitreich.org 70 i- int i, len, *idx; Err bitreich.org 70 i+ int i, len, idx; Err bitreich.org 70 i+ int offset; Err bitreich.org 70 i+ lineset_t *tmp; Err bitreich.org 70 i Err bitreich.org 70 i if (y1 > y2){ Err bitreich.org 70 i y1 ^= y2; Err bitreich.org 70 i y2 ^= y1; Err bitreich.org 70 i y1 ^= y2; Err bitreich.org 70 i } Err bitreich.org 70 i- if (which == CUR) Err bitreich.org 70 i- idx = &undo_cur; Err bitreich.org 70 i+ if (undo_cur > undo_lst) Err bitreich.org 70 i+ undo_cur = undo_lst; Err bitreich.org 70 i+ if (which == PRV_STATE){ /* adding a new previous state */ Err bitreich.org 70 i+ undo_cur += 2; Err bitreich.org 70 i+ idx = undo_cur; Err bitreich.org 70 i+ } Err bitreich.org 70 i else Err bitreich.org 70 i- idx = &undo_lst; Err bitreich.org 70 i- if (*idx == undo_sz - 1){ Err bitreich.org 70 i+ idx = undo_cur + 1; Err bitreich.org 70 i+ if (idx >= undo_sz - 1){ Err bitreich.org 70 i undo_sz += 10; Err bitreich.org 70 i tmp = realloc(undo, undo_sz * sizeof(lineset_t)); Err bitreich.org 70 i if (tmp == NULL){ Err bitreich.org 70 i@@ -148,22 +153,21 @@ void copy_lines_to_ring(int y1, int y2, int which){ Err bitreich.org 70 i } Err bitreich.org 70 i undo = tmp; Err bitreich.org 70 i } Err bitreich.org 70 i- (*idx) ++; Err bitreich.org 70 i- ensure_num_lines(&(undo[*idx]), y2 - y1 + 1); Err bitreich.org 70 i+ ensure_num_lines(&(undo[idx]), y2 - y1 + 1); Err bitreich.org 70 i for(i=y1; i<=y2; i++){ Err bitreich.org 70 i len = strlen(screen.l[i].s); Err bitreich.org 70 i- ensure_line_length(&(undo[*idx].l[i-y1]), len); Err bitreich.org 70 i- strcpy(undo[*idx].l[i-y1].s, screen.l[i].s); Err bitreich.org 70 i- undo[*idx].l[i-y1].n = i; Err bitreich.org 70 i- undo[*idx].l[i-y1].lst = screen.l[i].lst; Err bitreich.org 70 i+ ensure_line_length(&(undo[idx].l[i-y1]), len); Err bitreich.org 70 i+ strcpy(undo[idx].l[i-y1].s, screen.l[i].s); Err bitreich.org 70 i+ undo[idx].l[i-y1].n = i; Err bitreich.org 70 i+ undo[idx].l[i-y1].lst = screen.l[i].lst; Err bitreich.org 70 i } Err bitreich.org 70 i- undo[*idx].num = y2 - y1 + 1; Err bitreich.org 70 i- if (which == CUR) Err bitreich.org 70 i+ undo[idx].num = y2 - y1 + 1; Err bitreich.org 70 i+ if (which == PRV_STATE) Err bitreich.org 70 i undo_lst = undo_cur; Err bitreich.org 70 i #ifdef DEBUG Err bitreich.org 70 i- fprintf(stderr, "undo_ring: y1: %d y2: %d idx: %d\n", y1, y2, *idx); Err bitreich.org 70 i- for(i=0; i