Introduction
Introduction Statistics Contact Development Disclaimer Help
initial arrow implementation - gramscii - A simple editor for ASCII box-and-arr…
Log
Files
Refs
Tags
README
LICENSE
---
commit 34a0ec991e4985d3ca4719ffc696f681370e14fc
parent 5dd00eaf46bd250099c368c7b4a66e0e4dfc4b6f
Author: KatolaZ <[email protected]>
Date: Fri, 19 Jul 2019 12:04:44 +0100
initial arrow implementation
Diffstat:
M gramscii.c | 139 +++++++++++++++++++++++++++++…
1 file changed, 132 insertions(+), 7 deletions(-)
---
diff --git a/gramscii.c b/gramscii.c
@@ -17,6 +17,7 @@
#define TEXT 0x04
+#define DIR_N 0x00
#define DIR_R 0x01
#define DIR_U 0x02
#define DIR_D 0x04
@@ -50,12 +51,12 @@ int y;
int step;
char cursor;
char corner;
-char hlines[] = {"-~=#@._"};
-char vlines[] = {"|H#@:;i"};
+char hlines[] = {"-~=#@._ "};
+char vlines[] = {"|H#@:;i "};
char corners[] = {"+'H#@.\""};
-int hlines_sz= sizeof(hlines);
-int vlines_sz= sizeof(vlines);
-int corners_sz = sizeof(corners);
+int hlines_sz= sizeof(hlines) -1;
+int vlines_sz= sizeof(vlines) -1;
+int corners_sz = sizeof(corners) -1;
int cur_hl, cur_vl, cur_corn;
char line_h;
char line_v;
@@ -137,7 +138,6 @@ void redraw(){
}
status_bar();
show_cursor();
- step = 1;
}
void update_current(){
@@ -235,8 +235,8 @@ void draw_box(int x1, int y1, int fix){
void get_box(){
char c;
int orig_x=x, orig_y=y;
-
redraw();
+ step = 1;
draw_box(x,y,NOFIX);
while((c=getchar())!=EOF && c != 27 && c!= 'b'){
switch(c){
@@ -259,6 +259,7 @@ void get_box(){
}
check_bound();
redraw();
+ step = 1;
draw_box(orig_x, orig_y, NOFIX);
status_bar();
show_cursor();
@@ -270,6 +271,126 @@ void get_box(){
}
+int progr_x(int dir){
+ switch(dir){
+ case DIR_L:
+ return -1;
+ case DIR_R:
+ return +1;
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+
+int progr_y(int dir){
+ switch(dir){
+ case DIR_D:
+ return +1;
+ case DIR_U:
+ return -1;
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+
+/* FIXME: fix pointer position */
+/* FIXME: set initial and final markers */
+/* FIXME: draw "corner" as first char after change of dir */
+void draw_arrow(int x, int y, char *a, int a_len, int fix){
+
+ int i, j;
+ char line;
+ void (*f)(int, int, char);
+
+
+ if (fix == FIX)
+ f = set_xy;
+ else
+ f = draw_xy;
+
+ if (!a_len){
+ f(x,y,corner);
+ return;
+ }
+ line = (a[0] & DIR_L) || (a[0] & DIR_R) ? line_h : line_v;
+ f(x,y,line);
+ for (i=0; i<a_len; i+=2){
+ for(j=0; j<a[i+1]; j++){
+ line = (a[i] & DIR_L) || (a[i] & DIR_R) ? line_h : lin…
+ x += progr_x(a[i]);
+ y += progr_y(a[i]);
+ f(x, y, line);
+ }
+ }
+ show_cursor();
+}
+
+void get_arrow(){
+
+ char c;
+ int orig_x=x, orig_y=y, arrow_len;
+ static char *arrow = NULL;
+ static int arrow_sz;
+
+ if (!arrow){
+ arrow_sz = 100;
+ arrow = malloc(arrow_sz * sizeof(char));
+ }
+ arrow_len = 0;
+ dir = DIR_N;
+
+ redraw();
+ step = 1;
+ //draw_arrow(x,y,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;
+ }
+ check_bound();
+ /* FIXME: if we are out of bound, do nothing? */
+ if (arrow_len == arrow_sz){
+ arrow_sz *=2;
+ arrow = realloc(arrow, arrow_sz * sizeof(char));
+ }
+ arrow[arrow_len++] = dir;
+ arrow[arrow_len++] = step;
+ redraw();
+ step = 1;
+ draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX);
+ status_bar();
+ show_cursor();
+ }
+ if (c == 'a')
+ draw_arrow(orig_x, orig_y, arrow, arrow_len, FIX);
+ redraw();
+ state = MOVE;
+}
+
void write_file(){
char fname[256];
FILE *f;
@@ -333,6 +454,10 @@ void commands(){
state = BOX;
get_box();
break;
+ case 'a':
+ state = ARROW;
+ get_arrow();
+ break;
case 'w':
write_file();
break;
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.