Code archives/Miscellaneous/GUI Base Code

This code has been declared by its author to be Public Domain code.

Download source code

GUI Base Code by Diablo
(Posted 21 years ago)
You can use this code as a base for creating a GUI system for any kind of game/app.

The code below is only the code listing from the major file and as such you will need to download This(~59kb) for all the code.

Enjoy!
SuperStrict

Rem
	Imports
EndRem
Import "rect.bmx"
Import BRL.LinkedList
Import BRL.Max2D

Rem
	bbdoc: The current handle of the active gadget
EndRem
Global GUIactiveGadget:GUI_TGadget

Rem
	bbdoc: The current gadget that the mouse is over
EndRem
Global GUIOverGadget:GUI_TGadget

Global GUIMouseState%[4]
Global GUIKeyState%[227]
Global GUIKeyStack:TList = CreateList()

Rem
	Just a helper type
EndRem
Type GUI_TKey

	Field key%
	
End Type

Rem
	bbdoc: Base type for all gadgets
endrem
Type GUI_TGadget
	
	Global gadgetList:TList = CreateList()	' List of all gadgets
		
	Field name$									' Name of the gadget
	
	Field parent:GUI_TGadget					' Parent of the gadget
	
	Field x%, y%, w%, h%						' Gadgets 'rect'
	Field lx%, ly%, lw%, lh%					' Gadgets local 'rect'
	Field z%									' z~ position of the gadget
	
	Field renderRect:GUI_TRect					' The render rect for this gadget
	
	Field r%, g%, b%, a# = 1					' Red, Green, Blue & alpha of the gadget

	Field ChildList:TList = CreateList()		' List of children

	Field ClientX%								' If a gadget is created and the parent is this, X is offseted by this
	Field clientY%								' If a gadget is created and the parent is this, Y is offseted by this
	
	Field ClientW%								' Client area with
	Field ClientH%								' Client area height
	
	Field disabled@								' Is this gadget disabled
	
	Field hidden@								' Is this gadget hidden
	
	Field active@								' Is this gadget the active one
	
	Field OnHide()								' Call this function on hidding
	Field OnShow()								' Call this function on showing
	
	Field OnMouseHit(_button%)					' Call this function if the mouse is hit
	Field OnMouseClicked(_button%)				' Call this function if a mouse button is clicked
	Field OnMouseDown(_button%)					' Call this function if a mouse button is down
	Field OnMouseOver(_mouseX%, _mouseY%)		' Call this function if the mouse is over
	Field OnMouseMove(_mouseX%, _mouseY%)		' Call this function if the mouse is moving on gadget
	Field OnMouseEnter(_mouseX%, _mouseY%)		' Call this function when mouse enters gadget
	Field OnMouseLeave(_mouseX%, _mouseY%)		' Call this function when the mouse leaves the gadget
	Field OnKeyHit(_key%)						' Call this function when a key is hit and gadget is active
	Field OnKeyDown(_key%)						' Call this function when a key is down
	Field OnKeyPressed(_key%)					' Call this function when a key is released
	Field OnFocusLoss()							' Call this function upon loss of focus i.e. no longer active gadget
	Field OnFocusGain()							' Call this function upon gain
	
	Field gadgetMouseState@[4]					' The state of mouse buttons
	Field gadgetKeyState@[227]					' The state of the keys
	
	Field gadgetMouseMoved@						' True if the mouse was moved over the gadget
	Field gadgetMouseOver@						' True if the mouse is over the gadget
	Field gadgetMouseEnter@						' True if the mouse entered the gadget
	Field gadgetMouseLeave@						' True if the mouse leaves the gadget
	
	Field gadgetAlwaysOnTop@					' Is the gadget always on top
	Field gadgetAlwaysOnBottom@					' Is the gadget always on bottom
	
	Field gadgetMouseMoveX%						' Amount the gadget mouse x has moved
	Field gadgetMouseMoveY%						' Amount the gadget mouse y has moved
	
	Field gadgetLocalMouseX%					' Local mouse x position
	Field gadgetLocalMouseY%					' Local mouse y position

	Const GADGET_KEYHIT%			= %0001
	Const GADGET_KEYDOWN%			= %0010
	Const GADGET_KEYPRESSED%		= %0100
	Const GADGET_KEYUP%				= %1000
	
	Rem
		bbdoc: Check if a key was hit
	endrem
	Method IsKeyHit@(_key%)
	
		If gadgetKeyState[_key] = GADGET_KEYHIT Then Return True
	
	End Method
	
	Rem
		bbdoc: Check if a key was pressed
	endrem
	Method IsKeyPressed@(_key%)
	
		 If gadgetKeyState[_key] = GADGET_KEYPRESSED Then Return True
	
	End Method
	
	Rem
		bbdoc: Check if a key is down
	endrem
	Method IsKeyDown@(_key%)
	
		If gadgetKeyState[_key] = GADGET_KEYDOWN Then Return True
	
	End Method
	
	Rem
		bbdoc: Check if a key is up
	endrem
	Method IsKeyUp@(_key%)
	
		If gadgetKeyState[_key] = GADGET_KEYUP Then Return True
	
	End Method
	
	Rem
		bbdoc: Check if mouse button was hit
	endrem
	Method IsMouseHit@(_button%)
	
		If gadgetMouseState[_button] = GADGET_KEYHIT Then Return True
		
	End Method
	
	Rem
		bbdoc: Check if a mouse button is down
	endrem
	Method IsMouseDown@(_button%)
	
		If gadgetMouseState[_button] = GADGET_KEYDOWN Then Return True
		
	End Method
	
	Rem
		bbdoc: Check if a mouse button was pressed
	endrem
	Method IsMousePressed@(_button%)
		
		If gadgetMouseState[_button] = GADGET_KEYPRESSED Then Return True
		
	End Method
	
	Rem
		bbdoc: Check if a mouse button is up
	endrem
	Method IsMouseUp@(_button%)
	
		If gadgetMouseState[_button] = GADGET_KEYUP Then Return True
	
	End Method
	
	Rem
		bbdoc: Check if the mouse was moved
		returns: True if mouse was moved
	EndRem
	Method IsMouseMoved@()

		Return gadgetMouseMoved
			
	End Method
	
	Rem
		bbdoc: Check if the mouse entered the gadget
		returns: True if the mouse entered the gadget
	EndRem
	Method IsMouseEntering@()
	
		Return  gadgetMouseEnter
	
	End Method
	
	Rem
		bbdoc: Check if the mouse has left the gadget
		returns: True if it is ?<
	EndRem
	Method IsMouseLeaving@()
	
		Return gadgetMouseLeave
	
	End Method
	
	Rem
		bbdoc: Get the amount the mouse was moved
		returns: The amount the mouse was move (x)
	EndRem
	Method GetGadgetMouseXSpeed%()
	
		Global lastX:Int = MouseX()
		Local result:Int = MouseX() - lastX
		lastX = MouseX()	
		Return result
		
	End Method
	
	Rem
		bbdoc: Get the amount the mouse was moved
		returns: The amount the mouse was move (y)
	EndRem
	Method GetGadgetMouseYSpeed%()
	
		Global lastY:Int = MouseY()
		Local result:Int = MouseY() - lastY
		lastY = MouseY()	
		Return result
		
	End Method
	
	Rem
		bbdoc: Move the gadget to a new position
	EndRem
	Method Move(_x%, _y%)
	
		x = _x
		y = _y
		
		For Local kid:GUI_TGadget = EachIn ChildList
			kid.Move(_x + kid.lx, _y + kid.ly)
		Next
	
	End Method
	
	Rem
		bbdoc: Is mouse over the gadget
	endrem
	Method IsMouseOver@()
	
		If IsInGadget(MouseX(), MouseY()) Then Return True
	
	End Method
	
	Rem
		bbdoc: Update the gadgets local rect
		about: Call this function after you have moved gadgets about
	endrem
	Method UpdateLocalRect()
	
		lx = x
		ly = y
		lw = w
		lh = h
		
		If parent Then
			
			lx:- parent.x
			ly:- parent.y
		
		EndIf
		
	End Method
	
	Rem
		bbdoc: Set if the gadget will always be on top
	EndRem
	Method SetAlwaysOnTop(_to@)
		
		gadgetAlwaysOnTop = _to
		If _to = True Then gadgetAlwaysOnBottom = False
		
	End Method
	
	Rem
		bbdoc: Set if the gadget will always be on bottom
	EndRem
	Method SetAlwaysOnbottom(_to@)
		
		gadgetAlwaysOnbottom = _to
		If _to = True Then gadgetAlwaysOnTop = False
		
	End Method
	
	Rem
		bbdoc: Render the gadget (debug render here!!!)
	EndRem
	Method Render()
	
		Local lastBlend% = GetBlend()
		
		Local vx%, vy%, vw%, vh%
		GetViewport(vx, vy, vw, vh)
		
		' Set this render rect to x,y,w,h (duh!)
		renderRect.Set(x, y, w, h)
		
		If parent Then 
			renderRect = parent.renderRect.InterRect(renderRect)
		EndIf
		
		SetViewport renderRect.x, renderRect.y, renderRect.w, renderRect.h
			
		SetBlend ALPHABLEND
		
		SetColor 0, 0, 0
		DrawRect x, y, w, 1
		DrawRect x, y, 1, h
		DrawRect (x + w) - 1, y, 1, h
		DrawRect x, (y + h) - 1, w, 1
		
		SetColor r, g, b
		SetAlpha a
		
		DrawRect x + 1, y + 1, w - 2, h - 2
		
		SetColor 0, 0, 0
		DrawText name, x + 3, y + 3
		DrawText z, x + w - 6 - 20, y + h - 6 - 12
		
		SetColor 255, 255, 255
		SetAlpha 1
		
		SetViewport(vx, vy, vw, vh)
		
	End Method
	
	Rem
		bbdoc: Update the gadget
	endrem
	Method Update()
		
		If IsInGadget(MouseX(), MouseY()) Then GUIOverGadget = Self
		
		' Set some globals up
		Global _lastMouseX% = MouseX(), _lastMouseY% = MouseY()
		Global mouseState%, lastMouseDown%
		Global keyState%, lastKeyDown%, lastKeyDownStack:TList = CreateList()
		
		' Clear some flags
		gadgetMouseEnter	= False
		gadgetMouseLeave	= False
		gadgetMouseOver		= False
		gadgetMouseMoved	= False
		
		If Not IsInGadget(_lastMouseX, _lastMouseY) Then
			
			If IsInGadget(MouseX(), MouseY()) Then
				
				If OnMouseEnter Then OnMouseEnter(MouseX(), MouseY())
				keyState = 0
				mouseState = 0
				
				gadgetMouseEnter = True

			EndIf
			
		End If
		
		
		If IsInGadget(MouseX(), MouseY()) Then
		
			' Now that we know the mouse if in the gadget we can call the mouse over function	
			If OnMouseOver Then OnMouseOver(MouseX() - x, MouseY() - y)
			gadgetMouseOver = True
			
			gadgetLocalMouseX = (MouseX() - x)
			gadgetLocalMouseY = (MouseY() - y)
			
			If GetGadgetMouseXSpeed() <> 0 Or GetGadgetMouseYSpeed() <> 0 Then 
				gadgetMouseMoved = True
				
				If OnMouseMove Then OnMouseMove(MouseX(), MouseY())
				
				_lastMouseX = MouseX()
				_lastMouseY = MouseY()	
			EndIf
			
			' Check if a key was pressed
			For Local key% = 8 To 226
				
				gadgetKeyState[key] = GADGET_KEYUP
				
				Local akey:GUI_TKey = New GUI_TKey
				akey.key = key
					
				' Check if a key was hit and call function
				If GUI_InStack(key, GUIKeyStack) = 1 Then

					If OnKeyHit Then OnKeyHit(key)
					gadgetKeyState[key] = GADGET_KEYHIT
				
				EndIf
				
				' Check if a key is down and call function
				If KeyDown(key) Then
				
					If OnKeyDown Then OnKeyDown(key)
					keyState = 2
					If Not GUI_InStack(key, lastKeyDownStack) Then lastKeyDownStack.AddLast akey
					If gadgetKeyState[key] <> GADGET_KEYHIT Then gadgetKeyState[key] = GADGET_KEYDOWN
					
				EndIf
				
				' Check is a key was 'pressed' and call function
				If Not KeyDown(key) And keyState = 2 And GUI_InStack(key, lastKeyDownStack) Then
					
					If OnKeyPressed Then OnKeyPressed(key)
					keyState = 0
					GUI_RemoveFromStack(key, lastKeyDownStack)
					gadgetKeyState[key] = GADGET_KEYPRESSED
					
				EndIf
			
			Next
			
			gadgetMouseState[1] = GADGET_KEYUP
			gadgetMouseState[2] = GADGET_KEYUP
			gadgetMouseState[3] = GADGET_KEYUP
			
			' Check for mouse hits and call functions
			If GUIMouseState[1] = 1 Then
				
				If OnMouseHit Then OnMouseHit(1)
				Activate()
				gadgetMouseState[1] = GADGET_KEYHIT
				
			EndIf
			
			If GUIMouseState[2] = 1 Then
			
				If OnMouseHit Then OnMouseHit(2)
				Activate()
				gadgetMouseState[2] = GADGET_KEYHIT
				
			EndIf
			
			If GUIMouseState[3] = 1 Then
			
				If OnMouseHit Then OnMouseHit(3)
				Activate()
				gadgetMouseState[3] = GADGET_KEYHIT
				
			EndIf
			
			' Check mouse down, call functions and set state
			If MouseDown(1) Then
			
				If OnMouseDown Then OnMouseDown(1)
				mouseState = 2
				lastMouseDown = 1
				If gadgetMouseState[1] <> GADGET_KEYHIT Then gadgetMouseState[1] = GADGET_KEYDOWN
				
			ElseIf MouseDown(2)
				
				If OnMouseDown Then OnMouseDown(2)
				mouseState = 2
				lastMouseDown = 2
				If gadgetMouseState[2] <> GADGET_KEYHIT Then gadgetMouseState[2] = GADGET_KEYDOWN
				
			ElseIf MouseDown(3)
			
				If OnMouseDown Then OnMouseDown(3)
				mouseState = 2
				lastMouseDown = 3
				If gadgetMouseState[3] <> GADGET_KEYHIT Then gadgetMouseState[3] = GADGET_KEYDOWN
				
			EndIf
			
			' Check if a mouse button is released (clicked)
			If Not MouseDown(1) And mouseState = 2 And lastMouseDown = 1 Then
			
				If OnMouseClicked Then OnMouseClicked(1)
				mouseState = 0
				gadgetMouseState[1] = GADGET_KEYPRESSED
				
			ElseIf Not MouseDown(2) And mouseState = 2 And lastMouseDown = 2
			
				If OnMouseClicked Then OnMouseClicked(2)
				mouseState = 0
				gadgetMouseState[2] = GADGET_KEYPRESSED
				
			ElseIf Not MouseDown(3) And mouseState = 2 And lastMouseDown = 3
			
				If OnMouseClicked Then OnMouseClicked(3)
				mouseState = 0
				gadgetMouseState[3] = GADGET_KEYPRESSED
			
			EndIf
			
		Else
		
			If	IsInGadget(_lastMouseX, _lastMouseY) Then
			
				gadgetMouseLeave = True
				
				If onMouseLeave Then OnMouseLeave(MouseX(), MouseY())
				
				lastMouseDown = -1
				gadgetMouseState[1] = GADGET_KEYUP
				gadgetMouseState[2] = GADGET_KEYUP
				gadgetMouseState[3] = GADGET_KEYUP
			
			EndIf
		
		EndIf	

	End Method
	
	Rem
		bbdoc: Check if a position is in the gadget
		returns: True if x AND y is in the gadget (byte)
	endrem
	Method IsInGadget@(_x%, _y%)
		
		If hidden Then Return False
		If disabled Then Return False
		
		' See if we'er in any other gadgets
		For Local gadget:GUI_TGadget = EachIn gadgetList

			If gadget <> Self Then

				If gadget.z > z Then
					
					If gadget.IsInGadget(_x, _y) Then Return False
						
				EndIf

			EndIf
			
		Next

		If _x <= x + w And _x => x And _y <= y + h And _y => y Then Return True
		Return False
		
	End Method
	
	Rem
		bbdoc: Disable this gadget and all its kids
	endrem
	Method Disable()
		
		If disabled Then Return
		
		disabled = True
		
		If ChildList Then
			For Local gadget:GUI_TGadget = EachIn ChildList
				gadget.Disable()
			Next
		EndIf
		
	End Method
	
	Rem
		bbdoc: Enable this gadget and all its kids
	endrem
	Method Enable()
		
		If disabled = False Then Return
		
		If disabled Then If parent.disabled Then Return
		
		disabled = False
		
		If ChildList Then
			For Local gadget:GUI_TGadget = EachIn ChildList
				gadget.Enable()
			Next
		EndIf
		
	End Method
	
	Rem
		bbdoc: Hides the gadget
	endrem
	Method Hide()
		
		If hidden Then Return
		
		If OnHide Then OnHide()
		hidden = True
		
		If ChildList Then
			For Local gadget:GUI_TGadget = EachIn ChildList
				gadget.Hide()
			Next
		EndIf
		
	End Method
	
	Rem
		bbdoc: Show a gadget
	endrem
	Method Show()
		
		If hidden = False Then Return
		
		If parent Then If parent.hidden Then Return
		
		If OnShow Then OnShow()
		hidden = False
		
		If ChildList Then
			For Local gadget:GUI_TGadget = EachIn ChildList
				gadget.Hide()
			Next
		EndIf
			
	End Method
	
	Rem
		bbdoc: Activate this gadget
	endrem
	Method Activate()
	
		If Not active Then
		
			active = True
			GUIactiveGadget = Self
			
			If OnFocusGain Then OnFocusGain()
			
			' Unactivate all other gadgets
			For Local gadget:GUI_TGadget = EachIn gadgetList
				If gadget <> Self Then
					gadget.active = False
					
					If gadget.OnFocusLoss Then gadget.OnFocusLoss()
				EndIf
			Next
		
		EndIf
	
	End Method
	
	Rem
		bbdoc: Create a *very* basic gadget
	endrem
	Function Create:GUI_TGadget(_name$, _x%, _y%, _w%, _h%, _parent:GUI_TGadget = Null)
	
		Local gadget:GUI_TGadget = New GUI_TGadget
		
		gadget.name 		= _name
		gadget.x 			= _x
		gadget.y			= _y
		gadget.w			= _w
		gadget.h			= _h
		
		gadget.UpdateLocalRect()
		
		gadget.ClientX		= 1
		gadget.clientY		= 1
		gadget.ClientW		= _w - 2
		gadget.ClientH		= _h - 2
		
		gadget.r			= 255
		gadget.g			= 255
		gadget.b			= 255
		gadget.a			= 1.0
		
		gadget.renderRect	= New GUI_TRect
		gadget.renderRect.x = _x
		gadget.renderRect.y = _y
		gadget.renderRect.w = _w
		gadget.renderRect.h = _h
		
		If _parent Then 
			gadget.SetParent(_parent)
			
			gadget.x:+ _parent.ClientX + _parent.x
			gadget.y:+ _parent.clientY + _parent.y
		EndIf
		
		gadget.BringToTop()
		
		gadget.Activate()
		
		gadgetList.AddLast(gadget)
		
		Return gadget
		
	End Function
	
	Rem
		bbdoc: Setup the gadget
	EndRem
	Method Setup(_name$, _x%, _y%, _w%, _h%, _parent:GUI_TGadget = Null)
		
		name 		= _name
		x 			= _x
		y			= _y
		w			= _w
		h			= _h
		
		UpdateLocalRect()
		
		ClientX		= 1
		clientY		= 1
		ClientW		= _w - 2
		ClientH		= _h - 2
		
		r			= 255
		g			= 255
		b			= 255
		a			= 1.0
		
		renderRect	= New GUI_TRect
		renderRect.x = _x
		renderRect.y = _y
		renderRect.w = _w
		renderRect.h = _h
		
		If _parent Then 
			SetParent(_parent)
			
			x:+ _parent.ClientX + _parent.x
			y:+ _parent.clientY + _parent.y
		EndIf
		
		BringToTop()
		
		Activate()
		
		If Not gadgetList.Contains(Self) Then	gadgetList.AddLast(Self)
		
	End Method
	
	Rem
		bbdoc: Set the parent of this gadget
	EndRem
	Method SetParent(_gadget:GUI_TGadget)
	
		' If it already has a parent the remove it from the child list
		If parent Then
			
			parent.ChildList.Remove(Self)
		
		EndIf
		
		' Make _gadget the new parent and add it to the list
		parent = _gadget
		
		If parent Then
			If Not parent.ChildList Then parent.ChildList = CreateList()
			parent.ChildList.AddLast(Self)	
			
			z = parent.z + 1
		EndIf
	
	End Method
	
	Rem
		bbdoc: Bring this gadget to the top and re-order kids
	endrem
	Method BringToTop()
		
		If gadgetAlwaysOnBottom Then z = 0; Return
		
		' If this gadget has a parent then bring the parent to top instead
		If parent Then 
			
			parent.BringToTop()
			
		EndIf
		
		' Set this z to the highest z...
		z = gadgetList.count()
		
		' ... and then set all other gadgets z - 1
		For Local gadget:GUI_TGadget = EachIn gadgetList
		
			If gadget <> Self Then 
				If gadget.z > 0 Then gadget.z:- 1
				
				If gadget.gadgetAlwaysOnTop Then gadget.BringToTop()
			EndIf
			
		Next

		OrderChildren()
		
	End Method
	
	Rem
		bbdoc: Re-order the gadgets children
	endrem
	Method OrderChildren()
	
		If ChildList = Null Then Return 
		For Local kid:GUI_TGadget = EachIn ChildList
			kid.z = z
			kid.OrderChildren()
		Next
	
	End Method
	
	Rem
		bbdoc: Free the gadget
	EndRem
	Method Free()
		
		For Local kid:GUI_TGadget = EachIn childList
			kid.free()
		Next
		
		gadgetList.Sort()
		gadgetList.Remove(Self)

		OnMouseHit 		= Null
		OnMouseClicked	= Null
		OnMouseDown		= Null
		OnMouseOver		= Null
		OnMouseMove		= Null
		OnMouseEnter	= Null
		OnMouseLeave	= Null
		OnKeyHit		= Null
		OnKeyDown		= Null
		OnKeyPressed	= Null
		OnFocusLoss		= Null
		
	End Method
		
	Rem
		Override the new method
	EndRem
	Method New()
		
		BringToTop()
		
	End Method
	
	Rem
		Override the compare method
	endrem
	Method Compare%(other:Object)
		
		If other = Self Then Return False
		
		Local otherGadget:GUI_TGadget = GUI_TGadget(other)
		
		Return z - otherGadget.z
		
		
		'If z > otherGadget.z Then Return True
		
		'Return False
		
	End Method
	
	Rem
		Override the delete method
	endrem
	Method Delete()
	
		For Local kid:GUI_TGadget = EachIn childList
			kid.free()
		Next
		
		gadgetList.Sort()
		gadgetList.Remove(Self)

		OnMouseHit 		= Null
		OnMouseClicked	= Null
		OnMouseDown		= Null
		OnMouseOver		= Null
		OnMouseMove		= Null
		OnMouseEnter	= Null
		OnMouseLeave	= Null
		OnKeyHit		= Null
		OnKeyDown		= Null
		OnKeyPressed	= Null
		OnFocusLoss		= Null
		
	End Method
	
	Rem
		Override the ToString method
	EndRem
	Method ToString$()
	
		Local rString$ = "Ref = " + Super.ToString() + "; x = " + x + "; y = " + y + "; w = " + w + "; h = " + h + "; z = " + z
		
		If parent Then rString:+ "~r~n Has Parent {" + parent.ToString() + "}"
		
		Return rString
		
	End Method
	
End Type

Rem
	bbdoc: Render all the gadgets
endrem
Function GUI_Render()

	GUI_TGadget.gadgetList.Sort()
	
	For Local gadget:GUI_TGadget = EachIn GUI_TGadget.gadgetList
	
		If Not gadget.hidden Then gadget.Render()
		
	Next

End Function

Rem
	bbdoc: Update all the gadgets
endrem
Function GUI_Update()
	
	For Local i% = 1 To 3
		
		GUIMouseState[i] = -1
		If MouseHit(i) Then GUIMouseState[i] = 1
	
	Next
	
	GUIKeyStack.Clear()
	For Local i% = 1 To 226
	
		GUIKeyState[i] = -1
		If KeyHit(i) Then 
			GUIKeyState[i] = 1
 			If Not GUI_InStack(i, GUIKeyStack) Then 
				Local key:GUI_TKey = New GUI_TKey
				key.key = i
				GUIKeyStack.AddLast key
			EndIf
		EndIf
	
	Next
	
	For Local gadget:GUI_TGadget = EachIn GUI_TGadget.gadgetList
	
		If gadget.hidden = False Or gadget.disabled = False Then gadget.Update()
		
	Next
	
	If GUIOverGadget And GUIMouseState[1] = 1 Then GUIOverGadget.BringToTop()
	
End Function

Rem
	bbdoc: Check if a key is in the stack
	returns: True on success (byte)
endrem
Function GUI_InStack@(_key%, _stack:TList)
	
	For Local key:GUI_TKey = EachIn _stack
		If key.key = _key Then Return True
	Next
	
	Return False
	
End Function

Rem
	bbdoc: Remove a key from a stack
endrem
Function GUI_RemoveFromStack(_key%, _stack:TList)
	
	For Local key:GUI_TKey = EachIn _stack
		If key.key = _key Then
			_stack.Remove(key)
			Return
		EndIf
	Next

End Function