toolbox pour des tui - retour accueil
git clone git://bebou.netlib.re/tuit
Log | Files | Refs |
choose.c (3749B)
1 #define TB_IMPL 2 #include "termbox2.h" 3 4 /* Le chiffre c'est des octets. Les caractères sont encodés sur un octet chacun ? 5 * Donc si on met 5 la taille max serait 4 caractères ? */ 6 #define ELEM_SIZE 1000 7 8 int max(int a, int b) { return a > b ? a : b; } 9 int min(int a, int b) { return a < b ? a : b; } 10 11 int main(int argc, char **argv) { 12 int curelem=0; int allcount=0; int start=0; 13 int curline=2; 14 char line[ELEM_SIZE]; 15 char search[ELEM_SIZE]; 16 char **all; 17 18 while (fgets(line, sizeof(line), stdin)) { 19 if(strlen(line)==1) continue; 20 all=realloc(all,(allcount+1)*sizeof(void*)); 21 all[allcount] = malloc(ELEM_SIZE); 22 strcpy(all[allcount], line); 23 allcount++; 24 } 25 26 tb_init(); 27 tb_hide_cursor(); 28 tb_set_input_mode(TB_INPUT_ESC | TB_INPUT_MOUSE); 29 struct tb_event ev; 30 char buf[7]; buf[0]='\0'; 31 signed int filtered[allcount+1]; 32 filtered[allcount]=-1; 33 for (int i=0;i<allcount;i++) filtered[i]=i; 34 int filteredcount=allcount; 35 36 while(1) { 37 tb_clear(); 38 tb_printf(0,0,TB_DEFAULT,TB_DEFAULT,"> %s",buf); 39 int y=1; 40 for (int i=0;i<tb_height();i++) { 41 if(filtered[i+start]==-1) break; 42 if (i==curline-2) 43 tb_printf(0,y++,TB_BLACK,TB_WHITE,"> %s",all[filtered[i+start]]); 44 else 45 tb_printf(0,y++,TB_DEFAULT,TB_DEFAULT," %s",all[filtered[i+start]]); 46 } 47 tb_present(); 48 tb_poll_event(&ev); 49 switch(ev.type) { 50 case 1: 51 switch(ev.key) { 52 /* enter */ 53 case 13: 54 tb_shutdown(); 55 printf("%s",all[curelem]); 56 return 0; 57 /* esc */ 58 case 27: 59 tb_shutdown(); 60 return 0; 61 /* backspace */ 62 case 127: 63 buf[0]='\0'; 64 start=0; filteredcount=0; 65 for (int i=0;i<allcount;i++) 66 if (strchr(all[i],buf[0])) { 67 filtered[filteredcount]=i; 68 filteredcount++; 69 } 70 filtered[filteredcount]=-1; 71 curline=2; 72 curelem=filtered[0]; 73 break; 74 /* up */ 75 case 65517: 76 if(curline==2) start=max(0,start-1); 77 curline=max(2,curline-1); 78 curelem=filtered[curline+start-2]; 79 break; 80 /* down */ 81 case 65516: 82 if(curline==tb_height()) 83 start=min(filteredcount-tb_height(),start)+1; 84 curline=min(filteredcount+1,min(tb_height(),curline+1)); 85 curelem=filtered[curline+start-2]; 86 break; 87 /* pageup and pagedown */ 88 case 65519: 89 if(start-tb_height()>0) { 90 start=start-tb_height(); 91 curelem=curelem-tb_height(); 92 } else start=curelem=0; 93 break; 94 case 65518: 95 if(start+2*tb_height()<allcount) { 96 start=start+tb_height(); 97 curelem=curelem+tb_height(); 98 } else { 99 start=max(0,allcount-tb_height()); 100 curelem=allcount-1; 101 } 102 break; 103 case 0: 104 buf[tb_utf8_unicode_to_char(buf, ev.ch)] = '\0'; 105 start=0; filteredcount=0; 106 for (int i=0;i<allcount;i++) 107 if (strchr(all[i],buf[0])) { 108 filtered[filteredcount]=i; 109 filteredcount++; 110 } 111 filtered[filteredcount]=-1; 112 curline=2; 113 curelem=filtered[0]; 114 default: 115 break; 116 } 117 break; 118 case 3: /*Mouse*/ 119 switch(ev.key) { 120 case 65512: /*MouseLeft*/ 121 curline=min(ev.y,allcount)+1; 122 curelem=filtered[curline+start-2]; 123 break; 124 case 65511: /*MouseRight*/ 125 curline=min(ev.y,allcount)+1; 126 curelem=filtered[curline+start-2]; 127 tb_shutdown(); 128 printf("%s",all[curelem]); 129 return 0; 130 case 65508: /*MouseWheelUp*/ 131 if(curline==2) start=max(0,start-1); 132 curline=max(2,curline-1); 133 curelem=filtered[curline+start-2]; 134 break; 135 case 65507: /*MouseWheelDown*/ 136 if(curline==tb_height()) start=start+1; 137 curline=min(allcount+1,min(tb_height(),curline+1)); 138 curelem=filtered[curline+start-2]; 139 break; 140 } 141 } 142 } 143 return 0; 144 }