visual mode (erase and fill) - gramscii - A simple editor for ASCII box-and-arrow charts DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- DIR commit d87cf8ea7ec68de924179eb1dbaa13f4b52bd1aa DIR parent c8512825e3baf1525af7117affa13d00ac6b0d1d HTML Author: KatolaZ <katolaz@freaknet.org> Date: Sat, 20 Jul 2019 14:47:12 +0100 visual mode (erase and fill) Diffstat: M TODO | 7 ++++--- M gramscii.c | 66 +++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) --- DIR diff --git a/TODO b/TODO @@ -2,11 +2,12 @@ - (?) change cursor shape according to action - auto-arrow 'A' (automatic end-char) - read file at point -- visual selection ++ visual selection - crop - - fill - - delete - yank/put + * fill + * delete +- change screen management (i.e., use an array of lines) - undo (by storing lines changed across insert/remove operations) - manage special chars (DEL/CANC) during text insert (also do not print unmanaged chars!) DIR diff --git a/gramscii.c b/gramscii.c @@ -16,6 +16,7 @@ #define ARROW 0x02 #define TEXT 0x04 #define DEL 0x08 +#define VIS 0x10 #define DIR_N 0x00 #define DIR_R 0x01 @@ -45,6 +46,9 @@ #define END 0x02 #define MIDDLE 0x04 +#define VIDEO_NRM 0 +#define VIDEO_REV 7 + #define MIN(x,y) (x) < (y) ? (x) : (y) #define MAX(x,y) (x) > (y) ? (x) : (y) @@ -188,6 +192,21 @@ void erase_line(char *s){ } } +void erase_box(int x1, int y1, char c){ + + int x_incr, y_incr, i; + + x_incr = x1 < x? +1: -1; + y_incr = y1 < y? +1: -1; + do{ + i = y1; + do{ + set_xy(x1, i, c); + } while(i != y && (1 | (i += y_incr))); + } while(x1 != x && (1 | (x1 += x_incr))); + +} + void erase_screen(){ int i; for(i=0;i<HEIGHT; i++) @@ -297,6 +316,10 @@ int progr_y(int dir){ return dir == DIR_U ? -1 : dir == DIR_D ? 1: 0; } +void set_video(int v){ + printf("\033[%dm", v); +} + /*** Lines and markers ***/ void toggle_hline(){ @@ -626,6 +649,45 @@ void new_file(){ modified=0; } +/*** Visual ***/ + + +void visual_box(){ + int orig_x =x, orig_y = y; + char c, f = BG; + + redraw(); + step = 1; + set_video(VIDEO_REV); + draw_box(x,y,NOFIX); + while((c=getchar())!=EOF && c != 27 && c!= 'v'){ + if (!move_around(c)) switch(c){ + case 'f':/* fill */ + f = get_key("fill char: "); + case 'x':/* erase */ + erase_box(orig_x, orig_y, f); + modified = 1; + goto vis_exit; + break; + } + check_bound(); + set_video(VIDEO_NRM); + redraw(); + step = 1; + f = BG; + set_video(VIDEO_REV); + draw_box(orig_x, orig_y, NOFIX); + status_bar(); + show_cursor(); + } +vis_exit: + set_video(VIDEO_NRM); + redraw(); + state = MOVE; +} + + + /*** Commands ***/ void commands(){ @@ -665,6 +727,10 @@ void commands(){ state = DEL; delete(); break; + case 'v': + state = VIS; + visual_box(); + break; case '-': toggle_hline(); break;