/*
** This program needs at least V39 include files !
*/

#include "demo.h"

#include "gadgets/colorwheel.h"
#include "intuition/icclass.h"
#include "intuition/gadgetclass.h"


/*
** Gauge object macro to display colorwheels
** hue and saturation values.
*/

#define InfoGauge GaugeObject,\
	GaugeFrame    , \
	MUIA_Background  , MUII_BACKGROUND,\
	MUIA_Gauge_Max   , 16384,\
	MUIA_Gauge_Divide, 262144,\
	MUIA_Gauge_Horiz , TRUE,\
	End


int main(int argc,char *argv[])
{
	struct Library *ColorWheelBase;
	APTR app,window,Wheel,Hue,Sat;

	init();

	if (!(ColorWheelBase = OpenLibrary("gadgets/colorwheel.gadget",0)))
		fail(NULL,"colorwheel boopsi gadget not available\n");

	app = ApplicationObject,
		MUIA_Application_Title      , "BoopsiDoor",
		MUIA_Application_Version    , "$VER: BoopsiDoor 14.19 (21.02.96)",
		MUIA_Application_Copyright  , "©1992/93, Stefan Stuntz",
		MUIA_Application_Author     , "Stefan Stuntz",
		MUIA_Application_Description, "Show a boopsi colorwheel with MUI.",
		MUIA_Application_Base       , "BOOPSIDOOR",

		SubWindow, window = WindowObject,
			MUIA_Window_Title, "BoopsiDoor",
			MUIA_Window_ID   , MAKE_ID('B','O','O','P'),

			WindowContents, VGroup,

				Child, ColGroup(2),
					Child, Label("Hue:"       ), Child, Hue = InfoGauge,
					Child, Label("Saturation:"), Child, Sat = InfoGauge,
					Child, RectangleObject,MUIA_Weight,0,End, Child, ScaleObject, End,
					End,

				Child, Wheel = BoopsiObject,  /* MUI and Boopsi tags mixed */

					GroupFrame,

					MUIA_Boopsi_ClassID  , "colorwheel.gadget",

					MUIA_Boopsi_MinWidth , 30, /* boopsi objects don't know */
					MUIA_Boopsi_MinHeight, 30, /* their sizes, so we help   */

					MUIA_Boopsi_Remember , WHEEL_Saturation, /* keep important values */
					MUIA_Boopsi_Remember , WHEEL_Hue,        /* during window resize  */

					MUIA_Boopsi_TagScreen, WHEEL_Screen, /* this magic fills in */
					WHEEL_Screen         , NULL,         /* the screen pointer  */

					GA_Left     , 0,
					GA_Top      , 0, /* MUI will automatically     */
					GA_Width    , 0, /* fill in the correct values */
					GA_Height   , 0,

					ICA_TARGET  , ICTARGET_IDCMP, /* needed for notification */

					WHEEL_Saturation, 0, /* start in the center */

					MUIA_FillArea, TRUE, /* use this because it defaults to FALSE 
					                        for boopsi gadgets but the colorwheel
					                        doesnt bother about redrawing its backgorund */

					End,
				End,
			End,
		End;

	if (!app)
	{
		if (ColorWheelBase) CloseLibrary(ColorWheelBase);
		fail(app,"Failed to create Application.");
	}


/*
** you can react on every boopsi notification
** event as on any other MUI attribute.
*/

	DoMethod(Wheel,MUIM_Notify,WHEEL_Hue       ,MUIV_EveryTime,Hue,4,MUIM_Set,MUIA_Gauge_Current,MUIV_TriggerValue);
	DoMethod(Wheel,MUIM_Notify,WHEEL_Saturation,MUIV_EveryTime,Sat,4,MUIM_Set,MUIA_Gauge_Current,MUIV_TriggerValue);


	DoMethod(window,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);


/*
** This is the ideal input loop for an object oriented MUI application.
** Everything is encapsulated in classes, no return ids need to be used,
** we just check if the program shall terminate.
** Note that MUIM_Application_NewInput expects sigs to contain the result
** from Wait() (or 0). This makes the input loop significantly faster.
*/

	set(window,MUIA_Window_Open,TRUE);

	{
		ULONG sigs = 0;

		while (DoMethod(app,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit)
		{
			if (sigs)
			{
				sigs = Wait(sigs | SIGBREAKF_CTRL_C);
				if (sigs & SIGBREAKF_CTRL_C) break;
			}
		}
	}

	set(window,MUIA_Window_Open,FALSE);



/*
** shut down.
*/

	if (ColorWheelBase) CloseLibrary(ColorWheelBase);
	fail(app,NULL);
}
