1057 lines
30 KiB
C
1057 lines
30 KiB
C
#include "\projet\lib386\lib_sys\adeline.h"
|
|
#include "\projet\lib386\lib_sys\lib_sys.h"
|
|
#include "\projet\lib386\lib_svga\lib_svga.h"
|
|
|
|
#include "lib_menu.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <dos.h>
|
|
|
|
#ifndef WATCOM9
|
|
#include <mem.h>
|
|
#endif
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
UBYTE PalMenu[16*3] = { 0,0,0,
|
|
71,71,119,
|
|
127,127,215,
|
|
171,167,231,
|
|
115,0,0,
|
|
171,0,0,
|
|
215,0,0,
|
|
0,0,0,
|
|
87,87,87,
|
|
87,87,255,
|
|
87,255,87,
|
|
87,255,255,
|
|
255,87,87,
|
|
255,87,255,
|
|
255,255,87,
|
|
255,255,255 } ;
|
|
|
|
|
|
T_CLICK_BOX *GetPtrLcb( T_MENU *ptrmenu, WORD handle ) ;
|
|
|
|
|
|
WORD FlagAutoPal = FALSE ;
|
|
|
|
char InputValueString[64] ;
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
void SetMenuAutoPal( WORD flag )
|
|
{
|
|
FlagAutoPal = flag ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
void InitPalMenu()
|
|
{
|
|
WORD n ;
|
|
|
|
for( n=0; n<16; n++ )
|
|
PalOne( n, PalMenu[n*3+0], PalMenu[n*3+1], PalMenu[n*3+2] ) ;
|
|
}
|
|
|
|
void CopyPalMenu( UBYTE *ptrpal )
|
|
{
|
|
WORD n ;
|
|
|
|
for( n=0; n<16; n++ )
|
|
{
|
|
*ptrpal++ = PalMenu[n*3+0] ;
|
|
*ptrpal++ = PalMenu[n*3+1] ;
|
|
*ptrpal++ = PalMenu[n*3+2] ;
|
|
}
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
void DrawWindow( LONG x1, LONG y1, LONG x2, LONG y2,
|
|
LONG flags )
|
|
{
|
|
LONG coul, up, down ;
|
|
|
|
MemoClip() ;
|
|
UnSetClip() ;
|
|
if( FlagAutoPal ) InitPalMenu() ;
|
|
|
|
if( flags & FLAG_RED ) coul = B_ROUGE ;
|
|
else coul = B_GRIS ;
|
|
|
|
if( flags & FLAG_PUSHED )
|
|
{
|
|
up = coul ;
|
|
down = coul+2 ;
|
|
}
|
|
else
|
|
{
|
|
up = coul+2 ;
|
|
down = coul ;
|
|
}
|
|
|
|
Line( x1 , y1 , x2 ,y1 , up ) ;
|
|
Line( x1 , y1+1, x2-1,y1+1, up ) ;
|
|
Line( x1 , y1+2, x1 ,y2 , up ) ;
|
|
Line( x1+1, y1+2, x1+1,y2-1, up ) ;
|
|
|
|
Line( x2 , y1+1, x2 ,y2 , down ) ;
|
|
Line( x2-1, y1+2, x2-1,y2 , down ) ;
|
|
Line( x1+2, y2-1, x2-2,y2-1, down ) ;
|
|
Line( x1+1, y2 , x2-2,y2 , down ) ;
|
|
|
|
Box( x1+2,y1+2,x2-2,y2-2, coul+1 ) ;
|
|
|
|
Line( x1-1,y1-1,x2+1,y1-1, 0 ) ;
|
|
Line( x2+1,y1-1,x2+1,y2+1, 0 ) ;
|
|
Line( x1-1,y2+1,x2+1,y2+1, 0 ) ;
|
|
Line( x1-1,y1-1,x1-1,y2+1, 0 ) ;
|
|
|
|
RestoreClip() ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*
|
|
█ █ █ ██▄ █ █▀▀▀▄ █▀▀▀█ █ █ ██▀▀▀
|
|
██▀▄█ ██ ██▀██ ██ █ ██ █ ██▀▄█ ▀▀▀▀█
|
|
▀ ▀ ▀▀ ▀▀ ▀ ▀▀▀▀ ▀▀▀▀▀ ▀ ▀ ▀▀▀▀▀
|
|
*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void OpenWindow( T_WINLIST *wlist, WORD x1, WORD y1, WORD largeur, WORD hauteur )
|
|
{
|
|
WORD recal, x2, y2 ;
|
|
|
|
x1++ ;
|
|
y1++ ;
|
|
|
|
if( (x1==0) AND (y1==0) ) /* centre window */
|
|
{
|
|
x1 = (Screen_X/2) - ((largeur*SizeCar-3))/2 ;
|
|
y1 = (Screen_Y/2) - ((hauteur*(SizeCar+1)-3))/2 ;
|
|
x2 = x1 + largeur*SizeCar+14 ; /* 3 bord 4 espace *2 */
|
|
y2 = y1 + hauteur*(SizeCar+1)+14 ;
|
|
}
|
|
else /* normal window */
|
|
{
|
|
x2 = x1 + largeur*SizeCar+14 ;
|
|
y2 = y1 + hauteur*(SizeCar+1)+14 ;
|
|
}
|
|
|
|
if( y2 >= 479 )
|
|
{
|
|
recal = y2 - 478 ;
|
|
y2 -= recal ;
|
|
y1 -= recal ;
|
|
}
|
|
if( x2 >= 639 )
|
|
{
|
|
recal = x2 - 638 ;
|
|
x2 -= recal ;
|
|
x1 -= recal ;
|
|
}
|
|
|
|
|
|
wlist->WindowX1 = x1 ;
|
|
wlist->WindowY1 = y1 ;
|
|
wlist->WindowX2 = x2 ;
|
|
wlist->WindowY2 = y2 ;
|
|
wlist->WindowLig = y1 + 7 ;
|
|
wlist->WindowCol = x1 + 7 ;
|
|
wlist->WindowTab = 10 ;
|
|
|
|
DrawWindow( x1,y1,x2,y2, NO_FLAG ) ;
|
|
|
|
CoulText( 0, -1 ) ;
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void GetWindowButton( T_MENU *ptrmenu, WORD handle, T_WINLIST *wlist )
|
|
{
|
|
WORD n, nblcb ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
wlist->WindowX1 = 1 ;
|
|
wlist->WindowY1 = 1 ;
|
|
wlist->WindowX2 = Screen_X-2 ;
|
|
wlist->WindowY2 = Screen_Y-2 ;
|
|
wlist->WindowCol = wlist->WindowX1 + 7 ;
|
|
wlist->WindowLig = wlist->WindowY1 + 7 ;
|
|
wlist->WindowTab = 10 ;
|
|
|
|
nblcb = ptrmenu->NbBox ;
|
|
ptrlcb = ptrmenu->PtrMallocList ;
|
|
for( n=0; n<nblcb; n++ )
|
|
{
|
|
if( ptrlcb->Handle == handle )
|
|
{
|
|
wlist->WindowX1 = ptrlcb->X1 ;
|
|
wlist->WindowY1 = ptrlcb->Y1 ;
|
|
wlist->WindowX2 = ptrlcb->X2 ;
|
|
wlist->WindowY2 = ptrlcb->Y2 ;
|
|
wlist->WindowCol = wlist->WindowX1 + 7 ;
|
|
wlist->WindowLig = wlist->WindowY1 + 7 ;
|
|
break ;
|
|
}
|
|
ptrlcb++ ;
|
|
}
|
|
DrawWindow( wlist->WindowX1,wlist->WindowY1,
|
|
wlist->WindowX2,wlist->WindowY2,
|
|
ptrlcb->Flags ) ;
|
|
CoulText( 0, -1 ) ;
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void WinText( T_WINLIST *wlist, UBYTE *string, LONG value )
|
|
{
|
|
Text( wlist->WindowCol, wlist->WindowLig, "%s%l", string, value ) ;
|
|
wlist->WindowLig += SizeCar+1 ;
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void WinList( T_WINLIST *wlist, UBYTE **index, WORD nb, WORD size )
|
|
{
|
|
WORD n ;
|
|
|
|
wlist->WindowArray = index ;
|
|
wlist->WindowNbIndex = nb ;
|
|
wlist->WindowTab = size ;
|
|
|
|
for( n=0; n<nb; n++ )
|
|
{
|
|
Text( wlist->WindowCol, wlist->WindowLig, "%s", *index ) ;
|
|
index ++ ;
|
|
wlist->WindowLig += SizeCar+1 ;
|
|
if( wlist->WindowLig > wlist->WindowY2 -4 -SizeCar )
|
|
{
|
|
wlist->WindowCol += size * SizeCar ;
|
|
wlist->WindowLig = wlist->WindowY1 + 7 ;
|
|
|
|
if( wlist->WindowCol > wlist->WindowX2-4-size*SizeCar )
|
|
{
|
|
wlist->WindowNbIndex = n+1 ;
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void WinSelect( T_WINLIST *wlist, WORD selected, WORD coul )
|
|
{
|
|
WORD n ;
|
|
UBYTE **index ;
|
|
|
|
index = wlist->WindowArray ;
|
|
wlist->WindowCol = wlist->WindowX1 + 7 ;
|
|
wlist->WindowLig = wlist->WindowY1 + 7 ;
|
|
|
|
for( n=0; n<wlist->WindowNbIndex; n++ )
|
|
{
|
|
if( n == selected )
|
|
{
|
|
ShowMouse( 0 ) ;
|
|
CoulText( coul, -1 ) ;
|
|
Text( wlist->WindowCol, wlist->WindowLig, "%s", *index ) ;
|
|
CopyBlockPhys( wlist->WindowCol,
|
|
wlist->WindowLig,
|
|
wlist->WindowCol+strlen(*index)*SizeCar-1,
|
|
wlist->WindowLig+7 ) ;
|
|
ShowMouse( 1 ) ;
|
|
}
|
|
index ++ ;
|
|
wlist->WindowLig += SizeCar+1 ;
|
|
if( wlist->WindowLig > wlist->WindowY2 -4 -SizeCar )
|
|
{
|
|
wlist->WindowCol += wlist->WindowTab * SizeCar ;
|
|
wlist->WindowLig = wlist->WindowY1 + 7 ;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void WinSepar( T_WINLIST *wlist )
|
|
{
|
|
Line( wlist->WindowX1+2, wlist->WindowLig, wlist->WindowX2-2 ,wlist->WindowLig , B_GRIS ) ;
|
|
Line( wlist->WindowX1+2, wlist->WindowLig+1, wlist->WindowX2-2 ,wlist->WindowLig+1 , B_GRIS+2 ) ;
|
|
wlist->WindowLig += 3 ;
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void FlipWindow( T_WINLIST *wlist )
|
|
{
|
|
CopyBlockPhys( wlist->WindowX1-1, wlist->WindowY1-1, wlist->WindowX2+1, wlist->WindowY2+1 ) ;
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
WORD GetIndexWinList( T_WINLIST *wlist )
|
|
{
|
|
WORD num ;
|
|
LONG x, y, sizecol ;
|
|
|
|
x = Mouse_X ;
|
|
y = Mouse_Y ;
|
|
|
|
if( (x>=wlist->WindowX1+7) AND (x<=wlist->WindowX2-7)
|
|
AND (y>=wlist->WindowY1+7) AND (y<=wlist->WindowY2-4) )
|
|
{
|
|
sizecol = ((wlist->WindowY2-2) - (wlist->WindowY1+7)) / (SizeCar+1) ;
|
|
|
|
x -= wlist->WindowX1+7 ;
|
|
y -= wlist->WindowY1+7 ;
|
|
|
|
x /= wlist->WindowTab*SizeCar ;
|
|
y /= (SizeCar+1) ;
|
|
|
|
num = x * sizecol + y ;
|
|
|
|
if( num < wlist->WindowNbIndex )
|
|
{
|
|
return num ;
|
|
}
|
|
}
|
|
return -1 ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*
|
|
█▄ ▄█ █▀▀▀▀ ██▄ █ █ █
|
|
██▀ █ ██▀▀ ██▀██ ██ █
|
|
▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀
|
|
*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
|
|
void DrawBox( T_MENU *ptrmenu, WORD numlcb, WORD pushed, WORD copyphys )
|
|
{
|
|
WORD flags ;
|
|
WORD nbaffcar ;
|
|
WORD len, x, y ;
|
|
UBYTE string[256] ;
|
|
UBYTE valuestring[64] ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
MemoClip() ;
|
|
UnSetClip() ;
|
|
|
|
ptrlcb = ptrmenu->PtrMallocList + numlcb ;
|
|
|
|
if( ptrlcb->Type == TYPE_SWITCH )
|
|
{
|
|
ptrlcb->Flags &= ~FLAG_PUSHED ;
|
|
if( *(ptrlcb->PtrVar) & ptrlcb->Mask )
|
|
ptrlcb->Flags |= FLAG_PUSHED ;
|
|
}
|
|
|
|
flags = ptrlcb->Flags ;
|
|
|
|
/* dessin de la boite */
|
|
|
|
if( ptrlcb->Handle != -1 )
|
|
{
|
|
flags |= pushed ;
|
|
DrawWindow( ptrlcb->X1,ptrlcb->Y1,
|
|
ptrlcb->X2,ptrlcb->Y2,
|
|
flags ) ;
|
|
}
|
|
|
|
/* aff du text */
|
|
|
|
strcpy( string, ptrlcb->PtrString ) ;
|
|
if( ptrlcb->Type == TYPE_CHANGE_VALUE )
|
|
{
|
|
strcat( string, itoa( *(ptrlcb->PtrVar), valuestring, 10 ) ) ;
|
|
}
|
|
|
|
nbaffcar = ((ptrlcb->X2-3)-(ptrlcb->X1+3))/SizeCar ;
|
|
|
|
len = strlen( string ) ;
|
|
if( (len > nbaffcar) AND (len!=1) )
|
|
{
|
|
if( ptrlcb->Flags & FLAG_FILENAME ) /* perd le debut */
|
|
{
|
|
memmove(string,
|
|
string+(len-nbaffcar),
|
|
nbaffcar +1 ) ; /* perd le debut */
|
|
}
|
|
else /* perd la fin */
|
|
{
|
|
string[nbaffcar] = 0 ;
|
|
}
|
|
}
|
|
|
|
if( ptrlcb->Flags & FLAG_CENTRE )
|
|
{
|
|
len = (len*SizeCar) /2 ;
|
|
x = (ptrlcb->X1+ptrlcb->X2)/2 - len ;
|
|
y = (ptrlcb->Y1+ptrlcb->Y2)/2 - (SizeCar/2) + 1 ;
|
|
}
|
|
else
|
|
{
|
|
x = ptrlcb->X1 + 3 ;
|
|
y = ptrlcb->Y1 + 3 ;
|
|
}
|
|
|
|
if( flags & FLAG_PUSHED ) x++ ;
|
|
|
|
if( ptrlcb->Flags & FLAG_CONTOUR )
|
|
{
|
|
CoulText( 0, -1 ) ;
|
|
Text( x-1, y-1, string ) ;
|
|
Text( x , y-1, string ) ;
|
|
Text( x+1, y-1, string ) ;
|
|
Text( x-1, y , string ) ;
|
|
Text( x+1, y , string ) ;
|
|
Text( x-1, y+1, string ) ;
|
|
Text( x , y+1, string ) ;
|
|
Text( x+1, y+1, string ) ;
|
|
|
|
CoulText( JAUNE, -1 ) ;
|
|
Text( x, y, string ) ;
|
|
}
|
|
else
|
|
{
|
|
CoulText( JAUNE, -1 ) ;
|
|
Text( x, y, string ) ;
|
|
}
|
|
|
|
if( copyphys )
|
|
{
|
|
ShowMouse( 0 ) ;
|
|
CopyBlockPhys( ptrlcb->X1-1,ptrlcb->Y1-1,ptrlcb->X2+1,ptrlcb->Y2+1 );
|
|
ShowMouse( 1 ) ;
|
|
}
|
|
|
|
RestoreClip() ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
T_CLICK_BOX *AddHeaderButton( T_MENU *ptrmenu,
|
|
WORD x1, WORD y1,
|
|
WORD largeur, WORD hauteur )
|
|
{
|
|
WORD x2, y2 ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
UBYTE *ptr ;
|
|
ULONG newsize ;
|
|
|
|
x1 = ptrmenu->X1 + 6 + x1*(SizeCar+7)-2 ;
|
|
y1 = ptrmenu->Y1 + 6 + y1*(SizeCar+7)-2 ;
|
|
x2 = x1 + largeur*(SizeCar+7)-2 ;
|
|
y2 = y1 + hauteur*(SizeCar+7)-2 ;
|
|
|
|
ptrmenu->NbBox++ ;
|
|
newsize = ptrmenu->NbBox * sizeof(T_CLICK_BOX) ;
|
|
|
|
if( Mshrink( ptrmenu->PtrMallocList, newsize ) == 0L )
|
|
{
|
|
ptr = (UBYTE*)ptrmenu->PtrMallocList ;
|
|
ptrmenu->PtrMallocList = Malloc( newsize ) ;
|
|
memmove( ptrmenu->PtrMallocList, ptr, newsize-sizeof(T_CLICK_BOX) ) ;
|
|
Free( ptr ) ;
|
|
}
|
|
|
|
ptrlcb = ptrmenu->PtrMallocList + ptrmenu->NbBox - 1 ;
|
|
|
|
ptrlcb->X1 = x1 ;
|
|
ptrlcb->Y1 = y1 ;
|
|
ptrlcb->X2 = x2 ;
|
|
ptrlcb->Y2 = y2 ;
|
|
|
|
return ptrlcb ;
|
|
}
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void GetCoorButton( T_MENU *ptrmenu, WORD handle, LONG *x0, LONG *y0, LONG *x1, LONG *y1 )
|
|
{
|
|
WORD n, nblcb ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
*x0 = 0 ;
|
|
*y0 = 0 ;
|
|
*x1 = Screen_X ;
|
|
*y1 = Screen_Y ;
|
|
|
|
nblcb = ptrmenu->NbBox ;
|
|
ptrlcb = ptrmenu->PtrMallocList ;
|
|
for( n=0; n<nblcb; n++ )
|
|
{
|
|
if( ptrlcb->Handle == handle )
|
|
{
|
|
*x0 = ptrlcb->X1 + 3 ;
|
|
*y0 = ptrlcb->Y1 + 3 ;
|
|
*x1 = ptrlcb->X2 - 3 ;
|
|
*y1 = ptrlcb->Y2 - 3 ;
|
|
break ;
|
|
}
|
|
ptrlcb++ ;
|
|
}
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void AddButton( T_MENU *ptrmenu,
|
|
WORD handle,
|
|
WORD x1, WORD y1,
|
|
WORD largeur, WORD hauteur,
|
|
WORD flags,
|
|
UBYTE *ptrstring )
|
|
{
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ;
|
|
|
|
ptrlcb->Handle = handle ;
|
|
ptrlcb->Flags = flags ;
|
|
ptrlcb->PtrString = ptrstring ;
|
|
ptrlcb->Type = TYPE_BUTTON ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void AddChangeValue( T_MENU *ptrmenu,
|
|
WORD handle,
|
|
WORD x1, WORD y1,
|
|
WORD largeur, WORD hauteur,
|
|
WORD flags,
|
|
UBYTE *ptrstring,
|
|
WORD *ptrvar,
|
|
WORD step,
|
|
WORD minvar,
|
|
WORD maxvar )
|
|
{
|
|
T_CLICK_BOX *ptrlcborg ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
/* bouton valeur */
|
|
|
|
ptrlcborg = AddHeaderButton( ptrmenu, x1+hauteur,y1, largeur-2*hauteur, hauteur ) ;
|
|
|
|
ptrlcborg->Handle = handle ;
|
|
ptrlcborg->Flags = flags ;
|
|
ptrlcborg->PtrString = ptrstring ;
|
|
ptrlcborg->Type = TYPE_CHANGE_VALUE ;
|
|
ptrlcborg->PtrVar = ptrvar ;
|
|
ptrlcborg->Mask = step ;
|
|
|
|
/* bouton - */
|
|
ptrlcb = AddHeaderButton( ptrmenu, x1,y1, hauteur, hauteur ) ;
|
|
|
|
ptrlcb->Handle = handle ;
|
|
ptrlcb->Flags = FLAG_CENTRE | flags ;
|
|
ptrlcb->PtrString = "-" ;
|
|
ptrlcb->Type = TYPE_DEC_VALUE ;
|
|
ptrlcb->PtrVar = ptrvar ;
|
|
ptrlcb->Mask = minvar ;
|
|
|
|
/* bouton + */
|
|
ptrlcb = AddHeaderButton( ptrmenu, x1+largeur-hauteur,y1, hauteur, hauteur ) ;
|
|
|
|
ptrlcb->Handle = handle ;
|
|
ptrlcb->Flags = FLAG_CENTRE | flags ;
|
|
ptrlcb->PtrString = "+" ;
|
|
ptrlcb->Type = TYPE_INC_VALUE ;
|
|
ptrlcb->PtrVar = ptrvar ;
|
|
ptrlcb->Mask = maxvar ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void AddSwitch( T_MENU *ptrmenu,
|
|
WORD handle,
|
|
WORD x1, WORD y1,
|
|
WORD largeur, WORD hauteur,
|
|
WORD flags,
|
|
UBYTE *ptrstring,
|
|
WORD *ptrvar,
|
|
WORD mask )
|
|
{
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ;
|
|
|
|
ptrlcb->Handle = handle ;
|
|
ptrlcb->Flags = flags ;
|
|
ptrlcb->PtrString = ptrstring ;
|
|
ptrlcb->Type = TYPE_SWITCH ;
|
|
ptrlcb->PtrVar = ptrvar ;
|
|
ptrlcb->Mask = mask ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void AddText( T_MENU *ptrmenu,
|
|
WORD x1, WORD y1,
|
|
WORD largeur, WORD hauteur,
|
|
WORD flags,
|
|
UBYTE *ptrstring )
|
|
{
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ;
|
|
|
|
ptrlcb->Handle = -1 ;
|
|
ptrlcb->Flags = flags ;
|
|
ptrlcb->PtrString = ptrstring ;
|
|
ptrlcb->Type = TYPE_TEXT ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
void AddWindow( T_MENU *ptrmenu,
|
|
WORD handle,
|
|
WORD x1, WORD y1,
|
|
WORD largeur, WORD hauteur,
|
|
WORD flags )
|
|
{
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
ptrlcb = AddHeaderButton( ptrmenu, x1,y1, largeur, hauteur ) ;
|
|
|
|
ptrlcb->Handle = handle ;
|
|
ptrlcb->Flags = flags ;
|
|
ptrlcb->PtrString = "" ;
|
|
ptrlcb->Type = TYPE_WINDOW ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
WORD GetOptimalSize( WORD deltax )
|
|
{
|
|
/* return ((nbcar*SizeCar) / (SizeCar+7)) + 2 ; nbcar */
|
|
return (deltax-8)/(SizeCar+7) ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
WORD OpenMenu( T_MENU *ptrmenu,
|
|
WORD largeur, WORD hauteur )
|
|
{
|
|
ptrmenu->LastClicked = -1 ;
|
|
ptrmenu->Repeat = FALSE ;
|
|
|
|
ptrmenu->NbBox = 0 ;
|
|
|
|
ptrmenu->Largeur = largeur ;
|
|
ptrmenu->Hauteur = hauteur ;
|
|
|
|
ptrmenu->X1 = 0 ;
|
|
ptrmenu->Y1 = 0 ;
|
|
ptrmenu->X2 = 0 ;
|
|
ptrmenu->Y2 = 0 ;
|
|
ptrmenu->Flags = 0 ;
|
|
|
|
/* init une fausse clickbox pour first time */
|
|
ptrmenu->PtrMallocList = (T_CLICK_BOX*)Malloc( 42*sizeof(T_CLICK_BOX) ) ;
|
|
if( !ptrmenu->PtrMallocList ) return FALSE ;
|
|
|
|
return TRUE ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
void CloseMenu( T_MENU *ptrmenu )
|
|
{
|
|
Free( ptrmenu->PtrMallocList ) ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
|
|
WORD DrawMenu( T_MENU *ptrmenu, WORD x1, WORD y1 )
|
|
{
|
|
WORD n, nb ;
|
|
WORD x2,y2 ;
|
|
WORD oldx1,oldy1 ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
|
|
/* ptrmenu->LastClicked = -1 ; */
|
|
|
|
|
|
oldx1 = ptrmenu->X1 ;
|
|
oldy1 = ptrmenu->Y1 ;
|
|
|
|
if( (x1==-1) AND (y1==-1) ) /* centre window */
|
|
{
|
|
x1 = (Screen_X/2) - ((ptrmenu->Largeur*(SizeCar+7)-3))/2 ;
|
|
y1 = (Screen_Y/2) - ((ptrmenu->Hauteur*(SizeCar+7)-3))/2 ;
|
|
x2 = x1 + ptrmenu->Largeur*(SizeCar+7)+6 ;
|
|
y2 = y1 + ptrmenu->Hauteur*(SizeCar+7)+6 ;
|
|
}
|
|
else /* normal window */
|
|
{
|
|
x1++ ;
|
|
y1++ ;
|
|
|
|
x2 = x1 + ptrmenu->Largeur*(SizeCar+7)+6 ;
|
|
y2 = y1 + ptrmenu->Hauteur*(SizeCar+7)+6 ;
|
|
}
|
|
|
|
ptrmenu->X1 = x1 ;
|
|
ptrmenu->Y1 = y1 ;
|
|
ptrmenu->X2 = x2 ;
|
|
ptrmenu->Y2 = y2 ;
|
|
|
|
DrawWindow( ptrmenu->X1, ptrmenu->Y1,
|
|
ptrmenu->X2, ptrmenu->Y2,
|
|
ptrmenu->Flags ) ;
|
|
|
|
nb = ptrmenu->NbBox ;
|
|
ptrlcb = ptrmenu->PtrMallocList ;
|
|
for( n=0; n<nb; n++ )
|
|
{
|
|
ptrlcb->X1 += x1-oldx1 ;
|
|
ptrlcb->Y1 += y1-oldy1 ;
|
|
ptrlcb->X2 += x1-oldx1 ;
|
|
ptrlcb->Y2 += y1-oldy1 ;
|
|
|
|
DrawBox( ptrmenu, n, NO_FLAG, FALSE ) ;
|
|
|
|
ptrlcb++ ;
|
|
}
|
|
|
|
CopyBlockPhys( x1-1,y1-1,x2+1,y2+1 ) ;
|
|
|
|
return y2 + 1 ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
|
|
void ClearMenu( T_MENU *ptrmenu )
|
|
{
|
|
ptrmenu->LastClicked = -1 ;
|
|
|
|
Box( ptrmenu->X1, ptrmenu->Y1,
|
|
ptrmenu->X2, ptrmenu->Y2, 0 ) ;
|
|
|
|
CopyBlockPhys( ptrmenu->X1, ptrmenu->Y1,
|
|
ptrmenu->X2, ptrmenu->Y2 ) ;
|
|
}
|
|
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/*══════════════════════════════════════════════════════════════════════════*/
|
|
/* on scan TOUJOURS une list de click box en DECREMENTANT */
|
|
|
|
WORD ScanListClick( T_MENU *ptrmenu )
|
|
{
|
|
WORD n ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
WORD x, y ;
|
|
WORD nb ;
|
|
|
|
nb = ptrmenu->NbBox ;
|
|
|
|
if( !nb ) return -2 ;
|
|
|
|
x = Mouse_X ;
|
|
y = Mouse_Y ;
|
|
|
|
if( (x>=ptrmenu->X1) AND (x<=ptrmenu->X2)
|
|
AND (y>=ptrmenu->Y1) AND (y<=ptrmenu->Y2) )
|
|
{
|
|
ptrlcb = ptrmenu->PtrMallocList + (nb-1) ;
|
|
for( n=nb-1; n>=0; n-- )
|
|
{
|
|
if( (x >= ptrlcb->X1) AND (y >= ptrlcb->Y1)
|
|
AND (x <= ptrlcb->X2) AND (y <= ptrlcb->Y2) )
|
|
{
|
|
if( ptrlcb->Handle != -1 ) return n ;
|
|
else return -1 ;
|
|
}
|
|
ptrlcb-- ;
|
|
}
|
|
return -1 ;
|
|
}
|
|
return -2 ;
|
|
}
|
|
|
|
/*
|
|
|
|
WORD ScanListKey( T_MENU *ptrmenu )
|
|
{
|
|
WORD n ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
WORD x, y ;
|
|
WORD nb ;
|
|
|
|
nb = ptrmenu->NbBox ;
|
|
|
|
if( !nb ) return -2 ;
|
|
|
|
k = Key ;
|
|
|
|
ptrlcb = ptrmenu->PtrMallocList ;
|
|
for( n=0; n<nb; n++ )
|
|
{
|
|
if( ptrlcb->Key == k ) return ptrlcb->Handle ;
|
|
ptrlcb++ ;
|
|
}
|
|
return -1 ;
|
|
}
|
|
|
|
WORD ScanListKey_prog( T_MENU *ptrmenu )
|
|
{
|
|
WORD n ;
|
|
T_CLICK_BOX *ptrlcb ;
|
|
WORD x, y ;
|
|
WORD nb ;
|
|
|
|
nb = ptrmenu->NbBox ;
|
|
|
|
if( !nb ) return -2 ;
|
|
|
|
k = Key ;
|
|
|
|
ptrlcb = ptrmenu->PtrMallocList ;
|
|
for( n=0; n<nb; n++ )
|
|
{
|
|
if( ptrlcb->Key == k ) return n ;
|
|
ptrlcb++ ;
|
|
}
|
|
return -1 ;
|
|
}
|
|
|
|
*/
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
#ifdef ANCIEN
|
|
LONG GereMenu( T_MENU *ptrmenu, WORD flagwaitclick )
|
|
{
|
|
LONG exitflag = -1 ;
|
|
WORD select ;
|
|
|
|
T_CLICK_BOX *ptrlcb ;
|
|
T_CLICK_BOX *ptrlcborg ;
|
|
WORD value ;
|
|
WORD vmin, vmax ;
|
|
|
|
select = ScanListClick( ptrmenu ) ;
|
|
|
|
if( select == -2 ) exitflag = -2 ;
|
|
|
|
if( Click )
|
|
{
|
|
if( select > -1 )/* AND (select != ptrmenu->LastClicked) )*/
|
|
{
|
|
ptrlcb = ptrmenu->PtrMallocList + select ;
|
|
exitflag = ptrlcb->Handle ;
|
|
|
|
if( ptrmenu->LastClicked == select )
|
|
{
|
|
if( flagwaitclick )
|
|
{
|
|
/* methode du click/run/wait */
|
|
while( Click ) AffMouse() ;
|
|
return -1 ;
|
|
}
|
|
return exitflag ;
|
|
}
|
|
switch( ptrlcb->Type )
|
|
{
|
|
case TYPE_SWITCH:
|
|
*(ptrlcb->PtrVar) ^= ptrlcb->Mask ;
|
|
break ;
|
|
|
|
case TYPE_CHANGE_VALUE: /* scroll value */
|
|
vmin = (ptrmenu->PtrMallocList + select +1 )->Mask ;
|
|
vmax = (ptrmenu->PtrMallocList + select +2 )->Mask ;
|
|
value = *(ptrlcb->PtrVar) ;
|
|
GetMouseDep() ;
|
|
while( Click )
|
|
{
|
|
GetMouseDep() ;
|
|
value += ((WORD)Mouse_X_Dep/4) * ptrlcb->Mask ;
|
|
if( value < vmin ) value = vmin ;
|
|
if( value > vmax ) value = vmax ;
|
|
*(ptrlcb->PtrVar) = value ;
|
|
DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ;
|
|
}
|
|
DrawBox( ptrmenu, select, NO_FLAG, TRUE ) ;
|
|
break ;
|
|
|
|
case TYPE_DEC_VALUE:
|
|
ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ;
|
|
value = *ptrlcb->PtrVar ;
|
|
value -= ptrlcborg->Mask ; /* step */
|
|
if( value < ptrlcb->Mask )
|
|
value = ptrlcb->Mask ; /* minvar */
|
|
*ptrlcb->PtrVar = value ;
|
|
/* draw value box */
|
|
DrawBox( ptrmenu, select-1, NO_FLAG, TRUE ) ;
|
|
break ;
|
|
|
|
case TYPE_INC_VALUE:
|
|
ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ;
|
|
value = *ptrlcb->PtrVar ;
|
|
value += ptrlcborg->Mask ; /* step */
|
|
if( value > ptrlcb->Mask )
|
|
value = ptrlcb->Mask ; /* maxvar */
|
|
*ptrlcb->PtrVar = value ;
|
|
/* draw value box */
|
|
DrawBox( ptrmenu, select-2, NO_FLAG, TRUE ) ;
|
|
break ;
|
|
}
|
|
|
|
if( ptrlcb->Type != TYPE_WINDOW )
|
|
{
|
|
DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ;
|
|
ptrmenu->LastClicked = select ;
|
|
}
|
|
}
|
|
}
|
|
else /* pas de click */
|
|
{
|
|
if( ptrmenu->LastClicked != -1 )
|
|
{
|
|
DrawBox( ptrmenu, ptrmenu->LastClicked, NO_FLAG, TRUE ) ;
|
|
ptrmenu->LastClicked = -1 ;
|
|
}
|
|
}
|
|
|
|
return exitflag ;
|
|
}
|
|
#endif
|
|
|
|
/*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
LONG GereMenu( T_MENU *ptrmenu )
|
|
{
|
|
LONG exitflag = -1 ;
|
|
WORD select ;
|
|
|
|
T_CLICK_BOX *ptrlcb ;
|
|
T_CLICK_BOX *ptrlcborg ;
|
|
LONG value, ivalue ;
|
|
WORD vmin, vmax ;
|
|
WORD click ;
|
|
char *memostring ;
|
|
|
|
|
|
select = ScanListClick( ptrmenu ) ;
|
|
|
|
if( select == -2 ) exitflag = -2 ;
|
|
|
|
if( (click=Click) != 0 )
|
|
{
|
|
if( select > -1 )
|
|
{
|
|
ptrlcb = ptrmenu->PtrMallocList + select ;
|
|
exitflag = ptrlcb->Handle ;
|
|
|
|
if( ptrmenu->LastClicked == select )
|
|
{
|
|
if( !ptrmenu->Repeat )
|
|
{
|
|
/* methode du click/run/wait */
|
|
while( Click ) AffMouse() ;
|
|
return -1 ;
|
|
}
|
|
else
|
|
{
|
|
ptrmenu->Repeat = FALSE ;
|
|
}
|
|
}
|
|
switch( ptrlcb->Type )
|
|
{
|
|
case TYPE_SWITCH:
|
|
*(ptrlcb->PtrVar) ^= ptrlcb->Mask ;
|
|
break ;
|
|
|
|
case TYPE_CHANGE_VALUE: /* scroll value */
|
|
vmin = (ptrmenu->PtrMallocList + select +1 )->Mask ;
|
|
vmax = (ptrmenu->PtrMallocList + select +2 )->Mask ;
|
|
value = *(ptrlcb->PtrVar) ;
|
|
if( click & 2 ) /* slide value */
|
|
{
|
|
GetMouseDep() ;
|
|
while( Click )
|
|
{
|
|
GetMouseDep() ;
|
|
value += (Mouse_X_Dep/4) * ptrlcb->Mask ;
|
|
if( value < vmin ) value = vmin ;
|
|
if( value > vmax ) value = vmax ;
|
|
*(ptrlcb->PtrVar) = (WORD)value ;
|
|
DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ;
|
|
}
|
|
}
|
|
else /* input value */
|
|
{
|
|
memostring = ptrlcb->PtrString ;
|
|
itoa( value, InputValueString, 10 ) ;
|
|
ptrlcb->PtrString = InputValueString ;
|
|
ptrlcb->Type = TYPE_TEXT ;
|
|
DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ;
|
|
InputString( ptrmenu, ptrlcb->Handle , 63 ) ;
|
|
ivalue = atoi( InputValueString ) ;
|
|
if( ivalue < vmin ) ivalue = vmin ;
|
|
if( ivalue > vmax ) ivalue = vmax ;
|
|
*(ptrlcb->PtrVar) = ivalue ;
|
|
ptrlcb->Type = TYPE_CHANGE_VALUE ;
|
|
ptrlcb->PtrString = memostring ;
|
|
}
|
|
DrawBox( ptrmenu, select, NO_FLAG, TRUE ) ;
|
|
break ;
|
|
|
|
case TYPE_DEC_VALUE:
|
|
ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ;
|
|
value = *ptrlcb->PtrVar ;
|
|
value -= ptrlcborg->Mask ; /* step */
|
|
if( value < ptrlcb->Mask )
|
|
value = ptrlcb->Mask ; /* minvar */
|
|
*ptrlcb->PtrVar = value ;
|
|
/* draw value box */
|
|
DrawBox( ptrmenu, select-1, NO_FLAG, TRUE ) ;
|
|
break ;
|
|
|
|
case TYPE_INC_VALUE:
|
|
ptrlcborg = GetPtrLcb( ptrmenu, ptrlcb->Handle ) ;
|
|
value = *ptrlcb->PtrVar ;
|
|
value += ptrlcborg->Mask ; /* step */
|
|
if( value > ptrlcb->Mask )
|
|
value = ptrlcb->Mask ; /* maxvar */
|
|
*ptrlcb->PtrVar = value ;
|
|
/* draw value box */
|
|
DrawBox( ptrmenu, select-2, NO_FLAG, TRUE ) ;
|
|
break ;
|
|
}
|
|
|
|
if( ptrlcb->Type != TYPE_WINDOW )
|
|
{
|
|
DrawBox( ptrmenu, select, FLAG_PUSHED, TRUE ) ;
|
|
ptrmenu->LastClicked = select ;
|
|
}
|
|
}
|
|
}
|
|
else /* pas de click */
|
|
{
|
|
if( ptrmenu->LastClicked != -1 )
|
|
{
|
|
DrawBox( ptrmenu, ptrmenu->LastClicked, NO_FLAG, TRUE ) ;
|
|
ptrmenu->LastClicked = -1 ;
|
|
}
|
|
}
|
|
|
|
return exitflag ;
|
|
}
|
|
|