menupro
/* Questo programma mostra come si scrive un men, e come possia- te utilizzare questo esempio nei vostri programmi.
Viene chiamato in questo modo: menu(x_sinistra_alto,y_sinistra_alto,[lista_di_opzioni],scelta).
Inserite questo obiettivo: menu(4,4,[lunedi, martedi, mercoledi, giovedi, venerdi],Risp). */
DOMAINS STRLIST=STRING* TASTO = cr ; esc ; break ; tab ; btab ; del ; bdel ; ins ; end ; home ; ftast(INTEGER) ; up ; down ; left ; right ; tegn(CHAR) ; altri
PREDICATES /* menu(sup_X,sup_Y,[scelte],scelta) */ menu(INTEGER,INTEGER,STRLIST,INTEGER) leggitasto(TASTO) /* Lettura tasti */ leggitasto1(TASTO,CHAR,INTEGER) leggitasto2(TASTO,INTEGER)
/* Selezione dal Men */ lunmax(STRLIST,INTEGER,INTEGER) lunlista(STRLIST,INTEGER) scrivilista(INTEGER,INTEGER,STRLIST) menu1(INTEGER,INTEGER,INTEGER,INTEGER) menu2(INTEGER,INTEGER,INTEGER,INTEGER,TASTO) regolafinestra(INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER)
CLAUSES /* leggitasto */
leggitasto(TASTO):-readchar(T),char_int(T,VAL),leggitasto1(TASTO,T,VAL).
leggitasto1(TASTO,_,0):-!,readchar(T),char_int(T,VAL),leggitasto2(TASTO,VAL). leggitasto1(cr,_,13):-!. leggitasto1(esc,_,27):-!. leggitasto1(break,_,3):-!. leggitasto1(tab,_,0):-!. leggitasto1(bdel,_,8):-!. leggitasto1(tegn(T),T,_) .
leggitasto2(btab,15):-!. leggitasto2(del,83):-!. leggitasto2(ins,82):-!. leggitasto2(up,72):-!. leggitasto2(down,80):-!. leggitasto2(left,75):-!. leggitasto2(right,77):-!. leggitasto2(home,71):-!. leggitasto2(end,79):-!. leggitasto2(ftast(N),VAL):- VAL>58 and VAL<70 and N=VAL-58, !. leggitasto2(altri,_).
/* menu */
menu(LI,KOL,LIST,SCELTA) :- lunmax(LIST,0,LSTR), lunlista(LIST,Ustrlun), Ustrlun>0,!, Lunghstringa = LSTR + 2, HH1= Ustrlun+2, HH2=Lunghstringa + 2, regolafinestra(LI,KOL,HH1,HH2,ALI,AKOL), makewindow(3,7,7,"",ALI,AKOL,HH1,HH2), HH3=Lunghstringa, scrivilista(0,HH3,LIST),cursor(0,0), menu1(0,Ustrlun,Lunghstringa,CH), SCELTA=1+CH, removewindow.
menu(_,_,_,255).
lunmax([H|T],MAX,MAX1) :- str_len(H,LNGDE), LNGDE>MAX,!, lunmax(T,LNGDE,MAX1). lunmax([_|T],MAX,MAX1) :-lunmax(T,MAX,MAX1). lunmax([],LEN,LEN).
lunlista([],0). lunlista([_|T],N):- lunlista(T,X), N=X+1.
scrivilista(_,_,[]). scrivilista(LI,Lunghstringa,[H|T]):-field_str(LI,0,Lunghstringa,H), LI1=LI+1,scrivilista(LI1,Lunghstringa,T).
menu1(LI,MAXLI,Lunghstringa,SCELTA):- field_attr(LI,0,Lunghstringa,112), cursor(LI,0), leggitasto(TASTO), menu2(LI,MAXLI,Lunghstringa,SCELTA,TASTO).
menu2(_,_,_,-1,esc):-!. menu2(LI,_,_,LI,ftast(10)):-!. menu2(LI,_,_,LI,cr):-!. menu2(LI,MAXLI,Lunghstringa,SCELTA,up):- LI>0,!, field_attr(LI,0,Lunghstringa,7), LI1=LI-1, menu1(LI1,MAXLI,Lunghstringa,SCELTA).
menu2(LI,MAXLI,Lunghstringa,SCELTA,down):- LI<MAXLI-1,!, field_attr(LI,0,Lunghstringa,7), LI1=LI+1, menu1(LI1,MAXLI,Lunghstringa,SCELTA).
menu2(LI,MAXLI,Lunghstringa,SCELTA,_):- menu1(LI,MAXLI,Lunghstringa,SCELTA).
regolafinestra(LI,KOL,DLI,DKOL,LI,KOL):-LI<25-DLI, KOL<80-DKOL,!. regolafinestra(LI,_,DLI,DKOL,LI,AKOL):-LI<25-DLI, !, AKOL=80-DKOL. regolafinestra(_,KOL,DLI,DKOL,ALI,KOL):-KOL<80-DKOL, !, ALI=25-DLI. regolafinestra(_,_,DLI,DKOL,ALI,AKOL):-ALI=25-DLI, AKOL=80-DKOL.