boxes

Tracer des diagrammes dans un terminal - retour accueil

git clone git://bebou.netlib.re/boxes

Log | Files | Refs | README |

boxes.c (4817B)


      1 #define TB_IMPL
      2 #include "termbox2.h"
      3 
      4 #define MAX_BOX_NB 100
      5 
      6 struct box { int x; int y; int h; int w; };
      7 struct arrow { int startx; int starty; int endx; int endy; };
      8 struct boxpile { struct box* list; int count; };
      9 struct arrowpile { struct arrow* list; int count; };
     10 
     11 void drawboxcoord(int x, int y, int w, int h) {
     12 	if(w<0) { x=x+w; w=-w; }
     13 	if(h<0) { y=y+h; h=-h; }
     14 	tb_printf(x+w,y+h,TB_DEFAULT,TB_DEFAULT,"╯");
     15 	tb_printf(x+w,y,TB_DEFAULT,TB_DEFAULT,"╮");
     16 	tb_printf(x,y+h,TB_DEFAULT,TB_DEFAULT,"╰");
     17 	tb_printf(x,y,TB_DEFAULT,TB_DEFAULT,"╭");
     18 	for (int i=1;i<w;i++) {
     19 		tb_printf(x+i,y,TB_DEFAULT,TB_DEFAULT, "─");
     20 		tb_printf(x+i,y+h,TB_DEFAULT,TB_DEFAULT, "─");
     21 	}
     22 	for (int i=1;i<h;i++) {
     23 		tb_printf(x,y+i,TB_DEFAULT,TB_DEFAULT, "│");
     24 		tb_printf(x+w,y+i,TB_DEFAULT,TB_DEFAULT, "│");
     25 	}
     26 	tb_printf(0,0,TB_DEFAULT,TB_DEFAULT,"x: %d, y: %d\nw: %d, h: %d",x,y,w,h);
     27 }
     28 
     29 void drawbox(struct box b) { drawboxcoord(b.x,b.y,b.w,b.h); }
     30 
     31 void drawarrowcoord(int startx, int starty, int endx, int endy) {
     32 	int i=0; int j=0; signed int nx; signed int ny;
     33 	if(endx<startx) nx=-1; else nx=1;
     34 	if(endy<starty) ny=-1; else ny=1;
     35 	for(i=0;i<abs(startx-endx);i++) {
     36 		tb_printf(startx+nx*i,starty+ny*j,0,0,"─");
     37 	}
     38 	if(ny==1 && nx==1)       tb_printf(startx+nx*i,starty,0,0,"╮");
     39 	else if(ny==1 && nx==-1) tb_printf(startx+nx*i,starty,0,0,"╭");
     40 	else if(ny==-1 && nx==1) tb_printf(startx+nx*i,starty,0,0,"╯");
     41 	else                     tb_printf(startx+nx*i,starty,0,0,"╰");
     42 	for(int j=1;j<abs(starty-endy);j++) {
     43 		tb_printf(startx+nx*i,starty+ny*j,0,0,"│");
     44 	}
     45 	tb_printf(endx,endy,0,0,"→");
     46 	tb_printf(0,0,TB_DEFAULT,TB_DEFAULT,"start: x%d,y%d, end: x%d,y%d",startx,starty,endx,endy);
     47 }
     48 
     49 void drawarrow(struct arrow a) { drawarrowcoord(a.startx,a.starty,a.endx,a.endy); }
     50 
     51 struct arrow createarrow(int startx, int starty, int endx, int endy) {
     52 	struct arrow a;
     53 	a.startx=startx; a.starty=starty; a.endx=endx; a.endy=endy; return a;
     54 }
     55 
     56 void addarrow(struct arrowpile *arrows, struct arrow a) {
     57 	arrows->list[arrows->count]=a;
     58 	arrows->count++;
     59 }
     60 
     61 void deletearrow(struct arrowpile *arrows, int index) {
     62 	for (int i=index;i<arrows->count-1;i++) arrows->list[i]=arrows->list[i+1];
     63 	if(arrows->count>0) arrows->count--;
     64 }
     65 
     66 struct box createbox(int x, int y, int w, int h) {
     67 	struct box b; b.x=x; b.y=y; b.w=w; b.h=h; return b;
     68 }
     69 
     70 void addbox(struct boxpile *boxes, struct box b) {
     71 	boxes->list[boxes->count]=b;
     72 	boxes->count++;
     73 }
     74 
     75 void deletebox(struct boxpile *boxes, int index) {
     76 	for (int i=index;i<boxes->count-1;i++) boxes->list[i]=boxes->list[i+1];
     77 	if(boxes->count>0) boxes->count--;
     78 }
     79 
     80 int main(int argc, char **argv) {
     81 	tb_init();
     82 	tb_hide_cursor();
     83 	tb_set_input_mode(TB_INPUT_ESC | TB_INPUT_MOUSE);
     84 	int mode=0;
     85 	struct tb_event ev;
     86 	struct boxpile boxes; boxes.list=malloc(MAX_BOX_NB*sizeof(struct box)); boxes.count=0;
     87 	struct arrowpile arrows; arrows.list=malloc(MAX_BOX_NB*sizeof(struct arrow)); arrows.count=0;
     88 	int curx; int cury;
     89 	while(1) {
     90 		tb_clear();
     91 		for (int i=0;i<boxes.count;i++) drawbox(boxes.list[i]);
     92 		for (int i=0;i<arrows.count;i++) drawarrow(arrows.list[i]);
     93 		tb_printf(0,tb_height()-1,TB_DEFAULT,TB_DEFAULT,"count: %d, mode: %d",boxes.count,mode);
     94 		tb_present();
     95 		tb_poll_event(&ev);
     96 		switch(ev.ch) {
     97 			case 97: /*a*/
     98 				mode=1;
     99 				break;
    100 			case 98: /*b*/
    101 				mode=0;
    102 				break;
    103 		}
    104 		switch(ev.key) {
    105 			case 13: /*Enter*/
    106 				tb_shutdown();
    107 				free(boxes.list);
    108 				return 0;
    109 			case 65512: /*MouseLeft*/
    110 				switch(mode) {
    111 					case 0:
    112 						if(boxes.count==MAX_BOX_NB) break;
    113 						curx=ev.x; cury=ev.y;
    114 						while(ev.key!=65509) { /*MouseRelease*/
    115 							tb_clear();
    116 							for (int i=0;i<boxes.count;i++) drawbox(boxes.list[i]);
    117 							for (int i=0;i<arrows.count;i++) drawarrow(arrows.list[i]);
    118 							drawboxcoord(curx,cury,ev.x-curx,ev.y-cury);
    119 							tb_present();
    120 							tb_poll_event(&ev);
    121 						}
    122 						addbox(&boxes,createbox(curx,cury,ev.x-curx,ev.y-cury));
    123 						break;
    124 					case 1:
    125 						if(arrows.count==MAX_BOX_NB) break;
    126 						curx=ev.x; cury=ev.y;
    127 						while(ev.key!=65509) { /*MouseRelease*/
    128 							tb_clear();
    129 							for (int i=0;i<boxes.count;i++) drawbox(boxes.list[i]);
    130 							for (int i=0;i<arrows.count;i++) drawarrow(arrows.list[i]);
    131 							drawarrowcoord(curx,cury,ev.x,ev.y);
    132 							tb_present();
    133 							tb_poll_event(&ev);
    134 						}
    135 						addarrow(&arrows,createarrow(curx,cury,ev.x,ev.y));
    136 						break;
    137 				}
    138 				break;
    139 			case 26: /*ctrl+z*/
    140 				switch(mode) {
    141 					case 0:
    142 						deletebox(&boxes,boxes.count-1);
    143 						break;
    144 					case 1:
    145 						deletearrow(&arrows,arrows.count-1);
    146 						break;
    147 				}
    148 				break;
    149 			case 65511: /*MouseRight*/
    150 				for(int i=0;i<boxes.count;i++)
    151 					if(ev.x==boxes.list[i].x && ev.y==boxes.list[i].y) {
    152 						deletebox(&boxes,i);
    153 						break;
    154 					}
    155 				break;
    156 		}
    157 	}
    158 	return 0;
    159 }