tuit

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 }