URI: 
       fix arrow pointer -- toggle start and end markers - gramscii - A simple editor for ASCII box-and-arrow charts
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit a2bf8545d73621de7cfa3a06663d1b94fdc668c4
   DIR parent 34a0ec991e4985d3ca4719ffc696f681370e14fc
  HTML Author: KatolaZ <katolaz@freaknet.org>
       Date:   Fri, 19 Jul 2019 15:38:14 +0100
       
       fix arrow pointer -- toggle start and end markers
       
       Diffstat:
         M TODO                                |       4 +++-
         M gramscii.c                          |      63 +++++++++++++++++++++++++------
       
       2 files changed, 54 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/TODO b/TODO
       @@ -1,13 +1,15 @@
        + optimize redraws (i.e., avoid to redraw if possible)
        - (?) change cursor shape according to action
        - save to file
       -- implement arrow
       +- implement auto-arrow 'A' (automatic end-char)
       +- implement delete 'x' or 'd' 
        - manage special chars (DEL/CANC) during text insert
          (also do not print unmanaged chars!)
        - load from file
        - insert file at position
        - get screen geometry
        - allow scrolling (both vertical and horizontal)
       +* implement arrow
        * set different line styles (done for hl, vl, corner)
        * add status bar
        * implement box
   DIR diff --git a/gramscii.c b/gramscii.c
       @@ -23,6 +23,8 @@
        #define DIR_D  0x04
        #define DIR_L  0x08
        
       +#define DIR_HOR (DIR_R | DIR_L)
       +#define DIR_VER (DIR_D | DIR_U)
        
        #define WIDTH  100
        #define HEIGHT  25
       @@ -54,12 +56,20 @@ char corner;
        char hlines[]  = {"-~=#@._ "};
        char vlines[]  = {"|H#@:;i "};
        char corners[] = {"+'H#@.\""};
       +char st_marks[] = {"+o-|<>^v"};
       +char end_marks[] = {">+o-|<^v"};
       +
        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;
       +int stmarks_sz = sizeof(st_marks) - 1;
       +int endmarks_sz = sizeof(st_marks) - 1;
       +
       +int cur_hl, cur_vl, cur_corn, cur_start, cur_end;
        char line_h;
        char line_v;
       +char mark_st;
       +char mark_end;
        
        struct termios t1, t2;
        
       @@ -99,8 +109,11 @@ void init_screen(){
                cur_corn = 0;
                corner = corners[0];
                cur_hl = cur_vl = 0;
       +        cur_start = cur_end = 0;
                line_h = hlines[cur_hl];
                line_v = vlines[cur_vl];
       +        mark_st = st_marks[cur_start];
       +        mark_end = end_marks[cur_end];
        }
        
        char* state_str(){
       @@ -123,8 +136,8 @@ char* state_str(){
        void status_bar(){
                
                printf("\033[%d;1f\033[7m", HEIGHT+1);
       -        printf(" x: %3d y: %3d -- mode: %4s hl: %c vl: %c cn: %c %10s", 
       -                x, y, state_str(), line_h, line_v, corner, "");
       +        printf(" x: %3d y: %3d -- mode: %4s hl: %c vl: %c cn: %c <: %c >: %c %10s", 
       +                x, y, state_str(), line_h, line_v, corner, mark_st, mark_end, "");
        
                printf("\033[0m");
        }
       @@ -297,12 +310,9 @@ int progr_y(int dir){
        }
        
        
       -/* 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;
       +        int i, j, cur_dir;
                char line;
                void (*f)(int, int, char);
        
       @@ -312,20 +322,31 @@ void draw_arrow(int x, int y, char *a, int a_len, int fix){
                else
                        f = draw_xy;
        
       +        f(x,y,mark_st);
                if (!a_len){
       -                f(x,y,corner);
       +                show_cursor();
                        return;
                }
       -        line = (a[0] & DIR_L) || (a[0] & DIR_R) ? line_h : line_v;
       -        f(x,y,line);
       +        cur_dir=DIR_N;
                for (i=0; i<a_len; i+=2){
       +                if (i>0) {
       +                        /* If we are switching between horizontal and vertical, put a "corner" */
       +                        if (((cur_dir & DIR_HOR) && (a[i] & DIR_VER)) ||
       +                            ((cur_dir & DIR_VER) && (a[i] & DIR_HOR))){
       +                                f(x,y,corner);
       +                                show_cursor();
       +                        }
       +                }
                        for(j=0; j<a[i+1]; j++){
                                line = (a[i] & DIR_L) || (a[i] & DIR_R) ? line_h : line_v;
                                x += progr_x(a[i]);
                                y += progr_y(a[i]);
                                f(x, y, line); 
                        }
       +                /* f(x,y,mark_end);*/
       +                cur_dir = a[i];
                }
       +        f(x,y,mark_end);
                show_cursor();
        }
        
       @@ -345,7 +366,7 @@ void get_arrow(){
                
                redraw();
                step = 1;
       -        //draw_arrow(x,y,NOFIX);
       +        draw_arrow(x,y, arrow, 0, NOFIX);
                while((c=getchar())!=EOF && c != 27 && c!= 'a'){
                        switch(c){
                                case 'H': step = 5;
       @@ -417,6 +438,18 @@ void toggle_vline(){
        
        }
        
       +void toggle_st_mark(){
       +        
       +        cur_start = (cur_start + 1 ) % stmarks_sz;
       +        mark_st = st_marks[cur_start];
       +}
       +
       +void toggle_end_mark(){
       +        
       +        cur_end = (cur_end+ 1 ) % endmarks_sz;
       +        mark_end = end_marks[cur_end];
       +}
       +
        void commands(){
        
                char c;
       @@ -467,9 +500,15 @@ void commands(){
                                case '|':
                                        toggle_vline();
                                        break;
       -                        case '+':
       +                        case '+': 
                                        toggle_corner();
                                        break;
       +                        case '<': 
       +                                toggle_st_mark();
       +                                break;
       +                        case '>':
       +                                toggle_end_mark();
       +                                break;
                                case 'Q':
                                case 'q':
                                        cleanup(0);