add parallelogram mode - gramscii - A simple editor for ASCII box-and-arrow cha… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit a95019dfe0b64ed01051f2f059af7d7756d0dcdb | |
parent 257ec5d56fbe0ac65b04ae10bf36dd14e86c95a5 | |
Author: KatolaZ <[email protected]> | |
Date: Wed, 14 Aug 2019 07:59:53 +0100 | |
add parallelogram mode | |
Diffstat: | |
M TODO | 5 +++-- | |
M draw.c | 58 ++++++++++++++++++++++-------… | |
M gramscii.c | 6 +++++- | |
M gramscii.h | 12 +++++++++++- | |
M screen.c | 2 ++ | |
5 files changed, 63 insertions(+), 20 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,10 +1,10 @@ | |
+ optimize redraws (redraw only the modified rectangle) | |
+- implement comment (#: ignore everything until the end of the line) | |
- add screen geometry option (-g 25x80?) | |
-- maybe move "text" mode to "t" | |
+- (?)maybe move "text" mode to "t" | |
- implement ellipse | |
- (?) filled box (B) | |
- (?) manage filled box character (as for other styles) | |
-- implement comment (#: ignore until the end of the line) | |
+ parse control characters | |
+ parse arrows (text-mode will allow movements as well) | |
- (?) implement CTRL+G as abort (aside ESC) | |
@@ -14,6 +14,7 @@ | |
- allow scrolling (both vertical and horizontal) | |
- catch SIGWINCH and react appropriately (after scrolling is | |
enabled) | |
+* implement parallelogram mode (z/Z) | |
* fix bug in reading commands from files | |
* fix bug in visual crop | |
* read file at point | |
diff --git a/draw.c b/draw.c | |
@@ -143,8 +143,9 @@ void draw_box(int x1, int y1, int fix){ | |
void draw_parallelogram(int x1, int y1, char st, char fix){ | |
int xmin, ymin, xmax, ymax; | |
- int dy; | |
+ int dy, minoff, maxoff, xoff, xincr; | |
int i; | |
+ char lean; | |
void (*f)(int, int, char); | |
@@ -160,27 +161,47 @@ void draw_parallelogram(int x1, int y1, char st, char fix… | |
} | |
else | |
f = draw_xy; | |
- /*FIXME: INCOMPLETE -- CONTINUE HERE */ | |
- for(i=xmin+1; i<=xmax; i++){ | |
- f(i, ymin, line_h); | |
- f(i, ymax, line_h); | |
+ if (st & BOX_PARR){ | |
+ minoff = dy; | |
+ maxoff = 0; | |
+ lean = '/'; | |
+ xincr = -1; | |
} | |
- for(i=ymin+1; i<=ymax; i++){ | |
- f(xmin, i, line_v); | |
- f(xmax, i, line_v); | |
+ else { | |
+ minoff = 0; | |
+ maxoff = dy; | |
+ lean = '\\'; | |
+ xincr = +1; | |
} | |
- f(xmin, ymin, corner); | |
- f(xmin, ymax, corner); | |
- f(xmax, ymin, corner); | |
- f(xmax, ymax, corner); | |
+ for(i=xmin+1; i<=xmax-dy; i++){ | |
+ f(i+minoff, ymin, line_h); | |
+ f(i+maxoff, ymax, line_h); | |
+ } | |
+ | |
+ for(i=ymin+1, xoff=minoff; i<=ymax; i++, xoff += xincr){ | |
+ f(xmin+(xoff+xincr), i, lean); | |
+ if (minoff) | |
+ f(xmax - (minoff - xoff - xincr), i, lean); | |
+ else | |
+ f(xmax - (maxoff - xoff - xincr), i, lean); | |
+ } | |
+ f(xmin+minoff, ymin, corner); | |
+ f(xmin+maxoff, ymax, corner); | |
+ f(xmax-maxoff, ymin, corner); | |
+ f(xmax-minoff, ymax, corner); | |
if (fix == FIX) | |
copy_lines_to_ring(ymin, ymax, NEW_STATE); | |
show_cursor(); | |
- | |
- | |
} | |
+char flip_lean(char st){ | |
+ if (st & BOX_PARR) | |
+ return BOX_PARL; | |
+ else if (st & BOX_PARL) | |
+ return BOX_PARR; | |
+ return st; | |
+} | |
void get_box(FILE *fc, char st){ | |
char c; | |
@@ -189,6 +210,11 @@ void get_box(FILE *fc, char st){ | |
step = 1; | |
draw_box(x,y,NOFIX); | |
while((c=fgetc(fc))!=EOF && c != 27 && c!= 'b' && c != '\n'){ | |
+ if (c == 'Z'){ | |
+ st = flip_lean(st); | |
+ redraw(); | |
+ goto update_box; | |
+ } | |
if (change_style(c)) | |
goto update_box; | |
if (!move_around(c, fc, 1)) | |
@@ -208,8 +234,8 @@ update_box: | |
draw_box(orig_x, orig_y, FIX); | |
modified = 1; | |
} | |
- else if ((st & (BOX_PAR1 | BOX_PAR2)) && (c == 'z' || c == 'Z' || c =… | |
- draw_parallelogram(orig_x, orig_y, FIX); | |
+ else if ((st & (BOX_PARR | BOX_PARL)) && (c == 'z' || c == '\n')){ | |
+ draw_parallelogram(orig_x, orig_y, st, FIX); | |
modified = 1; | |
} | |
redraw(); | |
diff --git a/gramscii.c b/gramscii.c | |
@@ -90,7 +90,7 @@ void commands(FILE *fc){ | |
break; | |
case 'b': | |
mode = BOX; | |
- get_box(fc); | |
+ get_box(fc, BOX_RECT); | |
break; | |
case 'A': autoend=1; | |
case 'a': | |
@@ -134,6 +134,10 @@ void commands(FILE *fc){ | |
case 'r': | |
read_file_at(fc, x, y); | |
break; | |
+ case 'z': | |
+ mode = PAR; | |
+ get_box(fc, BOX_PARR); | |
+ break; | |
case 'q': | |
check_modified(fc);/** FALLTHROUGH **/ | |
case 'Q': | |
diff --git a/gramscii.h b/gramscii.h | |
@@ -18,6 +18,7 @@ | |
#define TEXT 0x04 | |
#define DEL 0x08 | |
#define VIS 0x10 | |
+#define PAR 0x20 | |
/**/ | |
/* directions */ | |
@@ -31,6 +32,15 @@ | |
#define DIR_VER (DIR_D | DIR_U) | |
/**/ | |
+/** box style **/ | |
+/* rectangular box */ | |
+#define BOX_RECT 0x00 | |
+/* parallelogram (leaning right) */ | |
+#define BOX_PARR 0x01 | |
+/* parallelogram (leaning left) */ | |
+#define BOX_PARL 0x02 | |
+/**/ | |
+ | |
#define NOFIX 0x0 | |
#define FIX 0x1 | |
@@ -169,7 +179,7 @@ int _isblank(int c); | |
/** drawing-related functions **/ | |
int change_style(char c); | |
void get_text(FILE *fc); | |
-void get_box(FILE *fc); | |
+void get_box(FILE *fc, char st); | |
void get_arrow(FILE *fc); | |
void erase(FILE *fc); | |
void visual_box(FILE *fc); | |
diff --git a/screen.c b/screen.c | |
@@ -35,6 +35,8 @@ char* mode_str(){ | |
return "del"; | |
case VIS: | |
return "vis"; | |
+ case PAR: | |
+ return "par"; | |
default: | |
return "ERR"; | |
} |