delete and default write file - gramscii - A simple editor for ASCII box-and-ar… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit 575703d810415c9f427104ab0225a1e5916983ec | |
parent 52a48d7718c6467da380a51f49327323e15e00c7 | |
Author: KatolaZ <[email protected]> | |
Date: Fri, 19 Jul 2019 19:23:38 +0100 | |
delete and default write file | |
Diffstat: | |
M TODO | 3 ++- | |
M gramscii.c | 143 +++++++++++++++++++----------… | |
2 files changed, 92 insertions(+), 54 deletions(-) | |
--- | |
diff --git a/TODO b/TODO | |
@@ -1,7 +1,6 @@ | |
+ optimize redraws (i.e., avoid to redraw if possible) | |
- (?) change cursor shape according to action | |
- auto-arrow 'A' (automatic end-char) | |
-- delete -- 'x' or 'd' | |
- load from file | |
- read file at point | |
- visual selection | |
@@ -14,6 +13,8 @@ | |
(also do not print unmanaged chars!) | |
- get screen geometry | |
- allow scrolling (both vertical and horizontal) | |
+* write to new file / default file | |
+* delete -- 'x' | |
* save to file | |
* implement arrow | |
* set different line styles (done for hl, vl, corner) | |
diff --git a/gramscii.c b/gramscii.c | |
@@ -15,7 +15,7 @@ | |
#define BOX 0x01 | |
#define ARROW 0x02 | |
#define TEXT 0x04 | |
- | |
+#define DEL 0x08 | |
#define DIR_N 0x00 | |
#define DIR_R 0x01 | |
@@ -55,6 +55,7 @@ int dir; | |
int x; | |
int y; | |
int step; | |
+int force_new; | |
char cursor; | |
char corner; | |
char hlines[] = {"-~=#@._ "}; | |
@@ -75,6 +76,9 @@ char line_v; | |
char mark_st; | |
char mark_end; | |
+char modified; | |
+char fname[256]; | |
+ | |
struct termios t1, t2, t3; | |
@@ -130,6 +134,8 @@ char* state_str(){ | |
return "box"; | |
case ARROW: | |
return "arr"; | |
+ case DEL: | |
+ return "del"; | |
default: | |
return "ERR"; | |
} | |
@@ -178,6 +184,8 @@ void init(){ | |
init_screen(); | |
x = WIDTH/2; | |
y = HEIGHT/2; | |
+ modified = 0; | |
+ fname[0] = '\0'; | |
redraw(); | |
} | |
@@ -249,10 +257,33 @@ void draw_box(int x1, int y1, int fix){ | |
} | |
-void move_around(char c){ | |
- | |
- | |
+int move_around(char c){ | |
+ switch(c){ | |
+ case 'H': step = 5; | |
+ case 'h': | |
+ dir = DIR_L; | |
+ x -= step; | |
+ break; | |
+ case 'J': step = 5; | |
+ case 'j': | |
+ dir = DIR_D; | |
+ y += step; | |
+ break; | |
+ case 'K': step = 5; | |
+ case 'k': | |
+ dir = DIR_U; | |
+ y -= step; | |
+ break; | |
+ case 'L': step = 5; | |
+ case 'l': | |
+ dir = DIR_R; | |
+ x += step; | |
+ break; | |
+ default: | |
+ return 1; | |
+ } | |
+ return 0; | |
} | |
@@ -263,24 +294,7 @@ void get_box(){ | |
step = 1; | |
draw_box(x,y,NOFIX); | |
while((c=getchar())!=EOF && c != 27 && c!= 'b'){ | |
- switch(c){ | |
- case 'H': step = 5; | |
- case 'h': | |
- x -= step; | |
- break; | |
- case 'J': step = 5; | |
- case 'j': | |
- y += step; | |
- break; | |
- case 'K': step = 5; | |
- case 'k': | |
- y -= step; | |
- break; | |
- case 'L': step = 5; | |
- case 'l': | |
- x += step; | |
- break; | |
- } | |
+ if (move_around(c)) continue; | |
check_bound(); | |
redraw(); | |
step = 1; | |
@@ -363,30 +377,7 @@ void get_arrow(){ | |
step = 1; | |
draw_arrow(x,y, arrow, 0, NOFIX); | |
while((c=getchar())!=EOF && c != 27 && c!= 'a'){ | |
- switch(c){ | |
- case 'H': step = 5; | |
- case 'h': | |
- dir = DIR_L; | |
- x -= step; | |
- break; | |
- case 'J': step = 5; | |
- case 'j': | |
- dir = DIR_D; | |
- y += step; | |
- break; | |
- case 'K': step = 5; | |
- case 'k': | |
- dir = DIR_U; | |
- y -= step; | |
- break; | |
- case 'L': step = 5; | |
- case 'l': | |
- dir = DIR_R; | |
- x += step; | |
- break; | |
- default: | |
- continue; | |
- } | |
+ if (move_around(c)) continue; | |
check_bound(); | |
/* FIXME: if we are out of bound, do nothing? */ | |
if (arrow_len == arrow_sz){ | |
@@ -438,17 +429,18 @@ int is_yes(char c){ | |
} | |
void write_file(){ | |
- char fname[256]; | |
FILE *f; | |
int i; | |
- | |
- get_string(fname, 255); | |
- if (f=fopen(fname, "r")){ | |
- if (!is_yes(get_key("File exists. Overwrite [y/N]?")) ){ | |
+ | |
+ if (!fname[0] || force_new){ | |
+ get_string(fname, 255); | |
+ if (f=fopen(fname, "r")){ | |
+ if (!is_yes(get_key("File exists. Overwrite [y/N]?")) … | |
+ fclose(f); | |
+ return; | |
+ } | |
fclose(f); | |
- return; | |
} | |
- fclose(f); | |
} | |
if((f=fopen(fname, "w"))==NULL){ | |
get_key("Error opening file."); | |
@@ -512,6 +504,44 @@ void go_to(int where){ | |
show_cursor(); | |
} | |
+void do_delete(int x1, int y1){ | |
+ int i; | |
+ switch(dir){ | |
+ case DIR_R: | |
+ for(i=x1; i<=x; i++) set_xy(i,y,BG); | |
+ break; | |
+ case DIR_L: | |
+ for(i=x1; i>=x; i--) set_xy(i,y,BG); | |
+ break; | |
+ case DIR_U: | |
+ for(i=y1; i>=y; i--) set_xy(x,i,BG); | |
+ break; | |
+ case DIR_D: | |
+ for(i=y1; i<=y; i++) set_xy(x,i,BG); | |
+ break; | |
+ } | |
+} | |
+ | |
+ | |
+void delete(){ | |
+ char c; | |
+ int orig_x = x, orig_y = y; | |
+ status_bar(); | |
+ show_cursor(); | |
+ while((c=getchar())!=EOF && c!=27 && c!= 'x'){ | |
+ if (move_around(c)) continue; | |
+ check_bound(); | |
+ step = 1; | |
+ do_delete(orig_x, orig_y); | |
+ orig_x = x; | |
+ orig_y = y; | |
+ redraw(); | |
+ status_bar(); | |
+ show_cursor(); | |
+ } | |
+ state = MOVE; | |
+} | |
+ | |
void commands(){ | |
@@ -554,6 +584,8 @@ void commands(){ | |
state = ARROW; | |
get_arrow(); | |
break; | |
+ case 'W': | |
+ force_new = 1; | |
case 'w': | |
write_file(); | |
break; | |
@@ -566,6 +598,10 @@ void commands(){ | |
case 'm': | |
go_to(MIDDLE); | |
break; | |
+ case 'x': | |
+ state = DEL; | |
+ delete(); | |
+ break; | |
case '-': | |
toggle_hline(); | |
break; | |
@@ -593,6 +629,7 @@ void commands(){ | |
status_bar(); | |
show_cursor(); | |
step = 1; | |
+ force_new = 0; | |
} | |
} |