Text based UI Elements for Propeller 
for use with the VGA_HiRes_Text Driver

Demo / Text program
	GUIDemo.spin			   - the demo app

Files that comprise the UI Elements
	FILE			LONGS USED	    DESCRIPTION
				PROG	DATA
	----------------------	------	-------	    ----------------------------------------------------
	GUIBase.spin		2,472	1,643	    - UI control and infrastructure
	InputField.spin	 168 	   6	  - Input Field object
	MenuItem.spin	  62	  13	    - Menu Item object
	PushButton.spin	 124	  12	    - Push Button object
	RadioCheck.spin	  78	  13	    - Radio Button and Check Box object
	SimpleBox.spin	  62	   0	    - Basic Box object
	SpinBox.spin		 191	  12	    - Spin Button object
	TextBox.spin		 206	   4	    - Text Box object
	StatusLamp.spin	   52	   6	    - Status Annunciator

Required Drivers
	Vga_HiRes_Text.spin		- VGA High Resolution Text Driver
	Mouse.spin				- PS2 Mouse driver
	Keyboard.spin			- PS2 Keyboard Driver

This text based UI for the High Res VGA Driver will work in all resolutions that the driver supports, the demo itself is setup for 800x600 but will show OK at 1024x768 too. At 640x480 it will not look right (needs to be repositioned and re-sized), It is very much a fist principles implementation with no bells and whistles. It supports a static UI and only the basic functionality. To use the UI Elements the user must decide on a screen layout and then place the elements there. You only need to include the objects that you plan to use, you do not have to declare them all. This is done at the top of GUIBase.spin in the constatnts where you delcare how mane of each element type you will need.

There are 6 simple steps to using these objects:

1) Configure the numbers and types of GUI elements you need in the GUI Element Inventory section of the CON section of the GUIBase.spin file. See the top of that file for simple directions.

2) Declare the GUI object in your application's OBJ section.

	OBJ
		GUI	: "GUIBase"
	
3) Initialize the GUI object in your application's startup. You will need to pass in the VGA, Mouse and Keyboard pin assignments you are using for each of thise devices. This will initialise the GUI data structures and start the VGA (High Res Text), Mouse, and Keyboard drivers.

	GUI.Init( VGABase, MouseDat, MouseCLk, KeyboardDat, KeyboardClk )

4) Create the GUI Elements as required by your application by calling the specific "Init" fucntion in GUIBase.spin. Note that all GUI interation and control will be via the functions in GUIBase.spin, you will not need to access the individual GUI Element files directly. For each element you create you will need to have a variable in your VAR section to hold its identifier. For example

	PUSH1 := GUI.PUSHInit( ... )

    Creates a new pushbutton object identified by the variable PUSH1 which was declared as a byte in the VAR section. This variable will be used to pass in to calls to handle the object and will be returned to you for action in the event that the mouse is clicked on it.

5) Create a main loop for your application that will service both your application and run the processing for the UI. The UI is processed via the ProcessUI function in GUIBase.spin.

	repeat
	    ProcessApplication
	    elem := GUI.ProcessUI
              if elem <> -1
                  case elem
                      PUSH1: CallYourFunctionForPUSH1()
                      PUSH2: CallYourFunctionForPUSH1()
                      etc...

The ProcessUI function will handle the UI for you, highlighting elements as the mouse passes over them, processing mouse clicks and keyboard entry, etc. It will return -1 if no action is required (i.e. you did not click on anything). If the user clicked on something (i.e. Push Button PUSH1 perhaps) it will return the guid of the element that requires action (i.e. PUSH1). In this case you will need to perform an action associated with the Push Button. It is probably best to keep the main loop clean and call a function to perform tha action rather than do it right in the loop. That makes it easier to read and maintain.

6) Create your user action functions, one for each GUI Element that will do something.