Code archives/User Input/VisualB for quickgui

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

Download source code

VisualB for quickgui by churchaxe2004
For people who like the quickgui system by wickedrush, here is a graphical editor/form designer. You can place/resize buttons and everything, set properties etc, save/reload
the forms/windows and export all the stuff into BlitzBasic code.

Edit:
I've been reported that about 1 or 2 functions are missing...
if so, please add the following code to either quickgui.bb or the main-.bb-file:

Function gui_getMode(name)
For a.gui_gadget=Each gui_gadget
If a\num=name Then Return a\mode
Next
End Function

Function gui_setMode(name,md)
For a.gui_gadget=Each gui_gadget
If a\num=name Then a\mode=md
Next
End Function



I've made a few fixes in the quickgui.bb for my own personal use, but I left them out for this version, which uses the original and unmodified files of quickgui (version 1.08)
delivered by wickedrush. One little warning: beware of pressing the del-key in an activated and empty input-gadget. This causes an error in gui_handleinput
(at least on my computer...)

As far as it is my own code it's free for use and whatever you wanna do with it - at your own risk :)

You also need these 2 files:
quickgui.bb (which is the actual gui system)
quickGui_fileRequestor.bb (file open/save dialogs, this is also part of the quickgui package)
http://www.blitzbasic.com/codearcs/codearcs.php?code=229

Note that this app needs at least 1024x768 display size, otherwise it won't show the bottom parts of the control window. For those people who have 1024x768, it's best
to run it with Graphics 1024, 768, 32, 1 (fullscreen). If your display is 1280x1024 run it at 1024x768/windowed. 800x600 is very bad whether windowed or fullscreen.
If you get lost in too big windows, remember: F1=help and ESC=quit... :P

Note also that it uses the SystemProperty("APPDIR") as a starting point, which means that if you run it from the IDE it will put its settings-file "VisualB.ini" in your Blitz...\bin folder.
If you run it as an .exe it'll use the directory the visualb.exe actually is in.
Graphics 1024, 768, 32, 2
SetBuffer BackBuffer()

Include "quickgui.bb"	;put in correct path
Include "quickgui_filerequestor.bb"

FreeFont gui_font
gui_font = LoadFont("Arial", 12, True)
SetFont gui_font
gui_usepointer = True

ClsColor 128, 128, 128

Global act	;selected gadget in form=window under construction
Global ctrlpos
Global cyclic_ids
Global dir_app$ = SystemProperty("APPDIR")
Global dir_img$ = dir_app
Global dir_open$ = dir_app
Global dir_snd$ = dir_app
Global endprog
Global exp_fulapp
Global exp_gadselect
Global exp_modal
Global fatmark
Global form
Global formih
Global formimg$
Global frmfile$
Global gadsel
Global mx, my
Global newwidth, newheight
Global posx, posy
Global wait

Type gad
	Field id
	Field noclick
	Field rightclick
	Field inputgadget
	Field container_for
	Field slider_in
	Field vertical
	Field ni$, nih
	Field di$, dih
	Field oi$, oih
	Field os$, osh
	Field ds$, dsh
End Type

If LoadINI() Then msgbox("if you need some HELP please press F1", 0, "First start...")
AppTitle frmfile + " - VisualB"

While Not endprog
	mx = MouseX()
	my = MouseY()
	Cls
	
	ShowPointer

	gadsel = gui_update(0, wait)
	g.gad = GetGad(gadsel)

	If g <> Null		;gadget in form selected
		act = gadsel
		FillCtrl()
	ElseIf gadsel > 0	;gadget in CtrlWin selected
		Flip
	EndIf
	
	If act <> 0 And KeyDown(56)		;test slider movement
		g = GetGad(act)
		If (g\slider_in <> 0)
			tmp$ = gui_handleSlider(act, form, act, g\slider_in, g\vertical, True)
			Color 255, 255, 0
			Text 230, 30, "slider value = " + tmp
			FillCtrl
		EndIf
	EndIf

	Color 0, 0, 0
	Text 230, 0, "mouse: x = " + mx + "   y = " + my

	;red marker for selected item
	If Not gui_gethandle(1000)
		Color 255, 0, 0
		If act > 0
			rx = gui_getx(act) + gui_getwinx(form)
			rw = gui_getw(act)
		Else
			rx = gui_getwinx(form)
			rw = gui_getwinw(form)
		EndIf
		
		If gui_gethandle(1)
			If ctrlpos = 0
				If rx < 227
				rw = rw - 227 + rx
				rx = 227
				EndIf
			ElseIf rx + rw > ctrlpos
				rw = ctrlpos - rx
			EndIf
		EndIf

		If act > 0
			Rect rx, gui_gety(act) + gui_getwiny(form), rw, gui_geth(act), False
			If fatmark Then Rect rx + 1, gui_gety(act) + gui_getwiny(form) + 1, rw - 2, gui_geth(act) - 2, False
		Else
			Rect rx, gui_getwiny(form), rw, gui_getwinh(form), False
			If fatmark Then Rect rx + 1, gui_getwiny(form) + 1, rw - 2, gui_getwinh(form) - 2, False
		EndIf
		Color 0, 0, 0
	EndIf

	enteringtext = False
	For a.gui_gadget = Each gui_gadget
		If a\mode And 2048
			enteringtext =  True
			Exit
		EndIf
	Next
	If Not enteringtext Then GetuserInput()

	Flip
Wend
SaveINI()
End		

Function ApplyAll()
	If act <> 0
		g.gad = GetGad(act)
		
		align = GetAlign(3)
		gui_settext(act, gui_gettext(2), align)

		;types
		tmp1$ = gui_gettext(16)
		tmp2$ = gui_gettext(17)
		tmp3$ = gui_gettext(18)
		
		gui_settypes(act, Int(tmp1), Int(tmp2), Int(tmp3))

		x = gui_gettext(23)
		y = gui_gettext(24)
		width = gui_gettext(25)
		height = gui_gettext(26)

		Select Int(tmp1)	;fixed height for radiobtns and checkboxes
			Case 13, 14
				gui_setsize(act, width, 13)
				gui_settext(26, "13")
			Case 15, 16
				gui_setsize(act, width, 12)
				gui_settext(26, "12")
			Default
				gui_setsize(act, width, height)
		End Select

		gui_setposition(act, x, y)		

		SetGadID()	

		;set slider/container
		tmp1 = gui_gettext(34)
		If tmp1 <> ""
			g2.gad = GetGad(Int(tmp1))
			If g2 <> Null
				If g2\id <> act
					If g2\slider_in <> 0
						MsgBox("Gadget " + g2\id + " is already a slider in " + g2\slider_in, 0, "Setting container...")
						If Not(gui_getmode(34) And 2048)
							gui_setmode(34, gui_getmode(34) + 2048)
							gui_textcursorpos = 0
							gui_settext(34, "")
						EndIf
					ElseIf g2\container_for <> 0 And (g2\container_for <> g\id)
						MsgBox("Gadget " + g2\id + " is already a container for " + g2\container_for, 0, "Setting container...")
						If Not(gui_getmode(34) And 2048)
							gui_setmode(34, gui_getmode(34) + 2048)
							gui_textcursorpos = 0
							gui_settext(34, "")
						EndIf
					Else
						g3.gad = GetGad(g\slider_in)
						If g3 <> Null
							g3\container_for = 0
							g3\noclick = False
						EndIf
						g\slider_in = g2\id
						If g\vertical
							gui_settext(33, "vertical")
						Else
							gui_settext(33, "horizontal")
						EndIf
						g2\noclick = True
						g2\container_for = act
					EndIf
				Else
					If g\slider_in <> 0
						gui_settext(34, g\slider_in)
					Else
						gui_settypes(32, 15)
						gui_settext(34, "")
					EndIf
				EndIf
			Else
				MsgBox("There's no gadget number " + tmp1 + " in Form " + form + ".", 0, "Setting container...")
				If g\slider_in <> 0
					gui_settext(34, g\slider_in)
				Else
					gui_settypes(32, 15)
					gui_settext(34, "")
				EndIf
			EndIf
		EndIf
	Else	;form
		align = GetAlign(form)
		SetWinText(form, gui_gettext(2), align)

		;type
		tmp1$ = gui_gettext(16)
		For a.gui_gadget = Each gui_gadget
			If a\num = 0 And a\windownum = form Then a\typ = Int(tmp1)
		Next
	
		x = gui_gettext(23)
		y = gui_gettext(24)
		width = gui_gettext(25)
		height = gui_gettext(26)
		
		gui_setwinxy(form, x, y)
		gui_setwinsize(form, width, height)
	EndIf
	
	;find/goto gadget
	tmp1 = gui_gettext(55)
	If tmp1 <> ""
		If Int(tmp1) = form
			gui_settext(55, "")
			act = 0
			FillCtrl()
			Return
		EndIf

		For g.gad = Each gad
			If g\id = Int(tmp1)
				act = g\id
				gui_settext(55, "")
				FillCtrl()
				Return
			EndIf
		Next
		If g = Last gad Or g = Null
			MsgBox("There's no gadget number " + tmp1 + " in Form " + form + ".", 0, "Goto Gadget...")
			gui_settext(55, "")
		EndIf
	EndIf
	
	;change filename
	tmp1$ = gui_gettext(57)
	If tmp1 <> "unnamed"
		If Lower(Right(tmp1, 4)) <> ".vbf"
			If Instr(tmp1, ".") Then tmp1 = Left(tmp1, Instr(tmp1, ".") - 1)
			tmp1 = tmp1 + ".vbf"
		Else
			tmp1 = tmp1
		EndIf
		
		If frmfile <> tmp1
			frmfile = tmp1
			saveform(frmfile)
			AppTitle frmfile + " - VisualB"
		EndIf
		gui_settext(57, tmp1, 1)
	EndIf
	
	;change to new FormID
	tmp1$ = gui_gettext(49)
	If Int(tmp1) <> form 
		SetFormID(Int(tmp1))
	EndIf
	
	gui_redrawwindow(form)
	gui_redrawwindow(1)
End Function

Function CtrlWin()
	If gui_gethandle(1) Then gui_freewindow(1)

	gui_makewindow(1, 226, 768, 0, 1)
	gui_makegadget(1, 1, 1, 27, 29, 15, 5, 8, "text", 1)
	gui_makegadget(1, 2, 27, 27, 195, 15, 261, 2, "texttext", 1)
	gui_makegadget(1, 3, 99, 6, 122, 15, 1, 1, "alignment", 1)
	gui_makegadget(1, 4, 4, 70, 42, 15, 5, 8, "modes", 1)
	gui_makegadget(1, 5, 5, 90, 55, 12, 5, 15, "noclick", 2)
	gui_makegadget(1, 6, 5, 105, 67, 12, 5, 15, "nosunken", 2)
	gui_makegadget(1, 7, 5, 120, 66, 12, 5, 15, "rightclick", 2)
	gui_makegadget(1, 8, 5, 135, 57, 12, 5, 15, "shadow", 2)
	gui_makegadget(1, 9, 5, 150, 46, 12, 5, 15, "ghost", 2)
	gui_makegadget(1, 10, 5, 165, 81, 12, 5, 15, "autobrighten", 2)
	gui_makegadget(1, 11, 5, 180, 45, 12, 5, 15, "input", 2)
	gui_makegadget(1, 12, 160, 71, 42, 15, 5, 8, "types", 2)
	gui_makegadget(1, 13, 132, 91, 42, 15, 5, 8, "normal", 2)
	gui_makegadget(1, 14, 132, 114, 42, 15, 5, 8, "over", 2)
	gui_makegadget(1, 15, 132, 137, 42, 15, 5, 8, "down", 2)
	gui_makegadget(1, 16, 176, 91, 25, 15, 261, 2, "16", 0)
	gui_makegadget(1, 17, 176, 114, 25, 15, 261, 2, "15", 0)
	gui_makegadget(1, 18, 176, 137, 25, 15, 261, 2, "11", 0)
	gui_makegadget(1, 19, 5, 210, 40, 14, 5, 8, "X", 2)
	gui_makegadget(1, 20, 5, 229, 40, 14, 5, 8, "Y", 2)
	gui_makegadget(1, 21, 5, 248, 40, 14, 5, 8, "width", 2)
	gui_makegadget(1, 22, 5, 267, 40, 14, 5, 8, "height", 2)
	gui_makegadget(1, 23, 50, 210, 35, 15, 261, 2, "xval", 0)
	gui_makegadget(1, 24, 50, 229, 35, 15, 261, 2, "yval", 0)
	gui_makegadget(1, 25, 50, 248, 35, 15, 261, 2, "wval", 0)
	gui_makegadget(1, 26, 50, 267, 35, 15, 261, 2, "hval", 0)
	gui_makegadget(1, 27, 110, 190, 110, 15, 1, 1, "compress IDs now", 0)
	gui_makegadget(1, 28, 142, 248, 64, 15, 1, 1, "duplicate", 0)
	gui_makegadget(1, 29, 142, 267, 64, 15, 1, 1, "delete", 0)
	gui_makegadget(1, 30, 1, 6, 42, 15, 5, 8, "gadget", 1)
	gui_makegadget(1, 31, 41, 6, 46, 15, 261, 2, "gadID", 0)
	gui_makegadget(1, 32, 1, 306, 108, 12, 5, 15, "slider in container", 2)
	gui_makegadget(1, 33, 163, 306, 56, 15, 1, 1, "vertical", 0)
	gui_makegadget(1, 34, 110, 306, 46, 15, 261, 2, "containerID", 0)
	gui_makegadget(1, 35, 6, 359, 45, 15, 5, 8, "images", 1)
	gui_makegadget(1, 36, 6, 379, 25, 15, 5, 8, "ni", 1)
	gui_makegadget(1, 37, 6, 399, 25, 15, 5, 8, "oi", 1)
	gui_makegadget(1, 38, 6, 419, 25, 15, 5, 8, "di", 1)
	gui_makegadget(1, 39, 6, 445, 46, 15, 5, 8, "sounds", 1)
	gui_makegadget(1, 40, 6, 465, 25, 15, 5, 8, "os", 1)
	gui_makegadget(1, 41, 6, 485, 25, 15, 5, 8, "ds", 1)
	gui_makegadget(1, 42, 21, 379, 200, 15, 1, 1, "nival", 0)
	gui_makegadget(1, 43, 21, 399, 200, 15, 1, 1, "oival", 0)
	gui_makegadget(1, 44, 21, 419, 200, 15, 1, 1, "dival", 0)
	gui_makegadget(1, 45, 21, 465, 200, 15, 1, 1, "osval", 0)
	gui_makegadget(1, 46, 21, 485, 200, 15, 1, 1, "dsval", 0)
	gui_makegadget(1, 47, 142, 229, 64, 15, 1, 1, "insert", 0)
	gui_makegadget(1, 48, 3, 520, 32, 12, 5, 8, "form", 0)
	gui_makegadget(1, 49, 38, 518, 50, 15, 261, 2, "formID", 0)
	gui_makegadget(1, 50, 100, 518, 50, 15, 1, 1, "new", 0)
	gui_makegadget(1, 51, 160, 518, 50, 15, 1, 1, "open", 0)
	gui_makegadget(1, 52, 100, 538, 50, 15, 1, 1, "save", 0)
	gui_makegadget(1, 53, 160, 598, 50, 15, 1, 1, "export", 0)
	gui_makegadget(1, 54, 1, 52, 79, 12, 5, 8, "goto", 0)
	gui_makegadget(1, 55, 80, 50, 46, 15, 261, 2, "", 0)
	gui_makegadget(1, 56, 4, 562, 52, 12, 5, 8, "filename", 1)
	gui_makegadget(1, 57, 53, 561, 166, 15, 261, 2, "filenameval", 1)
	gui_makegadget(1, 58, 156, 746, 64, 15, 1, 1, "quit", 0)
	gui_makegadget(1, 59, 5, 598, 103, 12, 5, 15, "long gadgetIDs", 2)
	gui_makegadget(1, 60, 5, 623, 201, 13, 5, 13, "full application", 2)
	gui_makegadget(1, 61, 36, 638, 136, 13, 5, 13, "without selector", 2)
	gui_makegadget(1, 62, 36, 654, 137, 13, 5, 13, "select / case selector", 2)
	gui_makegadget(1, 63, 36, 670, 137, 13, 5, 13, "if / then / else selector", 2)
	gui_makegadget(1, 64, 5, 719, 202, 13, 5, 13, "form and gadget code only", 2)
	gui_makegadget(1, 65, 119, 686, 53, 12, 5, 15, "modal", 2)
	gui_makegadget(1, 66, 1, 326, 108, 15, 5, 8, "container for slider", 0)
	gui_makegadget(1, 67, 110, 326, 46, 15, 5, 8, "sliderID", 0)
	gui_makegadget(1, 68, 110, 170, 110, 12, 5, 15, "cyclic IDs", 2)
	gui_makegadget(1, 69, 38, 538, 50, 15, 1, 1, "reload", 0)
	gui_makegadget(1, 70, 142, 50, 64, 15, 1, 1, "IDs info", 0)
	gui_makegadget(1, 71, 7, 746, 64, 15, 1, 1, "help", 0)
	gui_makegadget(1, 72, 160, 538, 50, 15, 1, 1, "save as", 0)

	gui_settiptext(2, "F2")
	gui_settiptext(28, "Ctrl/Shift+D")
	gui_settiptext(29, "Ctrl+X")
	gui_settiptext(33, "horizontal/vertical")
	gui_settiptext(47, "Ins")
	gui_settiptext(50, "Ctrl+N")
	gui_settiptext(51, "Ctrl+O")
	gui_settiptext(52, "Ctrl+S")
	gui_settiptext(53, "Ctrl+E")
	gui_settiptext(55, "F3")
	gui_settiptext(58, "Alt+F4")
	gui_settiptext(69, "Ctrl+Z")
	gui_settiptext(70, "Ctrl+I")
	gui_settiptext(71, "F1")

	gui_drawwindow(1, ctrlpos, 0)

	If exp_fulapp = True
		gui_settypes(60, 14)
		gui_settypes(64, 13)
		If exp_modal
			gui_settypes(65, 16)
		Else
			gui_settypes(65, 15)
		EndIf
		If exp_gadselect = 0
			gui_settypes(61, 14)
			gui_settypes(62, 13)
			gui_settypes(63, 13)
		ElseIf exp_gadselect = 1
			gui_settypes(61, 13)
			gui_settypes(62, 14)
			gui_settypes(63, 13)
		Else
			gui_settypes(61, 13)
			gui_settypes(62, 13)
			gui_settypes(63, 14)
		EndIf
	Else
		gui_settypes(60, 13)
		gui_settypes(64, 14)
		gui_settypes(65, 15)
		gui_settypes(61, 13)
		gui_settypes(62, 13)
		gui_settypes(63, 13)
	EndIf
	
	If cyclic_ids Then gui_settypes(68, 16)
	
	FillCtrl()
	gui_drawwindow(1, ctrlpos, 0)
End Function

Function Export()
	If Instr(frmfile, ".")
		expfile$ = dir_open + Left(frmfile, Instr(frmfile, ".") - 1) + ".bb"
	Else
		expfile$ = dir_open + frmfile + ".bb"
	EndIf

	fileh = WriteFile(expfile)

		WriteLine(fileh, ";created by VisualB")
		
		If exp_fulapp	;sample app code
			WriteLine(fileh, "Graphics 1024, 768, 32, 2")
			WriteLine(fileh, "SetBuffer BackBuffer()")
			WriteLine(fileh, "Include " + Chr(34) + "quickGui.bb" + Chr(34) + "	;complete with correct path")
			WriteLine(fileh, "")
			WriteLine(fileh, "FreeFont gui_font")
			WriteLine(fileh, "gui_font = LoadFont(" + Chr(34) + "Arial" + Chr(34) + ", 12, True)")
			WriteLine(fileh, "SetFont gui_font")
			WriteLine(fileh, "gui_usepointer = True")
			WriteLine(fileh, "Global debugtext$")

			If exp_gadselect > 0
				WriteLine(fileh, "Global gui_wait")
				WriteLine(fileh, "Global gadsel")
				WriteLine(fileh, "")
			EndIf

			If Not exp_modal Then WriteLine(fileh, "CreateWindow()")

			WriteLine(fileh, "")
			WriteLine(fileh, "While Not KeyHit(1)		;mainloop")
			WriteLine(fileh, "	Cls")
			If exp_gadselect > 0
				WriteLine(fileh, "	gadsel = gui_update(0, gui_wait)")
			Else
				WriteLine(fileh, "	gadsel = gui_update()")
			EndIf
			
			If exp_modal = False
				For g.gad = Each gad
					If g\slider_in <> 0
						If actline = False
							WriteLine(fileh, "	If gadsel Then act = gadsel")
							actline = True
						EndIf

						If gui_gettype(59) = 16
							exp_ID$ = Str(form) + Str(g\id - form)
							exp_ID2$ = Str(form) + Str(g\slider_in - form)
						Else
							exp_ID = g\id
							exp_ID2 = g\slider_in
						EndIf
			
						WriteLine(fileh, "	If act = " + exp_ID + " Then debugtext = gui_HandleSlider(act, " + form + ", " + exp_ID + ", " + exp_ID2 + ", " + g\vertical + ", True)")
					EndIf
				Next

				WriteLine(fileh, "")
				If exp_gadselect > 0 Then WriteLine(fileh, "	HandleGuiInput()")
				WriteLine(fileh, "	If debugtext <> " + Chr(34) + Chr(34))
				WriteLine(fileh, "		Color 255, 0, 0")
				WriteLine(fileh, "		Text 0, 0, debugtext")
				WriteLine(fileh, "	EndIf")
				WriteLine(fileh, "")
			ElseIf exp_modal
				WriteLine(fileh, "	Color 255, 255, 255")
				WriteLine(fileh, "	If retval Then t$ = " + Chr(34) + " again" + Chr(34))
				WriteLine(fileh, "	Text 0, 0, " + Chr(34) + "hit SPACE to start window function" + Chr(34) + " + t + " + Chr(34) + ", ESC To Exit program" + Chr(34))
				WriteLine(fileh, "	If KeyHit(57)")
				WriteLine(fileh, "		FlushKeys")
				WriteLine(fileh, "		retval = CreateWindow()")
				WriteLine(fileh, "	EndIf")
				WriteLine(fileh, "")
				WriteLine(fileh, "	If retval")
				WriteLine(fileh, "		Color 255, 255, 0")
				WriteLine(fileh, "		Text 0, 30, " + Chr(34) + "returned value = " + Chr(34) + " + retval")
				WriteLine(fileh, "	EndIf")
				WriteLine(fileh, "")
			EndIf

			WriteLine(fileh, "	Flip")
			WriteLine(fileh, "Wend")
			WriteLine(fileh, "End")
			WriteLine(fileh, "")

			If exp_gadselect
				WriteLine(fileh, "Function HandleGUIInput()")

				If exp_gadselect = 1
					WriteLine(fileh, ";gadget selector type: select/case")
					WriteLine(fileh, "	Select gadsel")
					For g.gad = Each gad
						If Not g\noclick
							If gui_gettype(59) = 16
								exp_ID$ = Str(form) + Str(g\id - form)
								WriteLine(fileh, "	Case " + exp_ID)
								WriteLine(fileh, "		debugtext = " + Chr(34) + "gadget " + Chr(34) + " + " + exp_ID + " + " + Chr(34) + " selected" + Chr(34))
							Else
								WriteLine(fileh, "	Case " + g\id)
								WriteLine(fileh, "		debugtext = " + Chr(34) + "gadget " + Chr(34) + " + " + g\id + " + " + Chr(34) + " selected" + Chr(34))
							EndIf
						EndIf
					Next
					WriteLine(fileh, "	End Select")
					WriteLine(fileh, "")
				ElseIf exp_gadselect = 2
					WriteLine(fileh, ";gadget selector type: if/then/else")
					For g.gad = Each gad
						If gui_gettype(59) = 16
							exp_ID$ = Str(form) + Str(g\id - form)
							If g = First gad
								WriteLine(fileh, "	If gadsel = " + exp_ID)
								WriteLine(fileh, "		debugtext = " + Chr(34) + "gadget " + Chr(34) + " + " + exp_ID + " + " + Chr(34) + " selected" + Chr(34))
							ElseIf Not g\noclick
								WriteLine(fileh, "	ElseIf gadsel = " + exp_ID)
								WriteLine(fileh, "		debugtext = " + Chr(34) + "gadget " + Chr(34) + " + " + exp_ID + " + " + Chr(34) + " selected" + Chr(34))
							EndIf
						Else
							If g = First gad
								WriteLine(fileh, "	If gadsel = " + g\id)
								WriteLine(fileh, "		debugtext = " + Chr(34) + "gadget " + Chr(34) + " + " + g\id + " + " + Chr(34) + " selected" + Chr(34))
							ElseIf Not g\noclick
								WriteLine(fileh, "	ElseIf gadsel = " + g\id)
								WriteLine(fileh, "		debugtext = " + Chr(34) + "gadget " + Chr(34) + " + " + g\id + " + " + Chr(34) + " selected" + Chr(34))
							EndIf
						EndIf
					Next
					WriteLine(fileh, "	EndIf")
				EndIf

				WriteLine(fileh, "	If MouseDown(1)")
				WriteLine(fileh, "		gui_wait = True")
				WriteLine(fileh, "	Else")
				WriteLine(fileh, "		gui_wait = False")
				WriteLine(fileh, "	EndIf")
				WriteLine(fileh, "End Function")
				WriteLine(fileh, "")
			EndIf

			WriteLine(fileh, "Function CreateWindow()")

			If exp_modal		;modal test win
				WriteLine(fileh, ";program stops until dialog is terminated")
				WriteLine(fileh, ";returns 1 when ended with ESC, 2 when ended with ENTER")
				WriteLine(fileh, "")
			EndIf
		EndIf

		w_x = gui_getwinx(form)
		w_y = gui_getwiny(form)
		w_width = gui_getwinw(form)
		w_height = gui_getwinh(form)
		w_type = GetWinType(form)
		WriteLine(fileh, "	gui_makewindow(" + form + ", " + w_width + ", " + w_height + ", 0, " + w_type + ")")

		For g.gad = Each gad	;gadgets
			If gui_gettype(59) = 16
				exp_ID = Str(form) + Str(g\id - form)
			Else
				exp_ID = g\id
			EndIf
			
			width = gui_getw(g\id)
			height = gui_geth(g\id)
			mode =  gui_getmode(g\id)
			If g\noclick Then mode = mode + 2
			If g\rightclick Then mode = mode + 8
			If g\Inputgadget Then mode = mode + 256

			nt =  gui_gettype(g\id)
			ot = GetOverType(g\id)
			dt = GetDownType(g\id)

			ni$ = g\ni
			oi$ = g\oi
			di$ = g\di
			os$ =  g\os
			ds$ =  g\ds

			WriteLine(fileh, "	gui_makegadget(" + form + ", " + exp_ID + ", " + gui_getx(g\id) + ", " + gui_gety(g\id) + ", " + width + ", " + height + ", " + mode + ", " + nt + ", " + Chr(34) + gui_gettext(g\id) + Chr(34) + ", " + GetAlign(g\id) + ")")
			If (ot Or dt) Then WriteLine(fileh, "		gui_settypes(" + exp_ID + ", " + nt + ", " + ot + ", " + dt + ")")
			If g\ni <> ""
				WriteLine(fileh, "		nih = LoadImage(" + Chr(34) + g\ni + Chr(34) + ")")
				WriteLine(fileh, "		If nih <> 0 Then nih = gui_givebutton(nih, " + width + ", " + height + ")")
				tmp1$ = "nih"
			Else
				tmp1$ = Chr(34) + Chr(34)
			EndIf
			If g\oi <> ""
				WriteLine(fileh, "		oih = LoadImage(" + Chr(34) + g\oi + Chr(34) +  ")")
				WriteLine(fileh, "		If oih <> 0 Then oih = gui_givebutton(oih, " + width + ", " + height + ")")
				tmp2$ = "oih"
			Else
				tmp2$ = Chr(34) + Chr(34)
			EndIf
			If g\di <> ""
				WriteLine(fileh, "		dih = LoadImage(" + Chr(34) + g\di + Chr(34) +  ")")
				WriteLine(fileh, "		If dih <> 0 Then dih = gui_givebutton(dih, " + width + ", " + height + ")")
				tmp3$ = "dih"
			Else
				tmp3$ = Chr(34) + Chr(34)
			EndIf
			If g\ni <> "" Or g\oi <> "" Or g\di <> ""
				WriteLine(fileh, "		gui_setimages(" + exp_ID + ", 0, 0, " + tmp1 + ", " + tmp2 + ", " + tmp3 + ")")
				WriteLine(fileh, "")
			EndIf

			If g\os <> ""
				WriteLine(fileh, "		osh = LoadSound(" + Chr(34) + g\os + Chr(34) + ")")
				tmp1$ = "osh"
			Else
				tmp1$ = Chr(34) + Chr(34)
			EndIf
			If g\ds <> ""
				WriteLine(fileh, "		dsh = LoadSound(" + Chr(34) + g\ds + Chr(34) +  ")")
				tmp2$ = "dsh"
			Else
				tmp2$ = Chr(34) + Chr(34)
			EndIf
			If g\os <> "" Or g\ds <> ""
				WriteLine(fileh, "		gui_setsounds(" + exp_ID + ", " + tmp1 + ", " + tmp2 + ")")
				WriteLine(fileh, "")
			EndIf
		Next

		WriteLine(fileh, "")
		WriteLine(fileh, "	gui_drawwindow(" + form + ", " + w_x + ", " + w_y + ")")
		If exp_modal And exp_fulapp
			WriteLine(fileh, "")
			WriteLine(fileh, "	Repeat		;loop")
			WriteLine(fileh, "		Cls")
			WriteLine(fileh, "		Color 255, 255, 255")
			WriteLine(fileh, "		Text 0, 0, " + Chr(34) + "hit ESC to exit and return 1" + Chr(34))
			WriteLine(fileh, "		Text 0, 10, " + Chr(34) + "hit ENTER to exit and return 2" + Chr(34))
			WriteLine(fileh, "		gadsel = gui_update(" +  form + ", gui_wait)")

				For g.gad = Each gad
					If g\slider_in <> 0
						If actline = False
							WriteLine(fileh, "		If gadsel Then act = gadsel")
							WriteLine(fileh, "")
							actline = True
						EndIf

						If gui_gettype(59) = 16
							exp_ID$ = Str(form) + Str(g\id - form)
							exp_ID2$ = Str(form) + Str(g\slider_in - form)
						Else
							exp_ID = g\id
							exp_ID2 = g\slider_in
						EndIf
			
						WriteLine(fileh, "		If act = " + exp_ID + " Then debugtext = gui_HandleSlider(act, " + form + ", " + exp_ID + ", " + exp_ID2 + ", " + g\vertical + ", True)")
					EndIf
				Next
				
			If exp_gadselect > 0
				WriteLine(fileh, "")
				WriteLine(fileh, "		HandleGuiInput()")
			EndIf

			WriteLine(fileh, "")
			WriteLine(fileh, "		If debugtext <> " + Chr(34) + Chr(34))
			WriteLine(fileh, "			Color 255, 0, 0")
			WriteLine(fileh, "			Text 0, 30, debugtext")
			WriteLine(fileh, "		EndIf")
			WriteLine(fileh, "")

			WriteLine(fileh, "		Flip")
			WriteLine(fileh, "")
			WriteLine(fileh, "		If KeyHit(1)")
			WriteLine(fileh, "			FlushKeys")
			WriteLine(fileh, "			gui_freewindow(" + form + ")")
			If exp_gadselect Then WriteLine(fileh, "			debugtext = " + Chr(34) + Chr(34))
			WriteLine(fileh, "			Return 1")
			WriteLine(fileh, "		ElseIf KeyHit(28)")
			WriteLine(fileh, "			FlushKeys")
			WriteLine(fileh, "			gui_freewindow(" + form + ")")
			If exp_gadselect Then WriteLine(fileh, "			debugtext = " + Chr(34) + Chr(34))
			WriteLine(fileh, "			Return 2")
			WriteLine(fileh, "		EndIf")
			WriteLine(fileh, "	Forever")
		EndIf
		If exp_fulapp Then WriteLine(fileh, "End Function")

	CloseFile(fileh)
End Function

Function FillCtrl()
	gui_settext(57, frmfile, 1)
	gui_settext(49, form)
	If act > 0
		g.gad = GetGad(act)
		
		If g\container_for <> 0
			gui_settext(67, g\container_for)
		Else
			gui_settext(67, "")
		EndIf

		If g\slider_in <> 0
			gui_settypes(32, 16)
			gui_settext(34, g\slider_in)
			If g\vertical
				gui_settext(33, "vertical")
			Else
				gui_settext(33, "horizontal")
			EndIf
		Else
			gui_settypes(32, 15)
			gui_settext(33, "")
			gui_settext(34, "")
		EndIf

		gui_settext(2, gui_gettext(act), 1)
		
		;modes
		mode = gui_getmode(act)
		If g\noclick Then
			gui_settypes(5, 16)
		Else
			gui_Settypes(5, 15)
		EndIf

		If mode And 4 Then
			gui_settypes(6, 16)
		Else
			gui_settypes(6, 15)
		EndIf

		If g\rightclick Then
			gui_settypes(7, 16)
		Else
			gui_settypes(7, 15)
		EndIf

		If g\inputgadget Then
			gui_settypes(11, 16)
		Else
			gui_settypes(11, 15)
		EndIf

		If mode And 16 Then
			gui_settypes(8, 16)
		Else
			gui_settypes(8, 15)
		EndIf

		If mode And 32 Then
			gui_settypes(9, 16)
		Else
			gui_settypes(9, 15)
		EndIf
		If mode And 64 Then
			gui_settypes(10, 16)
		Else
			gui_settypes(10, 15)
		EndIf
		
		gui_settext(31, act)
		ntyp = gui_gettype(act)
		gui_settext(16, ntyp)
		gui_settext(17, GetOverType(act))
		gui_settext(18, GetDownType(act))

		align = GetAlign(act)
		If ntyp > 12 And ntyp < 17
			tmp1$ = "right"
			align = 2
		Else
			If align = 0
				tmp1$ = "center"
			ElseIf align = 1
				tmp1 = "left"
			ElseIf align = 2
				tmp1 = "right"
			EndIf
		EndIf
		
		gui_settext(3, tmp1 + " align", align)
		gui_settypes(3, 1)

		If g\ni <> ""
			gui_settext(42, g\ni)
		Else
			gui_settext(42, "(none)")
		EndIf
		If g\oi <> ""
			gui_settext(43, g\oi)
		Else
			gui_settext(43, "(none)")
		EndIf
		If g\di <> ""
			gui_settext(44, g\di)
		Else
			gui_settext(44, "(none)")
		EndIf
		If g\os <> ""
			gui_settext(45, g\os)
		Else
			gui_settext(45, "(none)")
		EndIf
		If g\ds <> ""
			gui_settext(46, g\ds)
		Else
			gui_settext(46, "(none)")
		EndIf
		gui_settext(23, gui_getx(act))
		gui_settext(24, gui_gety(act))
		gui_settext(25, gui_getw(act))
		gui_settext(26, gui_geth(act))
	Else	;form
		gui_settypes(32, 15)
		gui_settext(33, "")
		gui_settext(34, "")
		gui_settext(67, "")

		tmp1$ = GetWinText(form)

		If tmp1 = ""
			gui_settext(2, tmp1)
		Else
			gui_settext(2, tmp1, 1)
		EndIf

		align = GetAlign(form)
		If align = 0
			tmp1$ = "center"
		ElseIf align = 1
			tmp1 = "left"
		ElseIf align = 2
			tmp1 = "right"
		EndIf
		
		gui_settext(3, tmp1 + " align", align)
		gui_settypes(3, 1)

		gui_settypes(5, 15)
		gui_settypes(6, 15)
		gui_settypes(7, 15)
		gui_settypes(8, 15)
		gui_settypes(9, 15)
		gui_settypes(10, 15)
		gui_settypes(11, 15)

		mode = gui_getmode(0)
		If mode And 2
			gui_settypes(5, 16)
		ElseIf mode And 4
			gui_settypes(6, 16)
		ElseIf mode And 8
			gui_settypes(7, 16)
		ElseIf mode And 16
			gui_settypes(8, 16)
		ElseIf mode And 32
			gui_settypes(9, 16)
		ElseIf mode And 64
			gui_settypes(10, 16)
		ElseIf mode And 256
			gui_settypes(11, 16)
		EndIf

		ntyp = GetWinType(form)
		gui_settext(16, ntyp)
	
		gui_settext(31, "")
		gui_settext(43, "")
		gui_settext(44, "")
		gui_settext(45, "")
		gui_settext(46, "")
		If formimg <> ""
			gui_settext(42, formimg)
		Else
			gui_settext(42, "(none)")
		EndIf
		gui_settext(23, gui_getwinx(form))
		gui_settext(24, gui_getwiny(form))
		gui_settext(25, gui_getwinw(form))
		gui_settext(26, gui_getwinh(form))
		gui_settext(17, "")
		gui_settext(18, "")
	EndIf
	If gui_gethandle(1) Then gui_redrawwindow(1)
End Function

Function GetAlign(name)
	For w.gui_gadget = Each gui_gadget
		If w\num = name Or (w\windownum = name And w\num = 0)
			Return w\justify
		EndIf
	Next
End Function

Function GetDownType(name)
	For w.gui_gadget = Each gui_gadget
		If w\num = name
			Return w\down_gad_type
		EndIf
	Next
End Function

Function GetFreeID(num)
	If num < form + 1 Then num = form + 1
	g.gad = First gad
	If g = Null Then Return num
	
	Repeat
		For g = Each gad
			If num = g\id Then Exit	;not free
			If g = Last gad
				Return num
			EndIf
		Next
		num = num + 1
	Forever
End Function

Function GetGad.gad(id)
	For g.gad = Each gad
		If g\id = id Then Return g
	Next
End Function

Function GetOverType(name)
	For w.gui_gadget = Each gui_gadget
		If w\num = name
			Return w\over_gad_type
		EndIf
	Next
End Function

Function GetUserInput()
	If (MouseHit(3) Or MouseHit(2))		;init pos for pan/scale
		If act > 0
			posx = mx - gui_getwinx(form) - gui_getx(act)
			posy = my - gui_getwiny(form) - gui_gety(act)
		Else
			posx = mx - gui_getwinx(form)
			posy = my - gui_getwiny(form)
		EndIf
		MouseXSpeed()
		MouseYSpeed()
	EndIf

	If MouseDown(2)		;pan
		If act > 0
			If KeyDown(42) Or KeyDown(54)		;horiz
				newx = mx - gui_getwinx(form) - posx
				newy = gui_gety(act)
			ElseIf KeyDown(29) Or KeyDown(157)	;vert
				newx = gui_getx(act)
				newy = my - gui_getwiny(form) - posy
			Else								;both
				newx = mx - gui_getwinx(form) - posx
				newy = my - gui_getwiny(form) - posy
			EndIf

			gui_setposition(act, newx, newy)
		Else	;form
			If KeyDown(42) Or KeyDown(54)
				newx = mx - posx
				newy = gui_getwiny(form)
			ElseIf KeyDown(29) Or KeyDown(157)
				newx = gui_getwinx(form)
				newy = my - posy
			Else
				newx = mx - posx
				newy = my - posy
			EndIf
			gui_setwinxy(form, newx, newy)
		EndIf
		gui_redrawwindow(form)
		FillCtrl()
	ElseIf MouseDown(3)	;scale
		mxspd# = MouseXSpeed()
		myspd# = MouseYSpeed()
		If act > 0
			If KeyDown(42) Or KeyDown(54)		;width
				newwidth = gui_getw(act) + mxspd
				newheight = gui_geth(act)
			ElseIf KeyDown(29) Or KeyDown(157)	;height
				newwidth = gui_getw(act)
				newheight = gui_geth(act) + myspd
			Else								;both
				newwidth = gui_getw(act) + mxspd
				newheight = gui_geth(act) + myspd
			EndIf
			If newwidth < 25 Then newwidth = 25
			If newheight < 10 Then newheight = 10
			nt = gui_gettype(act)

			Select nt	;radiobtns/checkboxes (needs fix in quickgui.bb)
				Case 13, 14
					newheight = 13
				Case 15, 16
					newheight = 12
			End Select
			gui_setsize(act, newwidth, newheight)

		Else	;form
			If KeyDown(42) Or KeyDown(54)
				newwidth = gui_getwinw(form) + mxspd
				newheight = gui_getwinh(form)
			ElseIf KeyDown(29) Or KeyDown(157)
				newwidth = gui_getwinw(form)
				newheight = gui_getwinh(form) + myspd
			Else
				newwidth = gui_getwinw(form) + mxspd
				newheight = gui_getwinh(form) + myspd
			EndIf
			If newwidth < 100 Then newwidth = 100
			If newheight < 50 Then newheight = 50
			gui_setwinsize(form, newwidth, newheight)
		EndIf
		gui_redrawwindow(form)
		FillCtrl()
	EndIf
	
	If MouseDown(3) = False And newwidth <> 0 And newheight <> 0
		If act > 0
			UpdImages(GetGad(act))
			gui_redrawwindow(form)
		Else
			UpdImages(Null)
			gui_redrawwindow(form)
		EndIf
		newwidth = 0
		newheight = 0
	EndIf
	
	If MouseDown(1) Or MouseDown(2) Or MouseDown(3)
		wait = True
	Else
		wait = False
	EndIf
	
	If KeyHit(28)	;return
		ApplyAll()
	ElseIf gadsel = 58
		waitformouse()
		endprog = True
	ElseIf KeyHit(62)	;f4
		If gui_gethandle(1)
			gui_freewindow(1)
		Else
			CtrlWin()
		EndIf
	ElseIf KeyHit(45) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 29	;ctrl+X
		waitformouse()
		If act = 0 Then Return
		g.gad = GetGad(act)
		FreeImage g\nih
		FreeImage g\oih
		FreeImage g\dih
		FreeSound g\osh
		FreeSound g\dsh
		
		If g\container_for
			g2.gad = GetGad(g\container_for)
			g2\slider_in = 0
		EndIf
		
		If g\slider_in
			g2.gad = GetGad(g\slider_in)
			g2\container_for = 0
		EndIf

		Delete g
		
		For w.gui_gadget = Each gui_gadget
			If w\num = act
				Delete w.gui_gadget
				Exit
			EndIf
		Next
		If cyclic_IDs Then SortIDs()
		act = 0
		gui_redrawwindow(form)
		FillCtrl()
	ElseIf KeyHit(31) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 52 Or gadsel = 72	;save
		waitformouse()
		tmp$ = gui_gettext(57)
		
		If Lower(Left(tmp, 9) = "unnamed") Or gadsel = 72
			gui_filter(0) = ".vbf"
			tmp = gui_Filerequestor("Save file as...", dir_open, "", GraphicsWidth()/2 - 225, GraphicsHeight()/2 - 160)
	
			If tmp <> ""
				For position = Len(tmp) - 1 To 1 Step - 1
					If Mid(tmp, position, 1) = "\"
						path$ = Left(tmp, position)
						Exit
					EndIf
				Next
	
				If Lower(Right(tmp, 4)) <> ".vbf" Then tmp = tmp + ".vbf"
		
				dir_open = path			
				SaveForm(Right(tmp, Len(tmp) - Len(path)))
			EndIf
		ElseIf tmp <> ""
			If Lower(Right(tmp, 4)) <> ".vbf" Then tmp = tmp + ".vbf"
			SaveForm(tmp)
		EndIf
	ElseIf KeyHit(24) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 51	;open
		waitformouse()
		FlushKeys
		gui_filter(0) = ".vbf"
		tmp$ = gui_filerequestor("Open file...", dir_open, "", GraphicsWidth()/2 - 225, GraphicsHeight()/2 - 160)

		If tmp <> ""
			For position = Len(tmp) - 1 To 1 Step - 1
				If Mid(tmp, position, 1) = "\"
					path$ = Left(tmp, position)
					Exit
				EndIf
			Next

			dir_open = path
			LoadForm(Right(tmp, Len(tmp) - Len(path)))
		EndIf
	ElseIf KeyHit(32) And (KeyDown(29) Or KeyDown(42)) Or gadsel = 28	;dup gad, shift=horiz, ctrl=vert
		If act = 0 Then Return
		oldgad.gad = GetGad(act)

		width = gui_getw(act)
		height = gui_geth(act)

		If KeyDown(42)
			x = gui_getx(act) + width + 5
			y = gui_gety(act)
		Else
			x = gui_getx(act)
			y = gui_gety(act) + height + 5
		EndIf

		mode = gui_getmode(act)
		nt = gui_gettype(act)
		ot = GetOverType(act)
		dt = GetDownType(act)
		align = GetAlign(act)
		
		g.gad = New gad
		g\id = GetFreeID(form + 1)
		g\noclick = oldgad\noclick
		g\rightclick = oldgad\rightclick
		g\inputgadget = oldgad\inputgadget
		g\ni = oldgad\ni
		g\oi = oldgad\oi
		g\di = oldgad\di
		g\os = oldgad\os
		g\ds = oldgad\ds
		
		gui_makegadget(form, g\id, x, y, width, height, mode, 1, g\id, align)
		gui_settypes(g\id, nt, ot, dt)
		
		act = g\id
		UpdImages(g)
		UpdSounds(g)
		gui_redrawwindow(form)
		FillCtrl()
		waitformouse()
	ElseIf KeyHit(49) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 50	;new form
		waitformouse()
		For g.gad = Each gad
			FreeImage g\nih
			FreeImage g\oih
			FreeImage g\dih
			FreeSound g\osh
			FreeSound g\dsh
			Delete g
		Next
		frmfile = "unnamed"
		
		gui_freewindow(form)
		form = 100
		gui_makewindow(form, 400, 300, 0, 1)
		gui_drawwindow(form, 260, 60)
		
		act = 0

		AppTitle frmfile + " - VisualB"
		CtrlWin()
		FillCtrl()
	ElseIf KeyHit(210) Or gadsel = 47	;ins-new gad
		g.gad = New gad
		g\id = GetFreeID(form + 1)
		
		gui_makegadget(form, g\id, 50, 50, 60, 25, 1, 1, g\id)
		act = g\id
		FillCtrl()
		gui_redrawwindow(form)
		waitformouse()
	ElseIf gadsel = 27	;compress IDs
		waitformouse()
		retval = MsgBox("Gadget IDs will be changed. Continue?", 1, "Sort and compress gadget IDs...")
		If retval = 1
			SortIDs()
		EndIf
	ElseIf gadsel = 0 And MouseHit(1) And mx>gui_getwinx(form) And mx<gui_getwinx(form)+gui_getwinw(form) And my>gui_getwiny(form) And my<gui_getwiny(form)+gui_getwinh(form) And KeyDown(56) = False
		;Lclick: activate form
		act = 0
		FillCtrl()
	ElseIf KeyHit(60)	;F2 edit text
		FlushKeys
		If Not(gui_getmode(2) And 2048)
			gui_settext(2, "", GetAlign(2))
			gui_setmode(2, gui_getmode(2) + 2048)
			gui_textcursorpos = 0
		EndIf
	ElseIf KeyHit(59) Or gadsel = 71	;F1 help
		waitformouse()
		txt$ = "Ins - adds new gadget at (form-) position x=50, y=50" + Chr(31) + "LMB - selects item. MMB - resizes, RMB - moves selected item." + Chr(31) + "Shift - limits resizing/moving to horizontal only, "
		txt = txt + "Ctrl - limits to vertical" + Chr(31) + "Enter - applies changes made in control window"  + Chr(31) + Chr(31) + "Some hotkeys can be retrieved by holding the mouse over a button for about "
		txt = txt + "two secs..." + Chr(31) + Chr(31) + "F1 - displays this help" + Chr(31) + "F2 - edit gadget text" + Chr(31) + "F3 - find/goto gadget" + Chr(31) + "F4 - show/hide control window"
		txt = txt + Chr(31) + "F5 - left/right position of control window" + Chr(31) + "F6 - slim/fat gadget marker" + Chr(31) + "Alt+F4 - ends program" + Chr(31) + "Tab/Shift+Tab - jumps from item To item" 
		txt = txt + Chr(31) + "Alt+drag - tests slider movement" + Chr(31) + Chr(31) + "SPECIAL THANKS TO THE PEOPLE OF WICKEDRUSH SOFTWARE FOR THE WORK AND POWER THEY PUT IN QUICKGUI!"
		MsgBox(txt, 0, "Help...")
	ElseIf KeyHit(1)
		endprog = True
	ElseIf KeyHit(61)	;F3	goto
		FlushKeys
		If Not(gui_getmode(55) And 2048)
			gui_setmode(55, gui_getmode(55) + 2048)
			gui_textcursorpos = 0
		EndIf
	ElseIf KeyHit(63)	;F5 left/right position
		If gui_gethandle(1)
			If  ctrlpos = 0
				ctrlpos = GraphicsWidth() - 227
			Else
				ctrlpos = 0
			EndIf
			CtrlWin()
		EndIf
	ElseIf KeyHit(64)
		fatmark = Not fatmark
	ElseIf KeyHit(23) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 70		;ctrl+i gad info
		waitformouse()
		For g.gad = Each gad
			gadcount = gadcount + 1
		Next

		tmp1$ = gadcount + " gadgets" + Chr(31) + "Used IDs: "
		For g.gad = Each gad
			If tmp1 = ""
				tmp1 = g\id
			Else
				tmp1$ = tmp1 + " " + g\id
			EndIf
		Next

		For g.gad = Each gad
			If g\id > max Then max = g\id
		Next

		tmp1 = tmp1 + Chr(31) + Chr(31) + "Free:"
		For i = form + 1 To max
			free = GetFreeID(i)
			If free = i
				tmp1 = tmp1 + " " + i
			EndIf
		Next
		If Right(tmp1, 1) = ":" Then tmp1 = tmp1 + " (none)"
		MsgBox(tmp1, 0, "Info...")

	ElseIf KeyHit(15)	;Tab
		If act <> 0
			g.gad = GetGad(act)
			If KeyDown(42)	;Lshift previous gad
				If g = First gad
					g = Last gad
				Else
					g = Before g
				EndIf
			Else			;next gad
				If g = Last gad
					g = First gad
				Else
					g = After g
				EndIf
			EndIf
			act = g\id
		Else
			If KeyDown(42)
				g = Last gad
			Else
				g = First gad
			EndIf
			If g <> Null
				act = g\id
			Else
				act = 0
			EndIf
		EndIf
		FillCtrl()
	ElseIf gadsel = 42 Or gadsel = 43 Or gadsel = 44	;load image
		tmp1 = gadsel
		waitformouse()
		If act <> 0 Or tmp1 = 42
			gui_filter(0) = ".bmp"
			gui_filter(1) = ".jpg"
			tmp2$ = gui_filerequestor("Load image...", dir_img, "", GraphicsWidth()/2 - 225, GraphicsHeight()/2 - 160)
			FlushMouse()
		Else
			Return
		EndIf

		If act <> 0
			g.gad = GetGad(act)
	
			If tmp1 = 42		;normalimg
				g\ni = tmp2
			ElseIf tmp1 = 43	;overimg
				g\oi = tmp2
			ElseIf tmp1 = 44	;downimg
				g\di = tmp2
			EndIf
			UpdImages(g)
		ElseIf tmp1 = 42
			formimg = tmp2
			UpdImages(Null)
		EndIf

		;checkout path...
		If tmp2 <> ""
			For position = Len(tmp2) - 1 To 1 Step - 1
				If Mid(tmp2, position, 1) = "\"
					path$ = Left(tmp2, position)
					Exit
				EndIf
			Next
			dir_img = path
		EndIf

		gui_redrawwindow(form)
		FillCtrl()
	ElseIf act <> 0 And (gadsel = 45 Or gadsel = 46)	;load sound
		waitformouse()
		tmp1 = gadsel
		gui_filter(0) = ".wav"
		tmp2$ = gui_filerequestor("Load sound...", dir_snd, "", GraphicsWidth()/2 - 225, GraphicsHeight()/2 - 160)
		FlushMouse()
		g.gad = GetGad(act)

		If tmp1 = 45		;oversnd
			g\os = tmp2
		ElseIf tmp1 = 46	;downsnd
			g\ds = tmp2
		EndIf

		If tmp2 <> ""
			For position = Len(tmp2) - 1 To 1 Step - 1
				If Mid(tmp2, position, 1) = "\"
					path$ = Left(tmp2, position)
					Exit
				EndIf
			Next
			dir_snd = path
		EndIf

		UpdSounds(g)
		FillCtrl()
	ElseIf gadsel = 3	;align left/center/right (right needs fix in quickgui)
		If act > 0
			align = GetAlign(act)
			align = align + 1
			If align > 2 Then align = 0
			gui_settext(act, gui_gettext(act), align)
		Else
			align = GetAlign(form)
			align = align + 1
			If align > 2 Then align = 0
			SetWinText(form, gui_gettext(2), align)
		EndIf
		gui_redrawwindow(form)
		FillCtrl()
		waitformouse()

									;gad-modes (left out 128)
	ElseIf gadsel = 5 And act > 0	;2
		g.gad = GetGad(act)
		If gui_gettype(5) = 15
			gui_settypes(5, 16)
			g\noclick = True
		Else
			gui_settypes(5, 15)
			g\noclick = False
		EndIf
		ApplyAll()
		waitformouse()
	ElseIf gadsel = 6 And act > 0	;4
		mode = gui_getmode(act)
		If gui_gettype(6) = 15
			gui_settypes(6, 16)
			If Not(mode And 4) Then mode = mode + 4
		Else
			gui_settypes(6, 15)
			If mode And 4 Then mode = mode - 4
		EndIf
		gui_setmode(act, mode)
		ApplyAll()
		waitformouse()
	ElseIf gadsel = 7 And act > 0	;8
		g.gad = GetGad(act)
		If gui_gettype(7) = 15
			gui_settypes(7, 16)
			g\rightclick = True
		Else
			gui_settypes(7, 15)
			g\rightclick = False
		EndIf
		ApplyAll()
		waitformouse()
	ElseIf gadsel = 8 And act > 0	;16
		mode = gui_getmode(act)
		If gui_gettype(8) = 15
			gui_settypes(8, 16)
			If Not(mode And 16) Then mode = mode + 16
		Else
			gui_settypes(8, 15)
			If mode And 16 Then mode = mode - 16
		EndIf
		gui_setmode(act, mode)
		ApplyAll()
		waitformouse()
	ElseIf gadsel = 9 And act > 0	;32
		mode = gui_getmode(act)
		If gui_gettype(9) = 15
			gui_settypes(9, 16)
			If Not(mode And 32) Then mode = mode + 32
		Else
			gui_settypes(9, 15)
			If mode And 32 Then mode = mode - 32
		EndIf
		gui_setmode(act, mode)
		ApplyAll()
		waitformouse()
	ElseIf gadsel = 10 And act > 0	;64
		mode = gui_getmode(act)
		If gui_gettype(10) = 15
			gui_settypes(10, 16)
			If Not(mode And 64) Then mode = mode + 64
		Else
			gui_settypes(10, 15)
			If mode And 64 Then mode = mode - 64
		EndIf
		gui_setmode(act, mode)
		ApplyAll()
		waitformouse()
	ElseIf gadsel = 11 And act > 0	;256
		g.gad = GetGad(act)
		If gui_gettype(11) = 15
			gui_settypes(11, 16)
			g\inputgadget = True
		Else
			gui_settypes(11, 15)
			g\inputgadget = False
		EndIf
		ApplyAll()
		waitformouse()
	ElseIf KeyHit(18) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 53	;ctrl-e
		waitformouse()
		export()
	ElseIf gadsel = 60	;sample app code
		waitformouse()
		gui_settypes(60, 14)
		gui_settypes(64, 13)
		If exp_modal
			gui_settypes(65, 16)
		Else
			gui_settypes(65, 15)
		EndIf
		If exp_gadselect = 0
			gui_settypes(61, 14)
		ElseIf exp_gadselect = 1
			gui_settypes(62, 14)
		Else
			gui_settypes(63, 14)
		EndIf
		exp_fulapp = True
		gui_redrawwindow(1)
	ElseIf gadsel = 64	;no app code
		waitformouse()
		gui_settypes(64, 14)
		gui_settypes(60, 13)
		gui_settypes(61, 13)
		gui_settypes(62, 13)
		gui_settypes(63, 13)
		gui_settypes(65, 15)
		exp_fulapp = False
		gui_redrawwindow(1)
	ElseIf gadsel = 61	;no selector
		waitformouse()
		gui_settypes(60, 14)
		gui_settypes(64, 13)
		gui_settypes(61, 14)
		gui_settypes(62, 13)
		gui_settypes(63, 13)
		If exp_modal
			gui_settypes(65, 16)
		Else
			gui_settypes(65, 15)
		EndIf
		exp_gadselect = 0
		exp_fulapp = True
		gui_redrawwindow(1)
	ElseIf gadsel = 62	;select/case
		waitformouse()
		gui_settypes(60, 14)
		gui_settypes(64, 13)
		gui_settypes(61, 13)
		gui_settypes(62, 14)
		gui_settypes(63, 13)
		If exp_modal
			gui_settypes(65, 16)
		Else
			gui_settypes(65, 15)
		EndIf
		exp_gadselect = 1
		exp_fulapp = True
		gui_redrawwindow(1)
	ElseIf gadsel = 63	;if/then/else
		waitformouse()
		gui_settypes(60, 14)
		gui_settypes(64, 13)
		gui_settypes(61, 13)
		gui_settypes(62, 13)
		gui_settypes(63, 14)
		If exp_modal
			gui_settypes(65, 16)
		Else
			gui_settypes(65, 15)
		EndIf
		exp_gadselect = 2
		exp_fulapp = True
		gui_redrawwindow(1)
	ElseIf gadsel = 65	;modal
		waitformouse()
		If gui_gettype(65) = 15
			gui_settypes(65, 16)
			gui_settypes(60, 14)
			gui_settypes(64, 13)

			If exp_gadselect = 0
				gui_settypes(61, 14)
			ElseIf exp_gadselect = 1
				gui_settypes(62, 14)
			Else
				gui_settypes(63, 14)
			EndIf

			exp_fulapp = True
			exp_modal = True
		Else
			gui_settypes(65, 15)
			exp_modal = False
		EndIf
		gui_redrawwindow(1)
	ElseIf gadsel = 59	;long IDs, export only
		waitformouse()
		If gui_gettype(59) = 15
			gui_settypes(59, 16)
		Else
			gui_settypes(59, 15)
		EndIf
		gui_redrawwindow(1)
	ElseIf gadsel = 32	;slidergad
		FlushKeys
		If act
			g.gad = GetGad(act)
			waitformouse()
			
			If g\container_for <> 0
				g2.gad = GetGad(g\container_for)
				MsgBox("Gadget " + act + " is already a container for " + g2\id, 0, "Make slider gadget...")
				Return
			EndIf

			If gui_gettype(32) = 15
				gui_settypes(32, 16)
				If Not(gui_getmode(34) And 2048)
					gui_setmode(34, gui_getmode(34) + 2048)	;container-ID
					gui_textcursorpos = 0
					gui_settext(34, "")
				EndIf
			Else
				If g\slider_in <> 0
					g2.gad = GetGad(g\slider_in)
					g2\container_for = 0
				EndIf
				g\slider_in = 0
				g\vertical = False
				gui_settext(34, "")
				gui_settypes(32, 15)
				gui_settext(33, "")
			EndIf

			gui_redrawwindow(1)
		EndIf

	ElseIf gadsel = 33	;vert/horiz slider
		If act
			g.gad = GetGad(act)
			
			waitformouse()
			If g\slider_in
				If gui_gettext(33) = "vertical"
					gui_settext(33, "horizontal")
					g\vertical = False
				Else
					gui_settext(33, "vertical")
					g\vertical = True
				EndIf
			Else
				gui_settext(33, "")
			EndIf
			gui_redrawwindow(1)
		EndIf
	ElseIf gadsel = 68						
		waitformouse()

		If cyclic_ids	;starting at form + 1, no gaps in between, e.g. 2001-2002-2003
			cyclic_ids = False
			gui_settypes(68, 15)
		Else			;noncyclic=IDs only have to be unique, e.g. 2002-2007-2011
			retval = MsgBox("Activating cyclic ID-handling will line up gadget IDs with no gaps in between. " + Chr(31) + "Continue?", 1, "Make IDs cyclic...")
			If retval = 1
				cyclic_ids = True
				gui_settypes(68, 16)
				SortIDs()
			EndIf
		EndIf
		gui_redrawwindow(1)
	ElseIf KeyHit(21) And (KeyDown(29) Or KeyDown(157)) Or gadsel = 69	;ctrl-z reload
		waitformouse()
		LoadForm(frmfile)
	EndIf
End Function

Function GetWinText$(name)
	For w.gui_gadget = Each gui_gadget
		If w\windownum = name And w\num = 0
			Return w\textstr$
		EndIf
	Next
End Function

Function GetWinType(name)
	For w.gui_gadget = Each gui_gadget
		If w\num = 0 And w\windownum = name
			Return w\typ
		EndIf
	Next
End Function

Function LoadForm(fn$)
	If fn <> "tempfile" Then frmfile = fn

	If FileType(dir_open + fn) = 0
		CtrlWin()
		Return
	EndIf

	For g.gad = Each gad
		FreeImage g\nih
		FreeImage g\oih
		FreeImage g\dih
		FreeSound g\osh
		FreeSound g\dsh
		Delete g
	Next
	gui_freewindow(form)
	act = 0

	file = ReadFile(dir_open + fn)
	While Not Eof(file)
		zeile$ = ReadLine(file)
		separatorposition = Instr(zeile, "=")
		wert$ = Mid(zeile, separatorposition + 1, -1)

		Select Trim(Mid(zeile, 1, separatorposition - 1))
			Case "cyclic_ids"
				cyclic_ids = wert
			Case "ctrlpos"
				ctrlpos = wert
			Case "form"
				form = wert
				If form < 100 Then form = 100
			Case "w_x"
				w_x = wert
			Case "w_y"
				w_y = wert
			Case "w_width"
				w_width = wert
			Case "w_height"
				w_height = wert
			Case "w_type"
				w_type = wert
				gui_makewindow(form, w_width, w_height, 0, w_type)
			Case "w_img"
				formimg = wert
				If formimg <> "" Then UpdImages(Null)
			Case "w_text"
				txt$ = wert
			Case "w_align"
				align = wert
				SetWinText(form, txt, align)
			Case "gadget"
				id = wert
			Case "noclick"
				noclick = wert
			Case "rightclick"
				rightclick = wert
			Case "inputgadget"
				inputgadget = wert
			Case "slider_in"
				slider_in = wert
			Case "vertical"
				vertical = wert
			Case "x"
				x = wert
			Case "y"
				y = wert
			Case "width"
				width = wert
			Case "height"
				height = wert
			Case "mode"
				mode = wert
			Case "nt"
				nt = wert
			Case "ot"
				ot = wert
			Case "dt"
				dt = wert
			Case "text"
				txt$ = wert
			Case "align"
				align = wert
			Case "ni"
				ni$ = wert
				If ni <> "" And Instr(ni, "\") = 0 Then ni = dir_app + ni
			Case "oi"
				oi$ = wert
				If oi <> "" And Instr(oi, "\") = 0 Then oi = dir_app + oi
			Case "di"
				di$ = wert
				If di <> "" And Instr(di, "\") = 0 Then di = dir_app + di
			Case "os"
				os$ = wert
				If os <> "" And Instr(os, "\") = 0 Then os = dir_app + os
			Case "ds"
				ds$ = wert
				If ds <> "" And Instr(ds, "\") = 0 Then ds = dir_app + ds

				gui_makegadget(form, id, x, y, width, height, mode, nt, txt, align)
				gui_settypes(id, nt, ot, dt)
				g.gad = New gad
				g\noclick = noclick
				g\rightclick = rightclick
				g\inputgadget = inputgadget
				g\slider_in = slider_in
				g\vertical = vertical
				g\id = id
				g\ni = ni
				g\oi = oi
				g\di = di
				g\os = os
				g\ds = ds
				If g\ni <> "" Or g\oi <> "" Or g\di <> "" Then UpdImages(g)
				If g\os <> "" Or g\ds <> "" Then UpdSounds(g)
		End Select
	Wend
	gui_drawwindow(form, w_x, w_y)
	CloseFile(file)

	For g.gad = Each gad
		If g\slider_in
			tmpgad.gad = GetGad(g\slider_in)
			tmpgad\noclick = True
			tmpgad\container_for = g\id
		EndIf
	Next

	CtrlWin()
	AppTitle frmfile + " - VisualB"
End Function

Function LoadINI()
	If FileType(dir_app + "visualb.ini") = 0
		firststart = True
		file = WriteFile(dir_app + "visualb.ini")	;new ini
			WriteLine(file, "dir_app=" + dir_app)
			WriteLine(file, "dir_open=" + dir_app)
			WriteLine(file, "dir_img=" + dir_img)
			WriteLine(file, "dir_snd=" + dir_snd)
			WriteLine(file, "exp_fulapp=" + exp_fulapp)
			WriteLine(file, "exp_modal=" + exp_modal)
			WriteLine(file, "exp_gadselect=" + exp_gadselect)
			WriteLine(file, "fatmark=" + fatmark)
			WriteLine(file, "lastform=")
		CloseFile(file)
	EndIf

	file = ReadFile(dir_app + "visualb.ini")
		While Not Eof(file)
			zeile$ = ReadLine(file)
			separator = Instr(zeile, "=")
			Wert$ = Mid(zeile, separator + 1, -1)
	
			Select Trim(Mid(zeile, 1, separator - 1))
			Case "dir_app"
				dir_app = wert
			Case "dir_open"
				dir_open = wert
			Case "dir_img"
				dir_img = wert
			Case "dir_snd"
				dir_snd = wert
			Case "exp_fulapp"
				exp_fulapp = wert
			Case "exp_modal"
				exp_modal = wert
			Case "exp_gadselect"
				exp_gadselect = wert
			Case "fatmark"
				fatmark = wert
			Case "lastform"
				If wert = "" Or FileType(dir_open + wert) = 0
					frmfile = "unnamed"
					form = 100
					gui_makewindow(form, 400, 300, 0, 1)
					gui_drawwindow(form, 260, 60)
					
					act = 0
					FillCtrl()
				Else
					frmfile = wert
				EndIf
			End Select
		Wend
	CloseFile(file)
	LoadForm(frmfile)
	Return firststart
End Function

Function MsgBox$(msg$, typ=0, title$="Message")
;types 0=Ok, 1=Ok/Cancel, 2=Yes/No/Cancel
	If gui_Gethandle(1000) Then gui_freewindow(1000)

	;limit title
	If Len(title) > 150 Then title = Left(title, 140) + "..."

	;min width
	If typ = 1
		If width < 210 Then width = 210
	ElseIf typ = 2
		If width < 310 Then width = 310
	Else
		If width < 100 Then width = 100
	EndIf

	;temp subdiv
	originalmsg$ = msg
	j = 1
	pos = Instr(msg, Chr(31))
	While pos
		While pos > 150
			For i = 150 To 1 Step -1
				pos = Instr(msg, " ", i)
				If pos < 150 Then Exit
			Next
			tmp$ = Left(msg, pos)
			If width < StringWidth(tmp) Then width = StringWidth(tmp)
			msg = Right(msg, Len(msg) - pos)
			pos = Instr(msg, Chr(31))
			j = j + 1
		Wend

		tmp = Left(msg, pos - 1)
			If width < StringWidth(tmp) Then width = StringWidth(tmp)
		msg = Right(msg, Len(msg) - pos)
		pos = Instr(msg, Chr(31))
		j = j + 1
	Wend

	If msg <> ""
		While Len(msg) > 150
			For i = 150 To 1 Step -1
				pos = Instr(msg, " ", i)
				If pos < 150 Then Exit
			Next
			tmp = Left(msg, pos)
			If width < StringWidth(tmp) Then width = StringWidth(tmp)
			msg = Right(msg, Len(msg) - pos)
			j = j + 1
		Wend
		If msg <> ""
			If width < StringWidth(msg) Then width = StringWidth(msg)
		EndIf
	EndIf

	If width < StringWidth(title) Then width = StringWidth(title)
	If width > GraphicsWidth() * .78  Then width = GraphicsWidth() * .78
	height = j * StringHeight(tmp) * 1.5 + 65

	gui_makewindow(1000, width + 16, height, 0, 1)
	gui_makegadget(1000, 1001, 2, 2, width + 13, 18, 7, 7, title, 1)
		gui_settypes(1001, 7, 0, 0)

	If typ = 0
		gui_makegadget(1000, 1003, width/2 - 35, height - 30, 82, 20, 1, 1, "Ok", 0)
			gui_settypes(1003, 1, 0, 0)
	ElseIf typ = 1
		gui_makegadget(1000, 1003, width/2 - 80, height - 30, 82, 20, 1, 1, "Ok", 0)
			gui_settypes(1003, 1, 0, 0)
		gui_makegadget(1000, 1004, width/2 + 15, height - 30, 82, 20, 1, 1, "Cancel", 0)
			gui_settypes(1004, 1, 0, 0)
	Else
		gui_makegadget(1000, 1003, width/2 - 130, height - 30, 82, 20, 1, 1, "Yes", 0)
			gui_settypes(1003, 1, 0, 0)
		gui_makegadget(1000, 1005, width/2 - 33, height - 30, 82, 20, 1, 1, "No", 0)
			gui_settypes(1005, 1, 0, 0)
		gui_makegadget(1000, 1004, width/2 + 65, height - 30, 82, 20, 1, 1, "Cancel", 0)
			gui_settypes(1004, 1, 0, 0)
	EndIf

	;actual subdiv
	msg = originalmsg
	j = 1
	pos = Instr(msg, Chr(31))
	While pos
		While pos > 150
			For i = 150 To 1 Step -1
				pos = Instr(msg, " ", i)
				If pos < 150 Then Exit
			Next
			tmp = Left(msg, pos)
			gui_makegadget(1000, 1010 + j, 4, 10 + j * 15, width + 10, 15, 7, 8, tmp, 1)
			msg = Right(msg, Len(msg) - pos)
			pos = Instr(msg, Chr(31))
			j = j + 1
		Wend

		tmp = Left(msg, pos - 1)
		gui_makegadget(1000, 1010 + j, 4, 10 + j * 15, width + 10, 15, 7, 8, tmp, 1)
		msg = Right(msg, Len(msg) - pos)
		pos = Instr(msg, Chr(31))
		j = j + 1
	Wend

	If msg <> ""
		While Len(msg) > 150
			For i = 150 To 1 Step -1
				pos = Instr(msg, " ", i)
				If pos < 150 Then Exit
			Next
			tmp = Left(msg, pos)
			gui_makegadget(1000, 1010 + j, 4, 10 + j * 15, width + 10, 15, 7, 8, tmp, 1)
			msg = Right(msg, Len(msg) - pos)
			j = j + 1
		Wend
		If msg <> ""
			gui_makegadget(1000, 1010 + j, 4, 10 + j * 15, width + 10, 15, 7, 8, msg, 1)
		EndIf
	EndIf

	gui_drawwindow(1000, GraphicsWidth()/2 - width/2, GraphicsHeight()/2 - height/2)
	
	Repeat
		Cls
		gadsel = gui_update(1000)
		Flip

		If gadsel=1003 Or gadsel=1004 Or gadsel=1005 Or KeyHit(28) Or KeyHit(1)
			FlushKeys
			FlushMouse
			waitformouse
			gui_freewindow(1000)

			If gadsel = 1003 Or KeyDown(28)		;ok-yes-ENTER
				Return 1
			ElseIf gadsel = 1004 Or KeyDown(1)	;cancel-ESC
				Return 0
			ElseIf gadsel = 1005				;no
				Return 2
			EndIf
		EndIf
	Forever
End Function

Function SaveForm(fn$)
	If fn <> "tempfile" Then frmfile = fn
	file = WriteFile(dir_open + fn)
		WriteLine(file, "cyclic_ids=" + cyclic_ids)
		WriteLine(file, "ctrlpos=" + ctrlpos)
		WriteLine(file, "form=" + form)
		WriteLine(file, "w_x=" + gui_getwinx(form))
		WriteLine(file, "w_y=" + gui_getwiny(form))
		WriteLine(file, "w_width=" + gui_getwinw(form))
		WriteLine(file, "w_height=" + gui_getwinh(form))
		WriteLine(file, "w_type=" + GetWinType(form))
		WriteLine(file, "w_img=" + formimg)
		WriteLine(file, "w_text=" + GetWinText(form))
		WriteLine(file, "w_align=" + GetAlign(form))

		For g.gad = Each gad
			WriteLine(file, "gadget=" + g\id)
			WriteLine(file, "noclick=" + g\noclick)
			WriteLine(file, "rightclick=" + g\rightclick)
			WriteLine(file, "inputgadget=" + g\inputgadget)
			WriteLine(file, "slider_in=" + g\slider_in)
			WriteLine(file, "vertical=" + g\vertical)
			WriteLine(file, "x=" + gui_getx(g\id))
			WriteLine(file, "y=" + gui_gety(g\id))
			WriteLine(file, "width=" + gui_getw(g\id))
			WriteLine(file, "height=" + gui_geth(g\id))
			WriteLine(file, "mode=" + gui_getmode(g\id))
			WriteLine(file, "nt=" + gui_gettype(g\id))
			WriteLine(file, "ot=" + GetOverType(g\id))
			WriteLine(file, "dt=" + GetDownType(g\id))
			WriteLine(file, "text=" + gui_gettext(g\id))
			WriteLine(file, "align=" + GetAlign(g\id))
			WriteLine(file, "ni=" + g\ni)
			WriteLine(file, "oi=" + g\oi)
			WriteLine(file, "di=" + g\di)
			WriteLine(file, "os=" + g\os)
			WriteLine(file, "ds=" + g\ds)
		Next
	CloseFile(file)

	AppTitle frmfile + " - VisualB"
	gui_settext(57, frmfile, 1)
	gui_redrawwindow(1)
End Function

Function SaveINI()
	file = WriteFile(dir_app + "visualb.ini")
		WriteLine(file, "dir_app=" + dir_app)
		WriteLine(file, "dir_open=" + dir_open)
		WriteLine(file, "dir_img=" + dir_img)
		WriteLine(file, "dir_snd=" + dir_snd)
		WriteLine(file, "exp_fulapp=" + exp_fulapp)
		WriteLine(file, "exp_modal=" + exp_modal)
		WriteLine(file, "exp_gadselect=" + exp_gadselect)
		WriteLine(file, "fatmark=" + fatmark)

		If frmfile = "unnamed"
			WriteLine(file, "lastform=")
		Else
			WriteLine(file, "lastform=" + frmfile)
		EndIf
	CloseFile(file)
End Function

Function SetFormID(nf)
;1000 used for MsgBox, 1-99 for CtrlWin
	If nf = 1000 Or nf = 1001 Or nf < 100
		MsgBox(nf + " can't be used as new form ID. Values < 100, and 1000/1001 are reserved. Going back to " + form, 0, "Change form ID...")
		nf = form
	EndIf
	act = 0

	For g.gad = Each gad
		oldid = g\id			;save old ID
		g\id = g\id - form		;remove form-offset
		g\id = g\id + nf		;add new form-offset

			;check out if container/slider
			If g\slider_in <> 0
				g2.gad = GetGad(g\slider_in)
				g2\container_for = g\id
			EndIf
			
			If g\container_for <> 0
				g2.gad = GetGad(g\container_for)
				g2\slider_in = g\id
			EndIf
	
		SwapIDs(oldid, g\id)
	Next

	For a.gui_gadget = Each gui_gadget
		If a\windownum = form
			a\windownum = nf
		EndIf
	Next

	form = nf
	FillCtrl()
End Function

Function SetGadID()
	newid = Int(gui_gettext(31))
	If cyclic_ids
		For g.gad = Each gad
			If g\id > maxid Then maxid = g\id
		Next
		If newid > maxid
			FillCtrl()
			Return
		EndIf
	EndIf

	g.gad = GetGad(act)
	If newid = g\id Then Return

	If cyclic_ids
		If newid < g\id
			tmpid = GetFreeID(g\id)
			For i = g\id - 1 To newid Step -1
				tmpgad.gad = GetGad(i)
				tmpgad\id = tmpgad\id + 1
				
				If tmpgad\slider_in <> 0
					g2.gad = GetGad(tmpgad\slider_in)
					g2\container_for = tmpgad\id
				EndIf
				
				If tmpgad\container_for <> 0
					g2.gad = GetGad(tmpgad\container_for)
					g2\slider_in = tmpgad\id
				EndIf
				
				If i = g\id - 1
					SwapIDs(i, tmpid)
				Else
					SwapIDs(i, i + 1)
				EndIf
			Next
			oldid = g\id
			g\id = newid
			SwapIDs(oldid, newid)
			SwapIDs(tmpid, oldid)
			Insert g Before tmpgad
			act = newid
		ElseIf newid > g\id
			;old->temp
			tmpid = GetFreeID(g\id)
			oldid = g\id
			SwapIDs(oldid, tmpid)
			g\id = tmpid
			If g\slider_in
				g2.gad = GetGad(g\slider_in)
				g2\container_for = g\id
			EndIf
			If g\container_for
				g2.gad = GetGad(g\container_for)
				g2\slider_in = g\id
			EndIf
			
			;shift intermediate ids
			For i = oldid + 1 To newid
				tmpgad.gad = GetGad(i)
				tmpgad\id = tmpgad\id - 1

				If tmpgad\slider_in
					g2.gad = GetGad(tmpgad\slider_in)
					g2\container_for = tmpgad\id
				EndIf
				If tmpgad\container_for
					g2.gad = GetGad(tmpgad\container_for)
					g2\slider_in = tmpgad\id
				EndIf
				SwapIDs(i, i - 1)
			Next
			
			;temp->new
			SwapIDs(g\id, newid)
			g\id = newid
			If g\slider_in
				g2.gad = GetGad(g\slider_in)
				g2\container_for = newid
			EndIf
			If g\container_for
				g2.gad = GetGad(g\container_for)
				g2\slider_in = newid
			EndIf
			Insert g After tmpgad
			act = newid
		EndIf
	Else
		tmp = GetFreeID(newid)
		If tmp <> newid		;not free
			msgtext$ = ""
			For i = form + 1 To newid
				tmp = GetFreeID(i)
				If tmp = i
					msgtext = msgtext + " " + i
					count = count + 1
				EndIf
				If count > 5 Then Exit
			Next
			If count = 0 Then msgtext = GetFreeID(form + 1)
			MsgBox("The number you've chosen is already in use. Use instead one of these: " + msgtext, 0, "Selecting new Gadget ID...")
			gui_settext(31, g\id)		;undo all
		Else				;free
			If g\slider_in <> 0
				g2.gad = GetGad(g\slider_in)
				g2\container_for = tmp
			EndIf
			
			If g\container_for <> 0
				g2.gad = GetGad(g\container_for)
				g2\slider_in = tmp
			EndIf

			g\id = tmp
			SwapIDs(act, g\id)
			act = g\id
			FillCtrl()
		EndIf
	EndIf
End Function

Function SetWinText(name, t$="", j=0, tx=0, ty=0)
	For a.gui_gadget = Each gui_gadget
		If a\windownum = name And a\num = 0
			a\textstr = t$
			a\justify = j			
			a\text_x = tx
			a\text_y = ty
		EndIf
	Next
End Function

Function SortIDs()
	form = form + 100
	For g.gad = Each gad
		oldid = g\id

		g\id = GetFreeID(form)

		If g\slider_in <> 0
			g2.gad = GetGad(g\slider_in)
			g2\container_for = g\id
		EndIf

		If g\container_for <> 0
			g2.gad = GetGad(g\container_for)
			g2\slider_in = g\id
		EndIf
		
		SwapIDs(oldid, g\id)
	Next
	SetFormID(form - 100)

	;containers in front of sliders (drawing order)
	For g = Each gad
		If g\container_for <> 0
			g2.gad = GetGad(g\container_for)
			Insert g Before g2
		EndIf
	Next

	form = form + 100
	For g.gad = Each gad
		oldid = g\id

		g\id = GetFreeID(form)

		If g\slider_in <> 0
			g2.gad = GetGad(g\slider_in)
			g2\container_for = g\id
		EndIf

		If g\container_for <> 0
			g2.gad = GetGad(g\container_for)
			g2\slider_in = g\id
		EndIf
		
		SwapIDs(oldid, g\id)
	Next
	SetFormID(form - 100)
	
	saveform("tempfile")
	LoadForm("tempfile")
	DeleteFile(dir_open + "tempfile")
End Function

Function SwapIDs(oldname, newname)
	If oldname <> newname
		For a.gui_gadget = Each gui_gadget
			If a\num = oldname Then a\num = newname
		Next
	EndIf
End Function

Function UpdImages(g.gad)
	If MouseDown(3) Then Return
	Color 0, 0, 0
	Text 230, 10, "processing images..."
	Flip

	If g <> Null
		width = gui_getw(g\id)
		height = gui_geth(g\id)
		If g\nih <> 0
			FreeImage(g\nih)
			g\nih = 0
		EndIf
	
		If g\oih <> 0
			FreeImage(g\oih)
			g\oih = 0
		EndIf
	
		If g\dih <> 0
			FreeImage(g\dih)
			g\dih = 0
		EndIf
		
		If g\ni <> ""
			g\nih = LoadImage(g\ni)
			If g\nih <> 0
				g\nih = gui_givebutton(g\nih, width, height)
			Else
				g\ni = ""
			EndIf
		EndIf
	
		If g\oi <> ""
			g\oih = LoadImage(g\oi)
			If g\oih <> 0
				g\oih = gui_givebutton(g\oih, width, height)
			Else
				g\oi = ""
			EndIf
		EndIf
	
		If g\di <> ""
			g\dih = LoadImage(g\di)
			If g\dih <> 0
				g\dih = gui_givebutton(g\dih, width, height)
			Else
				g\di = ""
			EndIf
		EndIf
		gui_setimages(g\id, 0, 0, g\nih, g\oih, g\dih)
	Else
		width = gui_getwinw(form)
		height = gui_getwinh(form)
		If formih <> 0
			FreeImage(formih)
			formih = 0
		EndIf
		
		If formimg <> ""
			formih = LoadImage(formimg)
			If formih <> 0
				formih = gui_givebutton(formih, width, height)
			Else
				formimg = ""
			EndIf
		EndIf
		gui_setwindowimage(form, formih)
	EndIf
End Function

Function UpdSounds(g.gad)
	If g\osh <> 0
		FreeSound(g\osh)
		g\osh = 0
	EndIf

	If g\dsh <> 0
		FreeSound(g\dsh)
		g\dsh = 0
	EndIf
	
	If g\os <> ""
		g\osh = LoadSound(g\os)
		If g\osh = 0 Then g\os = ""
	EndIf
	
	If g\ds <> ""
		g\dsh = LoadSound(g\ds)
		If g\dsh = 0 Then g\ds = ""
	EndIf
	
	gui_setsounds(g\id, g\osh, g\dsh)
End Function

Comments

None.

Code Archives Forum