File:  [RetroPC.NET] / xmil / MacOSX / dialog / d_config.cpp
Revision 1.2: download - view: text, annotated - select for diffs
Tue Feb 8 01:09:19 2005 JST (20 years, 8 months ago) by tk800
Branches: MAIN
CVS tags: HEAD
merged local changes[MacOSX](tk800)

#include	"compiler.h"
#include	"strres.h"
#include	"resource.h"
#include	"xmil.h"
#include	"sysmng.h"
#include	"dialog.h"
#include	"dialogs.h"
#include	"pccore.h"
#include	"palettes.h"


enum {kTabMasterSig = 'PRTT',kTabMasterID = 1000,kTabPaneSig= 'PRTB',kPrefControlsSig = 'PREF'};
enum {kDummyValue = 0,kMaxNumTabs= 3};

static void setupJoyConfig(OSType type, WindowRef win);
static void setTitle(OSType type, char* elementName, WindowRef win);
static pascal OSStatus PrefsTabEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData );
static void SetInitialTabState(WindowRef theWindow);

static void setConfig(WindowRef win) {
    UInt32	dval;
    UInt16	wval;
    UInt8	mval;
    bool	bval;
	UINT	update = 0;
	UINT	renewal = 0;
    
    dval=GetControlValue(getControlRefByID('Rate', 0, win));
    if (dval==1) {
        wval = 11025;
    }
    else if (dval==2) {
        wval = 22050;
    }
    else {
        wval = 44100;
    }
	if (xmilcfg.samplingrate != wval) {
		xmilcfg.samplingrate = wval;
		update |= SYS_UPDATECFG;
		corestat.soundrenewal = 1;
	}
    
    dval = getFieldValue('Bufr', win);
	if (dval < 50) {
		dval = 50;
	}
	else if (dval > 1000) {
		dval = 1000;
	}
    if (dval != xmilcfg.delayms) {
		xmilcfg.delayms = dval;
		update |= SYS_UPDATECFG;
		corestat.soundrenewal = 1;
    }
//    dval = getFieldValue('seek');
//    if (dval != xmilcfg.MOTORVOL) {
//	INIT_RENEWAL xmilcfg.MOTORVOL = dval;
//    }
    dval = getFieldValue('slte', win);
	if (dval > 255) {
		dval = 255;
	}
    if (dval != xmilcfg.skiplight) {
		xmilcfg.skiplight = dval;
		renewal = 1;
    }
    bval=GetControlValue(getControlRefByID('slin', 0, win));
    if (bval != xmilcfg.skipline) {
		xmilcfg.skipline = bval;
		renewal = 1;
    }
	if (renewal) {
		pal_reset();
		update |= SYS_UPDATECFG;
	}
	sysmng_update(update);
}

#define	setCheckBox(a,b)	SetControlValue(getControlRefByID(b,0,win), a)
#define	setValue(a,b)		setCheckBox(a,b)

static void setControlText(long data, OSType sign, WindowRef win) {
    Str255	title;

    NumToString(data, title);
    SetControlData(getControlRefByID(sign, 0, win), kControlNoPart, kControlStaticTextTextTag, *title, title+1);
}

static void setName (OSType type, WindowRef win) {
    char elementName[256] = "----";
//    if (getJoypadName(type, elementName)) {
        if (elementName) {
            setTitle(type, elementName, win);
        }
//    }
}

static void initPrefWindow(WindowRef win) {
    int	data;

    if (xmilcfg.samplingrate == 11025) {
        data=1;
    }
    else if (xmilcfg.samplingrate == 22050) {
        data=2;
    }
    else {
        data=3;
    }
    setValue(data, 'Rate');
    setControlText(xmilcfg.delayms, 'Bufr', win);
//    setControlText(xmilcfg.MOTORVOL, 'seek');
    setControlText(xmilcfg.skiplight, 'slte', win);
	setValue(xmilcfg.skipline, 'slin');

//    setName(JOYPAD_UP, win);
//    setName(JOYPAD_DOWN, win);
//    setName(JOYPAD_LEFT, win);
//    setName(JOYPAD_RIGHT, win);
//    setName(JOYPAD_ABUTTON, win);
//    setName(JOYPAD_BBUTTON, win);

//    initTemporal();
}

static pascal OSStatus joyWinproc(EventHandlerCallRef myHandler, EventRef event, void* userData) {
    OSStatus	err = eventNotHandledErr;
    HICommand	cmd;

    if (GetEventClass(event)==kEventClassCommand && GetEventKind(event)==kEventCommandProcess ) {
        GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd);
        switch (cmd.commandID)
        {
            case 'notJ':
                HideSheetWindow((WindowRef)userData);
                DisposeWindow((WindowRef)userData);
                err = noErr;
                break;
            default:
                break;
        }
    }

    return err;
}

static OSErr pushJoy (OSType type, WindowRef win) {
    setupJoyConfig(type, win);
    return noErr;
}

static pascal OSStatus pfWinproc(EventHandlerCallRef myHandler, EventRef event, void* userData) {
    OSStatus	err = eventNotHandledErr;
    HICommand	cmd;
    
    if (GetEventClass(event)==kEventClassCommand && GetEventKind(event)==kEventCommandProcess ) {
        GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd);
        switch (cmd.commandID)
        {
            case kHICommandCancel:
                QuitAppModalLoopForWindow((WindowRef)userData);
                err=noErr;
                break;
                
            case kHICommandOK:
                setConfig((WindowRef)userData);
//                changeJoyPadSetup();                
                QuitAppModalLoopForWindow((WindowRef)userData);
                err=noErr;
                break;

//            case JOYPAD_UP:
//            case JOYPAD_DOWN:
//            case JOYPAD_LEFT:
//            case JOYPAD_RIGHT:
//            case JOYPAD_ABUTTON:
//            case JOYPAD_BBUTTON:
			case 'jpup':
                err=pushJoy(cmd.commandID, (WindowRef)userData);
                break;

            default :
                break;
        }
    }

    return err;
}
    
static	IBNibRef	nibRef;

static void makeNibWindow (IBNibRef nibRef) {
    OSStatus	err;
	WindowRef	prefWin;

    err = CreateWindowFromNib(nibRef, CFSTR("PreferenceWindow"), &prefWin);
    if (err == noErr) {
        initPrefWindow(prefWin);
        SetInitialTabState(prefWin);
        EventTypeSpec	tabControlEvents[] ={ { kEventClassControl, kEventControlHit } };
        InstallControlEventHandler( getControlRefByID(kTabMasterSig,kTabMasterID,prefWin),  PrefsTabEventHandlerProc , GetEventTypeCount(tabControlEvents), tabControlEvents, prefWin, NULL );
        EventTypeSpec	list[]={ { kEventClassCommand, kEventCommandProcess } };
        EventHandlerRef	ref;
        EventHandlerUPP winhandler = NewEventHandlerUPP(pfWinproc);
        InstallWindowEventHandler (prefWin, winhandler, 1, list, (void *)prefWin, &ref);
        ShowWindow(prefWin);
        err=RunAppModalLoopForWindow(prefWin);
        RemoveEventHandler (ref);
        DisposeEventHandlerUPP (winhandler);
        HideWindow(prefWin);
        DisposeWindow(prefWin);
    }
}

void ConfigDialogProc( void ) {
    OSStatus	err;

    err = CreateNibReference(CFSTR("main"), &nibRef);
    if (err ==noErr ) {
        makeNibWindow (nibRef);
        DisposeNibReference ( nibRef);
    }
}

static void setupJoyConfig (OSType type, WindowRef win) {
    OSStatus	err;
	WindowRef	joyWin;
    char elementName[256] = "----";

    err = CreateWindowFromNib(nibRef, CFSTR("InputWindow"), &joyWin);
    if (err == noErr) {
        EventTypeSpec	list[]={ { kEventClassCommand, kEventCommandProcess } };
        EventHandlerRef	ref;
        InstallWindowEventHandler (joyWin, NewEventHandlerUPP(joyWinproc), 1, list, (void *)joyWin, &ref);
        ShowSheetWindow(joyWin, win);

//        if (setJoypad(type, elementName)) {
//            setTitle(type, elementName);
//        }

        HideSheetWindow(joyWin);
        DisposeWindow(joyWin);
    }
}

static void setTitle(OSType type, char* elementName, WindowRef win) {
    Str255 str;
    mkstr255(str, elementName);
    SetControlTitle(getControlRefByID(type, 0, win), str);
}

static UInt16 lastPaneSelected = 1;	// static, to keep track of it long term (in a more complex application
                                        // you might store this in a data structure in the window refCon)                                            

static void SetInitialTabState(WindowRef theWindow)
{
    int tabList[] = {kDummyValue, kTabMasterID,kTabMasterID+1,kTabMasterID+2};
    short qq=0;
    for(qq=0;qq<kMaxNumTabs+1;qq++)
    SetControlVisibility( getControlRefByID(  kTabPaneSig,  tabList[qq], theWindow), false, true );  
    SetControlValue(getControlRefByID(kTabMasterSig,kTabMasterID,theWindow),lastPaneSelected );
    SetControlVisibility( getControlRefByID(  kTabPaneSig,  tabList[lastPaneSelected], theWindow), true, true );
}

static pascal OSStatus PrefsTabEventHandlerProc( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
{
    WindowRef theWindow = (WindowRef)inUserData;  // get the windowRef, passed around as userData    
    short controlValue = 1;
    controlValue = GetControlValue( getControlRefByID(kTabMasterSig,kTabMasterID,theWindow) );
    if ( controlValue != lastPaneSelected )
    {
        int tabList[] = {kDummyValue, kTabMasterID,kTabMasterID+1,kTabMasterID+2,kTabMasterID+3};
        SetControlVisibility( getControlRefByID(  kTabPaneSig,  tabList[lastPaneSelected], theWindow), false, true );
        SetControlVisibility( getControlRefByID(  kTabPaneSig,  tabList[controlValue], theWindow), true, true );    
        Draw1Control( getControlRefByID(kTabMasterSig,kTabMasterID,theWindow) );		
        lastPaneSelected= controlValue;    
    }
    return( eventNotHandledErr );
}

RetroPC.NET-CVS <cvs@retropc.net>