home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff321.lzh
/
Ifs
/
source
/
gadmsg.c
next >
Wrap
C/C++ Source or Header
|
1990-02-27
|
5KB
|
164 lines
/* a GADGETUP has been received, this routine
takes the appropriate action
*/
#include "ifs.h"
#include <exec/types.h>
#include <intuition/intuition.h>
int checkvalidfun (funstr, currentfun, numoffun)
char *funstr;
int currentfun, numoffun;
{
int numscaned,
fnum = 0;
numscaned = sscanf(funstr, "%5d", &fnum);
if ((numscaned>2) || (numscaned==0) || (fnum>FUNLIMIT) || (fnum<1))
return(currentfun);
else
return(fnum-1); /* current function is 1 less than displayed */
}
float checkvalidcooef (funstr, cooef)
char *funstr;
float cooef;
{
int numscaned;
float scooef = 0.;
numscaned = sscanf(funstr,"%5f", &scooef);
if ((numscaned == 0) || (scooef > MAXCOFF) || (scooef < MINCOFF))
return(cooef);
else
return(scooef);
}
float checkvalidper (funstr, per)
char *funstr;
float per;
{
int numscaned;
float sper = 0.;
numscaned = sscanf(funstr, "%5f", &sper);
if ((numscaned == 0) || (sper > 1.) || (sper < 0.))
return(per);
else
return(sper);
}
void setpots(adjwin, gads, PInfos, funs, percent,
xyscale, xoff, yoff, currentfun, numoffun, stxt, adjopen)
struct Window *adjwin;
struct Gadget *gads;
struct PropInfo *PInfos;
float funs[][6], percent[], xyscale;
int xoff, yoff, currentfun, numoffun;
UBYTE stxt[NUMSTRS][GSTRLEN];
short adjopen;
{
int i;
if (adjopen) {
if(numoffun>0)
PInfos[0].HorizPot = currentfun*FFFF / numoffun;
for(i=0; i<6; i++)
PInfos[i+1].HorizPot = (funs[currentfun][i]+1)*FFFF/3;
PInfos[7].HorizPot = (currentfun>0)
? (percent[currentfun]-percent[currentfun-1])*FFFF
: percent[currentfun]*FFFF;
PInfos[8].VertPot = xyscale*FFFF/3;
PInfos[9].HorizPot= ((xoff/(float)WIDTH)+1)*FFFF/3;
PInfos[9].VertPot = FFFF *(.66 - (yoff/(3. * HEIGHT)));
sprintf(stxt[0],"%5d",currentfun+1);
for(i=0; i<6; i++) /* change needed */
sprintf(stxt[i+1],"%5.2f", funs[currentfun][i]);
sprintf(stxt[7],"%5.2f", (currentfun>0)
? percent[currentfun]-percent[currentfun-1]
: percent[currentfun]);
PInfos[0].HorizBody = FFFF / (numoffun+1);
if((adjwin->DetailPen = (currentfun+2)%MAXCOLORS) < 2)
adjwin->DetailPen = adjwin->DetailPen + 2;
RefreshGadgets(&gads[NUMGADS-1],adjwin,NULL);
}
}
void adjpercent(numoffun, percent)
int numoffun;
float percent[];
{
int i;
percent[0] = 1.0/(numoffun+1);
for (i=1;i<=numoffun;i++) {
percent[i] = percent[i-1] + 1.0/(numoffun+1);
}
}
void gadgetmessage(aptr,adjwin,funs,percent,xyscale,xoff,yoff,gads,PInfos,
numoffun,currentfun,stxt,displaynumsw,adjopen)
/* returns whether or not the screen needs to be cleared */
APTR aptr;
float funs[][6],percent[],*xyscale;
int *xoff, *yoff, *numoffun, *currentfun;
struct Gadget *gads;
struct Window *adjwin;
struct PropInfo *PInfos;
UBYTE stxt[NUMSTRS][GSTRLEN];
short displaynumsw;
{
short needrefresh = TRUE;
int i;
if (aptr == (APTR)&gads[0]) {
/* this *numoffun+1 insures that Pot is placed right */
*currentfun = PInfos[0].HorizPot * (*numoffun+1)/ FFFF;
/* insure that currentfun is always <= numoffun */
if (*currentfun > *numoffun) (*currentfun)--;
needrefresh = FALSE;
}
else if (aptr == (APTR)&gads[7]) {
percent[*currentfun] = (PInfos[7].HorizPot*1/ (float) FFFF); /*comp bug*/
if (*currentfun>0) percent[*currentfun] += percent[*currentfun-1];
}
else if (aptr == (APTR)&gads[8])
*xyscale = (PInfos[8].VertPot*3/(float) FFFF);
else if (aptr == (APTR)&gads[9]) {
*xoff = ((PInfos[9].HorizPot*3/(float) FFFF) - 1)*WIDTH;
*yoff = HEIGHT * (2.0 - (3. * (PInfos[9].VertPot*1) / (float) FFFF));
/* another compiler bug*/
}
else if (aptr == (APTR)&gads[10]) { /* Function Number String */
*currentfun = checkvalidfun(stxt[0],*currentfun,*numoffun);
if(*numoffun < *currentfun) {
*numoffun = *currentfun;
adjpercent(*numoffun, percent);
PInfos[0].HorizBody = FFFF / (*numoffun+1);
needrefresh = displaynumsw;
}
else needrefresh = FALSE;
}
else if (aptr == (APTR)&gads[17]) {
percent[*currentfun] = checkvalidper(stxt[7], percent[*currentfun]);
if (*currentfun>0) percent[*currentfun] += percent[*currentfun-1];
}
for (i=0; i<6; i++) { /* change needed */
if (aptr == (APTR)&gads[i+1])
funs[*currentfun][i] = ((PInfos[i+1].HorizPot)*3/(float) FFFF) - 1.0;
if (aptr == (APTR)&gads[i+11]) /* one of the other strings */
funs[*currentfun][i] = checkvalidcooef(stxt[i+1], funs[*currentfun][i]);
}
setpots(adjwin, gads, PInfos, funs, percent, *xyscale,
*xoff, *yoff, *currentfun, *numoffun, stxt, adjwin);
if (needrefresh) clearscreen();
}