/*
 *  Copyright (c) 1994 Michael D. Bayne.
 *  All rights reserved.
 *
 *  Please see the documentation accompanying the distribution for distribution
 *  and disclaimer information.
 */

#include <libraries/gadtools.h>

#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>

#include "/Garshnelib/Garshnelib_protos.h"
#include "/Garshnelib/Garshnelib_pragmas.h"

#include "Moire.h"
#include "Moiré_rev.h"
#include "/main.h"
#include "//defs.h"

struct ModulePrefs
{
	LONG Mode;
	LONG Depth;
	LONG xSpeed;
	LONG ySpeed;
	LONG Trail;
	LONG Lines;
	LONG Cycle;
};

struct ModulePrefs nP;
VOID *OldPrefs = 0L;
STATIC const UBYTE VersTag[] = VERSTAG;

int BT_SAVEClicked( VOID )
{
	if( OldPrefs )
	{
		CopyMem( &nP, OldPrefs, sizeof( struct ModulePrefs ));
		SavePrefs( OldPrefs );
		OldPrefs = 0L;
	}
	
	return QUIT;
}

int BT_TESTClicked( VOID )
{
	MessageServer( BM_SENDBLANK );

	return OK;
}

int BT_SCREENClicked( VOID )
{
	ScreenModeRequest( MoireWnd, &nP.Mode, &nP.Depth );
	
	return OK;
}

int BT_CANCELClicked( VOID )
{
	OldPrefs = 0L;
	
	return QUIT;
}

int SL_TRAILClicked( VOID )
{
	nP.Trail = MoireMsg.Code;

	return OK;
}

int SL_XSPEEDClicked( VOID )
{
	nP.xSpeed = MoireMsg.Code;

	return OK;
}

int SL_YSPEEDClicked( VOID )
{
	nP.ySpeed = MoireMsg.Code;

	return OK;
}

int SL_LINESClicked( VOID )
{
	nP.Lines = MoireMsg.Code;

	return OK;
}

int CY_CYCLEClicked( VOID )
{
	nP.Cycle = MoireMsg.Code;

	return OK;
}

#define BL_SetGadgetAttrs( Gad, Tag, Val ) GT_SetGadgetAttrs( MoireGadgets[Gad], MoireWnd, 0L, Tag, Val, TAG_END )

int MoireVanillaKey( VOID )
{
	switch( MoireMsg.Code ) {
	case 's':
		return BT_SAVEClicked();
	case 't':
		return BT_TESTClicked();
	case 'd':
		return BT_SCREENClicked();
	case 'c':
		return QUIT;
	case 'r':
		BL_SetGadgetAttrs( GD_SL_TRAIL, GTSL_Level, Inc( nP.Trail, 1, 256 ));
		return OK;
	case 'R':
		BL_SetGadgetAttrs( GD_SL_TRAIL, GTSL_Level, Dec( nP.Trail, 1, 1 ));
		return OK;
	case 'x':
		BL_SetGadgetAttrs( GD_SL_XSPEED, GTSL_Level, Inc( nP.xSpeed, 1, 64 ));
		return OK;
	case 'X':
		BL_SetGadgetAttrs( GD_SL_XSPEED, GTSL_Level, Dec( nP.xSpeed, 1, 1 ));
		return OK;
	case 'y':
		BL_SetGadgetAttrs( GD_SL_YSPEED, GTSL_Level, Inc( nP.ySpeed, 1, 64 ));
		return OK;
	case 'Y':
		BL_SetGadgetAttrs( GD_SL_YSPEED, GTSL_Level, Dec( nP.ySpeed, 1, 1 ));
		return OK;
	case 'l':
		BL_SetGadgetAttrs( GD_SL_LINES, GTSL_Level, Inc( nP.Lines, 1, 32 ));
		return OK;
	case 'L':
		BL_SetGadgetAttrs( GD_SL_LINES, GTSL_Level, Dec( nP.Lines, 1, 2 ));
		return OK;
	default:
		return OK;
	}
}

VOID DoPrefs( LONG command, VOID *Prefs )
{
	switch( command )
	{
	case STARTUP:
		OldPrefs = Prefs;
		CopyMem( Prefs, &nP, sizeof( struct ModulePrefs ));
		if( !SetupScreen())
		{
			MoireLeft = ( Scr->Width - ComputeX( MoireWidth ))/2 - Scr->WBorRight;
			MoireTop = ( Scr->Height - ComputeY( MoireHeight ) - Font->ta_YSize )/2 -
				Scr->WBorBottom;
			if( !OpenMoireWindow())
			{
				BL_SetGadgetAttrs( GD_SL_TRAIL, GTSL_Level, nP.Trail );
				BL_SetGadgetAttrs( GD_SL_XSPEED, GTSL_Level, nP.xSpeed );
				BL_SetGadgetAttrs( GD_SL_YSPEED, GTSL_Level, nP.ySpeed );
				BL_SetGadgetAttrs( GD_SL_LINES, GTSL_Level, nP.Lines );
				BL_SetGadgetAttrs( GD_CY_CYCLE, GTCY_Active, nP.Cycle );
			}
			CloseDownScreen();
		}
		break;
	case IDCMP:
		if( HandleMoireIDCMP() != QUIT )
			break;
	case KILL:
		CloseMoireWindow();
		break;
	}
}

LONG WndSignal( VOID )
{
	return MoireWnd ? 1L << MoireWnd->UserPort->mp_SigBit : 0L;
}

VOID FillDefaults( VOID *Prefs )
{
	struct ModulePrefs mPO = { 0L, 1L, 12L, 12L, 64L, 2L, 3L };

	mPO.Mode = getTopScreenMode();
	CopyMem( &mPO, Prefs, sizeof( struct ModulePrefs ));
}
