Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Basic GUI creator.


  • Please log in to reply
339 replies to this topic
maestrith
  • Members
  • 786 posts
  • Last active: Apr 10 2019 01:28 PM
  • Joined: 17 Sep 2005
0.001.26
Changed:
-Moved the Quick Options to the Settings window. (Actually makes them quick!)
-Changed the Right Click Menu (rcm) to make it a bit less confusing.
Added:
-Reorder GUI: Not too well documented but it should be pretty easy to figure out.


kArThIcK
  • Members
  • 142 posts
  • Last active: Aug 31 2017 03:40 AM
  • Joined: 13 May 2013

Can u please add the import script functionality.happy.png

 

or

 

u could make the code preview window editable so that the user can write some portions to modify the GUI.


This Is An Awesome Compilation Of Help Materials http://www.autohotkey.net/~faqbot/
;) :) B)

maestrith
  • Members
  • 786 posts
  • Last active: Apr 10 2019 01:28 PM
  • Joined: 17 Sep 2005
Sorry I have been away for so long, but my uncle is deciding to evict us from our home and I have been frantically trying to find a new place to live. Once I have a new place I will continue coding but for now I am going to have to put all of my projects on hold :( I am so sorry.

ozzii
  • Members
  • 167 posts
  • Last active: Oct 30 2015 04:54 PM
  • Joined: 23 Mar 2011

Don't be sorry, and good luck.



kiwichick
  • Members
  • 48 posts
  • Last active: Jul 25 2018 08:01 AM
  • Joined: 02 Jan 2014

Hi maestrith, Hope everything is going well with your relocation :-)

 

I just wanted to make a couple of suggestions for when you get back into your scripting again. I must confess that the only gui creators I've found for ahk (yours and SmartGuiXP which is no longer being developed) aren't as easy to use as they may be. I've actually been using the AutoIt Koda Designer for basic guis and then I convert the code to ahk. The reasons why are my suggestions for you :-)

 

1. The toolbar with buttons to add the controls.

2. Object Inspector and Object Tree View

3. Easy grab and drag to resize.

4. MOST importantly, the picture control can be added WITHOUT adding an actual picture so that (as in my case) pictures can be assigned to a variable because they change upon each execution of the script.

 

Hopefully this screenshot of Koda will give you an idea of what I'm talking about (if you aren't already familiar with it)

 

icgd.th.png



kArThIcK
  • Members
  • 142 posts
  • Last active: Aug 31 2017 03:40 AM
  • Joined: 13 May 2013

HI, maestrith. ;)

 

Can i know when the new version of the GUI Creator is going to come. :)


This Is An Awesome Compilation Of Help Materials http://www.autohotkey.net/~faqbot/
;) :) B)

maestrith
  • Members
  • 786 posts
  • Last active: Apr 10 2019 01:28 PM
  • Joined: 17 Sep 2005

HI, maestrith. ;)

 

Can i know when the new version of the GUI Creator is going to come. :)

I do not currently have an update planned for the near future.  I have been working on AHK Studio a lot lately and I honestly have not had any good ideas for this program in ages.  Any updates will be posted here but to be honest I need a bit of a break from programming.  If there is an error with the software let me know and I will do what I can to fix it. Sorry :(



kArThIcK
  • Members
  • 142 posts
  • Last active: Aug 31 2017 03:40 AM
  • Joined: 13 May 2013

Any updates will be posted here but to be honest I need a bit of a break from programming.

Ok, I understand... (Coding can Be A Horror Sometimes ;) )


This Is An Awesome Compilation Of Help Materials http://www.autohotkey.net/~faqbot/
;) :) B)

bruno
  • Members
  • 635 posts
  • Last active: Nov 04 2015 02:26 PM
  • Joined: 07 Mar 2011

which one is the feature-richest: GUI Creator or SmartGUI Creator or SmartGuiXP mod 4.3.29.7?



bruno
  • Members
  • 635 posts
  • Last active: Nov 04 2015 02:26 PM
  • Joined: 07 Mar 2011

this is the latest:

; http://ahkscript.org/boards/viewtopic.php?f=6&t=303

#SingleInstance,Force
DetectHiddenWindows,On
/*
if !A_IsCompiled{
	if (A_PtrSize=4){
		SplitPath,A_AhkPath,,apdir
		SplitPath,A_ScriptName,filename,dir
		run,%apdir%\AutoHotkeyU64.exe "%A_ScriptName%",%dir%
		ExitApp
	}
}
*/
if !FileExist("lib"){
	FileCreateDir,lib
	firstrun:=1
}
checkfiles()
v:=[],gui:=new xml("gui"),settings:=new xml("settings","lib\settings.xml")
controls:=new xml("controls","lib\controls.xml")
global settings,gui,v,controls
file:=settings.ssn("//last/@file").text
if !file
gui()
if settings.ssn("//last/@file").text
load_GUI(1)
WinSet,Redraw,,% hwnd([1])
mode_select(),snap()
if firstrun
help()
edit("GUI Settings")
return
t(x*){
	for a,b in x
	list.=b "`n"
	ToolTip,%list%
}
m(x*){
	for a,b in x
	list.=b "`n"
	MsgBox,% list
}
tt(x*){
	for a,b in x
	list.=b "`n"
	ToolTip,%list%,0,0,3
}
getpos(con){
	ControlGetPos,x,y,w,h,,ahk_id%con%
	x-=v.border,y-=v.border+v.caption
	return {x:x,y:y,w:w,h:h}
}
class xml{
	k:=[]
	__New(root,file=""){
		temp:=ComObjCreate("MSXML2.DOMDocument"),temp.setProperty("SelectionLanguage","XPath")
		this.xml:=temp
		If FileExist(file)
		temp.load(file),this.xml:=temp
		else
		this.xml:=this.CreateElement(temp,root)
		this.file:=file
		xml.k[root]:=this
	}
	CreateElement(doc,root){
		return doc.AppendChild(this.xml.CreateElement(root)).parentnode
	}
	unique(p,att,check){
		find:=IsObject(check)?"//" p "[text()='" att.text "']":"//" p "[@" check "='" att.att[check] "']"
		att["dup"]:=this.xml.SelectSingleNode(find)?0:1,current:=this.xml.SelectSingleNode(find)
		if att.dup
		return this.add(p,att)
		for a,b in att.att
		current.SetAttribute(a,b)
		if att.text
		current.text:=att.text
		return current
	}
	under(info){
		new:=info.under.appendchild(this.xml.createelement(info.node))
		for a,b in info.att
		new.SetAttribute(a,b)
		new.text:=info.text
		return new
	}
	remove(path){
		rem:=this.xml.SelectSingleNode(path),rem.ParentNode.RemoveChild(rem)
	}
	current(con){
		return this.ssn("//*[@hwnd='" con "']")
	}
	control(control){
		return this.ea("//*[@hwnd='" control "']")
	}
	__Get(x=""){
		return this.xml.xml
	}
	easy(node){
		x:=node.SelectNodes("@*"),ret:=[]
		while,xx:=x.item(A_Index-1)
		ret[xx.nodename]:=xx.text
		return ret
	}
	ea(path){
		nodes:=this.xml.SelectNodes(path "/@*"),obj:=[]
		while,n:=nodes.item(A_Index-1)
		obj[n.nodename]:=n.text
		return obj
	}
	sn(path){
		return this.xml.SelectNodes(path)
	}
	ssn(path){
		return this.xml.SelectSingleNode(path)
	}
	allsel(){
		selected:=this.sn("//selected/*")
		while,sel:=selected.item(A_Index-1)
		list.="@hwnd='" sel.text "' or "
		list:=SubStr(list,1,InStr(list,"or",0,0)-1)
		return list
	}
	save(x*){
		if x.1=1
		this.Transform()
		filename:=this.file?this.file:x.1.1
		file:=fileopen(filename,"rw","UTF-8")
		if (file.read()=this.xml.xml)
		return
		file.seek(0)
		file.write(this.xml.xml)
		file.length(file.position)
	}
	add(path,info=""){
		p:="/",dup:=this.ssn("//" path)?1:0
		next:=this.ssn("//" path)?this.ssn("//" path):this.ssn("//*")
		Loop,Parse,path,/
		last:=A_LoopField,p.="/" last,next:=this.ssn(p)?this.ssn(p):next.appendchild(this.xml.CreateElement(last))
		if (info.dup&&dup)
		next:=next.parentnode.appendchild(this.xml.CreateElement(last))
		for a,b in info.att
		next.SetAttribute(a,b)
		if info.text!=""
		next.text:=info.text
		return next
	}
	transform(){
		static
		if !IsObject(xsl){
			xsl:=ComObjCreate("MSXML2.DOMDocument")
			style=
			(
			<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
			<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
			<xsl:template match="@*|node()">
			<xsl:copy>
			<xsl:apply-templates select="@*|node()"/>
			<xsl:for-each select="@*">
			<xsl:text/>
			</xsl:for-each>
			</xsl:copy>
			</xsl:template>
			</xsl:stylesheet>
			)
			xsl.loadXML(style),style:=null
		}
		this.xml.transformNodeToObject(xsl,this.xml)
	}
}
sn(node,path){
	return node.SelectNodes(path)
}
ssn(node,path){
	return node.SelectSingleNode(path)
}
hwnd(number,wnd=""){
	static hwnd:=[]
	if number.remove{
		uu:=settings.unique("window/position",{att:{win:number.remove},text:winpos(number.remove).text},"win")
		Gui,% number.remove ":Destroy"
		return hwnd[number.remove]:=""
	}
	if IsObject(number)
	return hwnd[number.1].h
	if !wnd
	return hwnd[number].n
	hwnd[number]:={n:wnd,h:"ahk_id " wnd+0}
}
LButton(){
	LButton:
	MouseGetPos,x,y,win,con,2
	if !(win=hwnd(1))
	return
	gui.remove("//templist")
	Sleep,0 ;IMPORTANT!!!!!
	if (v.currentmode="interact"){
		if !con
		return edit("gui settings")
		Gui.remove("//selected"),Gui.Add("gui/selected/hwnd").text:=married(con)
		edit("controls"),v.last:=con
		return
	}
	if (con){
		GuiControl,2:Choose,SysTabControl321,1
		married(con)
		con:=married(con),v.last:=con
		Grid(x,y)
		changesel:=1
		con+=0
		selected:=gui.ssn("//selected/*[text()='" con "']")?gui.sn("//gui/selected/*[text()]"):gui.sn("//*[@hwnd='" con "']/@hwnd")
		if !(v.currentmode="Resize"||GetKeyState("Shift","P")){
			while,ss:=selected.item(A_Index-1).Text{
				des:=sn(gui.current(ss),"descendant-or-self::*[@hwnd]")
				while,dd:=des.item(A_Index-1){
					ea:=xml.easy(dd)
					if (v.currentmode="Move")
					Gui.unique("templist/control",{att:{x:ea.x-x,y:ea.y-y,control:ea.hwnd,type:ea.type}},"control")
				}
			}
		}
		if (v.currentmode="Resize"||GetKeyState("Shift","P"))
		while,ss:=selected.item(A_Index-1).Text{
			ea:=gui.ea("//*[@hwnd='" ss "']")
			uu:=Gui.unique("templist/control",{att:{w:ea.w,h:ea.h,control:ea.hwnd,type:ea.type}},"control")
		}
		templist:=gui.sn("//templist/*")
		while,GetKeyState("LButton","P"){
			MouseGetPos,xx,yy
			Grid(xx,yy)
			sleep,1
			if !(Abs(xx-x)>3||abs(yy-y)>3)
			continue
			changesel:=0
			killhighlight()
			if (v.currentmode="Resize"||GetKeyState("Shift","P"))
			resize(templist,x,y)
			if (v.currentmode="Move")
			move(templist,x,y)
		}
		;if things are in remove list just move them back to the main <window>
		;move the GroupBox last and have it check for inside stuff
		;no tabs!
		v.removelist:=[]
		if Abs(xx-x)>3||abs(yy-y)>3{
			templist:=gui.ssn("//templist")
			for a,b in [sn(templist,"*[@type!='GroupBox' and @type!='Tab' and @type!='Tab2']"),sn(templist,"*[@type='GroupBox' or @type='Tab' or @type='Tab2']")]
			while,qq:=b.item(A_Index-1)
			top(ssn(qq,"@control").text)
		}
		for a,b in v.removelist{
			current:=gui.current(b)
			des:=sn(current,"descendant::*")
			while,dd:=des.item(A_Index-1).SelectSingleNode("@hwnd").text{
				if WinExist("ahk_id" dd){
					move:=Gui.current(dd)
					place(move)
				}
			}
			current.ParentNode.RemoveChild(current)
		}
		v.removelist:=""
		if changesel{
			if !(GetKeyState("Shift","P")=1||GetKeyState("Control","P")=1)
			gui.remove("//gui/selected")
			current:=gui.ssn("//selected/hwnd[text()='" con "']")
			if current&&GetKeyState("Control","P")
			current.ParentNode.RemoveChild(current)
			else
			gui.unique("selected/hwnd",{text:con},["hwnd"])
		}
		sleep,0
		highlight()
		if (sn(gui.ssn("//selected"),"*").length&&con)
		edit()
	}
	else
	{
		list:=select(x,y)
		if !(GetKeyState("Shift","P")=1||GetKeyState("Control","P")=1)
		gui.remove("//gui/selected")
		selected:=gui.add("gui/selected")
		while,ll:=list.item(A_Index-1){
			current:=gui.ssn("//selected/hwnd[text()='" ll.text "']")
			if current&&GetKeyState("Control","P")
			current.ParentNode.RemoveChild(current)
			current:=!current?gui.add("selected/hwnd",{text:ll.text,dup:1}):""
			Gui.unique("templist/control",{att:{control:ll.text}},"control")
		}
		highlight()
		if sn(selected,"*").length{
			GuiControl,2:Choose,SysTabControl321,1
			edit()
		}
		if gui.sn("//selected/*").length
		edit("controls")
		else
		edit("gui settings")
	}
	return
	notactive:
	sleep,1
	MouseGetPos,,,win,con,2
	if (win=hwnd(1)){
		v.last:=con+0
		WinActivate,% hwnd([1])
		WinWaitActive,% hwnd([1])
		LButton()
	}
	return
}
place(move){
	while,move.ParentNode.nodename="control"
	move.ParentNode.ParentNode.AppendChild(move)
	if move.ParentNode.nodename="GroupBox"&&ssn(move,"@type").text!="GroupBox"
	win:=gui.ssn("//window"),win.AppendChild(move)
}
top(con){
	current:=gui.ssn("//*[@hwnd='" con "']"),att:=gui.ea("//*[@hwnd='" con "']")
	if InStr(att.type,"Tab")
	return
	if tab:=gui.ssn("//*[@x<'" att.x "' and @[email protected]>'" att.x "' and @y<'" att.y "' and @[email protected]>'" att.y "' and (@type='Tab2' or @type='Tab')]"){
		if !ssn(tab,"descendant::*[@hwnd='" con "']"){
			DllCall("DestroyWindow",uint,att.hwnd),att.tab:=""
			newcon:=add_control(att.type,att)
			current:=gui.current(newcon.hwnd)
			v.removelist.Insert(con)
			gui.add("selected/hwnd",{text:newcon.hwnd})
			v.last:=newcon.hwnd
		}
	}
	else if att.tab{
		DllCall("DestroyWindow",uint,att.hwnd)
		att.remove("tab")
		newcon:=add_control(att.type,att)
		current:=gui.current(newcon.hwnd)
		v.last:=newcon.hwnd
		gui.add("selected/hwnd",{text:newcon.hwnd})
		v.removelist.Insert(con)
	}
	else if (att.type="GroupBox"){
		current:=gui.current(att.hwnd)
		list:=gui.sn("//*[@x>" att.x " and @x<" att.x+att.w " and @y>" att.y " and @y<" att.y+att.h " and @tab='" att.tab "' and @hwnd!='" ea.hwnd "']")
		Loop,% list.length{
			ll:=list.item(A_Index-1)
			if !ssn(current,"descendant::ll")
			current.AppendChild(list.item(A_Index-1))
		}
	}
	if list:=gui.ssn("//*[@x<" att.x " and @[email protected]>" att.x " and @y<" att.y " and @[email protected]>" att.y " and @tab='" att.tab "' and @type='GroupBox']"){
		if !ssn(list,"descendant::*[@hwnd='" att.hwnd "']")
		list.AppendChild(gui.current(att.hwnd))
	}
	if ancestor:=ssn(current,"ancestor::*[@type='GroupBox']"){
		if !list:=gui.ssn("//*[@x<" att.x " and @[email protected]>" att.x " and @y<" att.y " and @[email protected]>" att.y " and @tab='" att.tab "' and @type='GroupBox']")
		place(Gui.current(att.hwnd))
	}
	return
}
gui(hide=""){
	Gui,1:Destroy
	Gui,+Resize -0x30000 +hwndhwnd
	OnMessage(0x231,"killhighlight")
	OnMessage(0x136,"display_grid"),OnMessage(0x232,"snap")
	SysGet,border,32
	SysGet,caption,4
	Gui,Margin,10,10
	Hotkey,IfWinActive,ahk_id%hwnd%
	Hotkey,*~LButton,LButton,On
	Hotkey,!~LButton,interact,On
	Hotkey,IfWinNotActive,ahk_id%hwnd%
	Hotkey,*~LButton,notactive,On
	v.border:=border,v.caption:=caption
	hwnd(1,hwnd)
	hide:=hide?"Hide":""
	Gui,Show,% size(1,"w500 h500 Center") " " hide,GUI Creator : Right Click For The Menu
	gui_hotkey()
	return
	GuiEscape:
	GuiClose:
	MsgBox,259,GUI Creator,Save your current GUI?
	IfMsgBox,Yes
	save_gui()
	IfMsgBox,Cancel
	return
	if hwnd(2)
	hwnd({remove:2})
	hwnd({remove:1})
	settings.save(1)
	ExitApp
	return
}
interact:
return
new_gui(x=""){
	gui(x),gui:=new xml("gui"),snap()
}
gui_hotkey(){
	static personal:=[{hotkey:{label:"modesel",main:"LButton Mode Change"},keys:[["Next Mode","+up"],["Previous Mode","+down"]]}
	,{hotkey:{label:"adjust",main:"Adjust Selected Controls Position"},keys:[["Up","Up"],["Down","Down"],["Left","Left"],["Right","Right"]]}
	,{hotkey:{label:"allkeys",main:"Hotkeys"},keys:[["Copy GUI to Clipboard","^E"],["Export GUI","!E"]
	,["Show Code","S"],["Reorder GUI","!R"],["Test GUI","^T"],["Edit Labels","F1"]]}]
	v.personal:=personal
	for a,b in personal{
		if !main:=settings.ssn("//actions/hotkey[@label='" b.hotkey.label "']")
		main:=settings.add("actions/hotkey",{att:{label:b.hotkey.label,main:b.hotkey.main},dup:1})
		for c,d in b.keys{
			if !ssn(main,"//actions/hotkey/key[@desc='" d.1 "']")
			settings.under({under:main,node:"key",att:{desc:d.1,value:d.2}})
		}
	}
	list:=settings.sn("//hotkeys/*")
	Hotkey,IfWinActive,% hwnd([1])
	while,ll:=list.item(A_Index-1)
	if ll.text
	hotkey,% ll.text,addcontrol,On
	for a,b in personal{
		for c,d in b.keys{
			key:=settings.ssn("//hotkey[@label='" b.hotkey.label "']/key[@desc='" d.1 "']/@value").text
			key:=key?key:d.2
			Hotkey,%key%,% b.hotkey.label,On
		}
	}
	Hotkey,^a,selectall,On
	Hotkey,Delete,delete,On
	return
	addcontrol:
	MouseGetPos,x,y,win
	if (win!=hwnd(1))
	return m("Please have your mouse over the GUI Creator window")
	x-=v.Border,y-=v.Border+v.Caption
	grid(x,y)
	cl:=settings.ssn("//hotkeys/*[text()='" A_ThisHotkey "']").nodename
	if (cl="Picture"){
		FileSelectFile,picture,,,Select an image.,*.gif;*.jpg;*.png
		if ErrorLevel||picture=""
		return
	}
	value:=picture?picture:cl
	add_control(cl,{x:x,y:y,value:value,type:cl})
	return
	allkeys:
	ea:=clean(casessn(settings.xml,"value",A_ThisHotkey,"@desc").text)
	if IsFunc(ea)
	%ea%()
	return
}
casessn(node,attribute,find,att=""){
	StringLower,find,find
	att:=att?"/" att:""
	return ssn(node,"//*[translate(@" attribute ",'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='" find "']" att)
}
add_control(type,att){
	static tt:={Button:"Button",Checkbox:"Checkbox",ComboBox:"ComboBox",DateTime:"DateTime",DropDownList:"DropDownList",Edit:"Edit",GroupBox:"GroupBox",Hotkey:"Hotkey",Listbox:"Listbox",ListView:"ListView",MonthCal:"MonthCal",Picture:"Picture",Progress:"Progress",Radio:"Radio",Slider:"Slider",Tab:"Tab",Tab2:"Tab2",Text:"Text",Treeview:"Treeview",UpDown:"UpDown"}
	static controllist:=[]
	position:=""
	if (type="DateTime")
	att.value:="LongDate"
	if !att.tab
	att.tab:="" ;required
	att.type:=tt[att.type]
	if RegExMatch(att.type,"(ComboBox|DDL|DropDownList)")
	att.h:=500
	if InStr(att.options,"Password")
	att.remove("h"),att.options:=RegExReplace(att.options,"i)Multi")
	list:=att.r?"x,y,w":"x,y,w,h"
	for a,b in att
	if a in %list%
	if b
	position.=a b " "
	if att.r
	position.=" r" att.r " "
	options.=type="ListView"?" -Multi":""
	type:=type="Tab"?"Tab2":type
	if !InStr(type,"tab")
	tab:=whichtab(att)
	if tab.tab
	att.tab:=tab.tab
	options.=" " att.options
	if att.Background
	options.=" Background" att.Background
	value:=RegExReplace(att.value,"(``r|``n)","`n")
	value:=value?value:att.value
	Gui,1:Font,% compilefont(att),% att.font
	border:=settings.ssn("//options/Borders").text?"Border":""
	Gui,1:Add,%type%,%position% hwndhwnd %options% %border%,% value
	if type=TreeView
	root:=TV_Add("Treeview",0,"Expand"),TV_Add("This will not be in your compiled version",root)
	Gui,1:Font
	Gui,1:Tab
	att.type:=tt[att.type]
	married()
	for a,b in getpos(hwnd)
	att[a]:=b
	if RegExMatch(att.type,"(ComboBox|DDL|DropDownList)")
	att.remove("h")
	att["hwnd"]:=hwnd+0,att["type"]:=att.type
	if tab.ctrl{
		SplashTextOff
		root:=gui.ssn("//*[@hwnd='" tab.hwnd "']")
		if !current:=ssn(root,"tab[@tab='" tab.tab "']")
		current:=gui.under({under:root,node:"tab",att:{tab:tab.tab},dup:1})
		if before:=ssn(root,"tab[@tab='" tab.tab+1 "']")
		current:=root.insertbefore(current,before)
		current:=gui.under({under:current,node:"control",att:att})
	}
	else
	current:=Gui.add("window/control",{att:att,dup:1})
	if GroupBox:=gui.ssn("//*[@x<'" att.x "' and @[email protected]>'" att.x "' and @y<'" att.y "' and @[email protected]>'" att.y "' and @hwnd!='" ea.hwnd "'  and @type='GroupBox']"){
		if ssn(GroupBox,"@tab").text=att.tab&&current
		GroupBox.AppendChild(current)
	}
	if (att.type="GroupBox"){
		list:=gui.sn("//*[@x>" att.x " and @x<" att.x+att.w " and @y>" att.y " and @y<" att.y+att.h " and @tab='" att.tab "']/@hwnd")
		Loop,% list.length
		gui.current(att.hwnd).AppendChild(gui.current(list.item(A_Index-1).text))
	}
	if (att.type="ListView"){
		Loop,2
		LV_Add("","Test Item" A_Index)
	}
	if InStr(att.type,"Tab")
	Gui.Add("tablist/tab",{text:att.hwnd,att:{num:gui.sn("//tablist/*").length+1},dup:1})
	lastcl:=cl
	return att
}
grid(ByRef x,ByRef y,adjust=""){
	if adjust
	x-=v.Border,y-=v.border+v.caption
	if settings.ssn("//options/Snap_To_Grid").text
	x:=Round(x,-1),y:=Round(y,-1)
}
married(byref info=""){
	static married:=[],list
	if info
	return info:=married[info]?married[info]+0:info+0
	WinGet,cl,ControlListHWND,% hwnd([1])
	out:=RegExReplace(cl,(RegExReplace(list,"\n","|")))
	if RegExMatch(out,"O)(\w+)\s+(\w+)",found)
	married[found.2+0]:=found.1+0
	list:=cl
}
;check the ideas
debug(info=""){
	if v.loading
	return
	info:=info?info:gui
	if (WinExist(hwnd([98]))!=0&&hwnd(98)=""){
		Gui,98:+hwndhwnd
		hwnd(98,hwnd)
		Gui,98:Add,Edit,w800 h500 -Wrap
		Gui,98:Show,x0 y0,Debug
		WinActivate,% hwnd([1])
	}
	info.Transform()
	ll:=info.sn("//@hwnd")
	GuiControl,98:,Edit1,% info[] "`n`ncount: " ll.length
	Gui,1:Default
	return
	98GuiEscape:
	98GuiClose:
	hwnd({remove:98})
	return
}
winpos(win){
	VarSetCapacity(size,A_PtrSize*4,0),DllCall("user32\GetClientRect","uint",hwnd(win),"uint",&size),w:=NumGet(size,8),h:=NumGet(size,12)
	WinGetPos,x,y,,,% hwnd([win])
	if x&&y&&w&&h
	return {text:"x" x " y" y " w" w&0xffff " h" h,obj:{x:x,y:y,w:w&0xffff,h:h}}
}
select(xx,yy){
	Random,color,0xaaaaaa,0xeeeeee
	gui,59:-caption +alwaysontop +E0x20 +hwndselect +Owner1
	WinGetPos,wx,wy,ww,wh,% hwnd([1])
	gui,59:show,% "x" wx " y" wy " w" ww " h" wh  " noactivate hide"
	gui,59:color,%color%
	gui,59:show,NoActivate
	WinSet,Transparent,20,ahk_id %select%
	while,GetKeyState("LButton","P"){
		mousegetpos,x,y
		winset,region,%xx%-%yy% %x%-%yy% %x%-%y% %xx%-%y% %xx%-%yy%,ahk_id %select%
	}
	Gui,59:Destroy
	xsub:=v.border,ysub:=v.Border+v.Caption,inside:=[]
	for a,b in {x:x-xsub,xx:xx-xsub,y:y-ysub,yy:yy-ysub}{
		inside[InStr(a,"x")?"x":"y",b]:=1
	}
	return inside(inside)
}
inside(control){
	/*
		if !IsObject(control){
			cc:=control+0,ea:=gui.control(cc),control:=[]
			if !RegExMatch(ea.type,"(GroupBox|Tab|Tab2)")
			return
			control["x",ea.x]:=1,control["x",ea.x+ea.w]:=1
			control["y",ea.y]:=1,control["y",ea.y+ea.h]:=1
		}
		if ea.type="GroupBox"
		list:=gui.sn("//*[@x>" control.x.MinIndex() " and @x<" control.x.MaxIndex() " and @y>" control.y.MinIndex() " and @y<" control.y.MaxIndex() "  and @tab='" ea.tab "']/@hwnd")
		else
		m(control.x.minindex(),control.x.MaxIndex(),control.y.MinIndex(),control.y.MaxIndex())
	*/
	list:=gui.xml.SelectNodes("//*[@x>'" control.x.MinIndex() "' and @x<'" control.x.MaxIndex() "' and @y>'" control.y.MinIndex() "' and @y<'" control.y.MaxIndex() "']/@hwnd")
	return list
}
highlight(){
	if (v.currentmode="interact")
	return killhighlight()
	WinGetPos,x,y,w,h,% hwnd([1])
	Gui,98:Destroy
	Gui,98:+LastFound +Owner1 +E0x20 -Caption +hwndsh +ToolWindow 
	hwnd(98,sh)
	WinSet,TransColor,0xF0F0F0 100
	Gui,98:Color,0xF0F0F0,0xFF
	for a,b in Pos
	p.=a b " "
	Gui,98:Default
	x+=v.Border,y+=v.Border+v.Caption,w-=(v.border*2),h-=(v.Border*2)+v.Caption
	ll:=gui.sn("//selected/hwnd")
	plain:=[],group:=[],tab:=[]
	while,l:=ll.item(A_Index-1){
		ea1:=xml.easy(gui.ssn("//*[@hwnd='" married(l.text) "']"))
		ea:=getpos(married(l.text))
		if !(ea.x&&ea.y&&ea.w&&ea.h)
		continue
		info:="c" color " x" ea.x " y" ea.y " w" ea.w " h" ea.h
		if InStr(ea.type,"Tab")
		tab[ea1.hwnd]:=info
		else if InStr(ea1.type,"GroupBox")
		group[ea1.hwnd]:=info
		else
		plain[ea1.hwnd]:=info
	}
	for a,b in plain
	Gui,Add,Progress,%b%,100
	for a,b in group
	Gui,Add,Progress,%b%,100
	for a,b in tab
	Gui,Add,Progress,%b%,100
	Gui,98:Show,x%x% y%y% w%w% h%h% NoActivate
	if hwnd(2)
	WinSet,Top,,% hwnd([2])
	if hwnd(3)
	WinSet,Top,,% hwnd([3])
}
killhighlight(a*){
	if a.1!=""
	ToolTip,,,,3
	Gui,98:Destroy
	if hwnd(44)
	hwnd({remove:44})
}
load_gui(file=""){
	v.loading:=1
	if (file=1)
	file:=settings.ssn("//last/@file").text
	if (file=""||file=1){
		FileSelectFile,file,,,Select the GUI file to load,*.xml
		if ErrorLevel||FileExist(file)=""
		return
	}
	if !FileExist(file)
	return m("can't find the file"),gui()
	SplashTextOn,200,50,Loading File,Please wait...
	settings.add("last",{att:{file:file}})
	gui(1),gui:=new xml("gui")
	Gui,1:Default
	temp:=new xml("temp")
	temp.xml.load(file),tabcount:=0
	ctrl:=temp.sn("//@hwnd/..")
	while,ct:=ctrl.item(A_Index-1){
		ea:=xml.easy(ct)
		if ea.tabnum&&!ea.tab	;<---This is for
		ea.tab:=ea.tabnum		;<---backward compatibility.
		add_control(ea.type,ea)
	}
	splitpath,file,filename,dir
	filename:=temp.ssn("//file/filename").text
	dir:=temp.ssn("//file/dir").text
	gui.add("file/filename").text:=filename
	Gui.add("file/dir").text:=dir
	ea:=temp.ea("//show")
	ea.options:=RegExReplace(ea.options,"i)(Hide|Minimize|NA|NoActivate)")
	ss:=temp.ssn("//show")
	if ss
	gui.ssn("*").AppendChild(ss)
	for a,b in ea
	if a in x,y,w,h
	if b
	position.=a b " "
	SplashTextOff
	Gui,Show,% position " " ea.options
	v.loading:=0
	WinSetTitle,GUI Creator,,GUI Creator : %filename%
	if temp.ssn("//labels")
	gui.ssn("//*").AppendChild(temp.ssn("//labels"))
	snap(1)
}
save_gui(filename=""){
	option:=settings.ssn("//options/Warn_Overwrite").text?"S16":""
	if !filename{
		file:=gui.ssn("//file/filename").text,dir:=gui.ssn("//file/dir").text
		if file&&dir
		if FileExist(dir "\" file)
		filename:=dir "\" file
	}
	if !filename
	FileSelectFile,filename,%option%,,Save Current GUI,*.xml
	if ErrorLevel||filename=""
	return
	filename:=InStr(filename,".xml")?filename:filename ".xml"
	SplitPath,filename,filename,dir
	gui.add("file/filename").text:=filename
	Gui.add("file/dir").text:=dir
	Gui.Transform()
	gui.save([dir "\" filename])
	settings.add("last",{att:{file:dir "\" filename}})
}
snap(a*){
	WinGetPos,,,w,h,% hwnd([1])
	Grid(w,h)
	w-=4,h-=1
	WinMove,% hwnd([1]),,,,% w,% h
	highlight()
	gui.add("show",{att:winpos(1).obj,text:winpos(1).text})
	if hwnd(2)
	edit("gui settings")
	if hwnd(3)
	WinSet,Top,,% hwnd([3])
}
display_grid(x=""){
	Static wBrush
	if x=removebrush
	wbrush:=""
	if A_Gui!=1
	return
	if settings.ssn("//options/Grid").text
	tile:="tile.bmp"
	else
	return
	If !wBrush
	hBM:=DllCall("LoadImage",Int,0,Str,"tile.bmp",Int,0,Int,0,Int,0,UInt,0x2010,"cdecl"),wBrush:=DllCall("CreatePatternBrush",UInt,hBM,"cdecl")
	Return wBrush
}
size(win,default=""){
	pos:=settings.ssn("//window/position[@win='" win "']").text
	pos:=pos?pos:default
	return pos
}
whichtab(att){
	if !tab:=gui.ssn("//*[@x<'" att.x "' and @[email protected]>'" att.x "' and @y<'" att.y "' and @[email protected]>'" att.y "' and @type='Tab2']/@hwnd").text
	tab:=gui.ssn("//*[@x<'" att.x "' and @[email protected]>'" att.x "' and @y<'" att.y "' and @[email protected]>'" att.y "' and @type='Tab']/@hwnd").text
	if !tab return
	sleep,1
	hwnd:=tab
	ControlGet,tabnum,tab,,,ahk_id%tab%
	tt:=Gui.sn("//*[contains(@type,'Tab')]")
	ctrl:=gui.ssn("//tablist/tab[text()='" tab "']/@num").text
	if att.tab
	tabnum:=att.tab
	if tabnum&&ctrl{
		tab:=[]
		Gui,1:Tab,%tabnum%,%ctrl%
		tab.tab:=tabnum,tab.ctrl:=ctrl,tab.hwnd:=hwnd
		return tab
	}
}
edit(switch=""){
	tabswitch:
	if WinExist(hwnd([2]))=0&&hwnd(2)
	hwnd({remove:2})
	if (hwnd(2)=""){
		static tab
		Gui,2:Default
		Menu,Edit,Add,Help,editmenu
		Gui,2:Menu,Edit
		Gui,+Owner1
		Gui,-0x30000 +hwndhwnd
		Gui,Add,Tab,Buttons w300 h100 hwndtab gtabswitch vtab,Controls|GUI Settings|Settings
		v.tab:=tab
		Gui,Tab
		Gui,Add,StatusBar,,foo
		hwnd(2,hwnd),VarSetCapacity(rect,A_PtrSize*4)
		SendMessage,(0x1300|10),1,&rect,,ahk_id%tab% ;TCM_GETITEMRECT
		height:=NumGet(rect,12)
		SysGet,h,55
		height+=h-3
		ControlMove,SysTabControl321,,,,% height-h+3,% hwnd([2])
		Gui,Add,TreeView,w300 h600 xm y%height% AltSubmit geditsort Section hwndhwnd Checked
		Gui,Show,% size(2,"x5") " AutoSize NA",Edit Control
		mode_select()
	}
	Gui,2:Submit,Nohide
	tab:=switch?switch:tab
	GuiControl,2:ChooseString,SysTabControl321,%Tab%
	Gui,2:Default
	GuiControl,2:-Redraw,SysTreeView321
	TV_Delete()
	v.editvalue:=[],v.tvrem:=[]
	if (tab="settings"){
		roots:=[]
		con:=controls.sn("//controls/*")
		root:=TV_Add("Hotkeys",0,"Expand")
		v.tvrem[root]:=1
		while,cc:=con.item(a_index-1)
		child:=TV_Add(cc.nodename " : " settings.ssn("//hotkeys/" cc.nodename).text,root),v.editvalue[child]:={desc:cc.nodename,control:cc.nodename,hotkey:1},v.tvrem[child]:=1
		for a,b in v.personal{
			root:=TV_Add(b.hotkey.main,0,"Expand")
			v.tvrem[root]:=1
			for c,d in b.keys{
				key:=settings.ssn("//hotkey[@label='" b.hotkey.label "']/key[@desc='" d.1 "']/@value").text
				key:=key?key:d.2
				child:=TV_Add(d.1 " : " key,root),v.editvalue[child]:={value:key,desc:d.1,gui:1,parent:"settings",root:cc.nodename}
				v.tvrem[child]:=1
			}
		}
		root:=TV_Add("Quick Options",0,"Expand"),v.quick:=root
		for a,b in ["Snap To Grid","Grid","Borders","Warn Overwrite"]
		child:=TV_Add(b,root,settings.ssn("//options/" clean(b)).text?"Check":""),v.editvalue[child]:={quick_options:1,value:b}
		v.tvrem[root]:=1
		GuiControl,2:+Redraw,SysTreeView321
		hidecheck()
		return
	}
	if (tab="GUI Settings"){
		info:=controls.sn("//window/*"),stop:=[]
		style:=TV_Add("GUI",0,"Expand"),oo:=TV_Add("Options",0,"Expand")
		constants:=TV_Add("Constants",0,"Expand")
		for a,b in [style,constants,oo]
		v.tvrem[b]:=1
		qa:=gui.ea("//show")
		while,in:=info.item(A_Index-1){
			ea:=xml.easy(in),options:=qa[in.nodename],options:=RegExReplace(options," ",","),value:=ea.value
			if value in %options%
			{
				check=Check
				if value in center,xcenter,ycenter
				stop[value]:=1
			}
			else
			check=
			if (in.nodename="gui")
			child:=TV_Add(ea.value " : " ea.desc,style,Check),v.editvalue[child]:={value:ea.value,desc:ea.desc,gui:2,parent:"gui"}
			if in.nodename="options"
			child:=TV_Add(ea.value " : " ea.desc,oo,Check),v.editvalue[child]:={value:ea.value,desc:ea.desc,gui:2,parent:"options"}
			if (in.nodename="constants"){
				if (ea.value="x"||ea.value="y")&&(stop[ea.value "center"]||stop.center)
				continue
				child:=TV_Add(ea.desc " : " qa[ea.value],constants,Check),v.editvalue[child]:={value:ea.value,desc:ea.desc,gui:2,parent:"constants",start:qa[ea.value]}
				v.tvrem[child]:=1
			}
		}
		GuiControl,2:+Redraw,SysTreeView321
		hidecheck()
		return
	}
	; all of these are to use the v.editvalue[child]:={value:ea.value,desc:ea.desc} structure
	; ^----type:=type of control
	if (tab="Controls"){
		selected:=gui.sn("//selected/*"),typecount:=0,types:=[],expand:=selected.length>1?"":" Expand"
		search:=selected.length>1?"//multi/Constants/*":"//constants/Constants/*"
		while,sel:=selected.item(A_Index-1){
			ea:=xml.easy(gui.current(sel.text)),options:=RegExReplace(ea.options," ","|")
			if !ea.Type
			continue
			if types[ea.type]
			continue
			root:=TV_Add(ea.type,0,"Sort" expand),style:=TV_Add("Style",root,"expand"),constants:=TV_Add("Constants",root,"expand"),v.tvrem[root]:=1
			v.tvrem[style]:=1,v.tvrem[constants]:=1
			info:=controls.sn("//" ea.type "/*|" search)
			while,in:=info.item(A_Index-1){
				ee:=xml.easy(in),check:=""
				if (in.nodename="style"&&options)
				check:=RegExMatch(ee.value,"(" options ")\b")?"Check":""
				if (in.nodename="style")
				child:=TV_Add(ee.value " : " ee.desc,style,check),v.editvalue[child]:={value:ee.value,desc:ee.desc,type:ea.type,parent:"style"}
				if (in.nodename="constants")
				child:=TV_Add(selected.length=1?ee.desc " : " ea[ee.value]:ee.desc,constants),v.editvalue[child]:={value:ee.value,desc:ee.desc,type:ea.type,parent:"constants"},v.tvrem[child]:=1
			}
			types[ea.type]:=1
		}
		if !(Expand){
			root:=TV_Add("All Selected",0,"Expand")
			for a,b in {Font:"font",Color:"color"}
			child:=TV_Add(a,root),v.editvalue[child]:={value:b,desc:b,type:"All",parent:"All Selected"},v.tvrem[child]:=1
			v.tvrem[root]:=1
		}
		hidecheck()
	}
	GuiControl,2:+Redraw,SysTreeView321
	return
	editsort:
	if !A_EventInfo
	return
	if !v.editvalue[A_EventInfo]
	return
	ev:=v.editvalue[A_EventInfo],v.lastev:=ev
	if (ev.quick_options){
		option:=settings.add("options/" clean(ev.value))
		option.text:=check:=TV_Get(A_EventInfo,"Check")?1:0
		if (ev.value="Borders"){
			reload(),Edit("Settings")
			ControlSend,SysTreeView321,^{End},% hwnd([2])
			WinActivate,% hwnd([2])
		}
			TV_Modify(v.quick,"Select Vis Focus")
		if (ev.value="warn overwrite")
		return
		refresh:
		WinSet,Redraw,,% hwnd([1])
		return
	}
	if (ev.parent="settings"){
		smalledit(ev.desc,ev.value)
		return
	}
	if (ev.hotkey){
		ea:=[],ea[ev.desc]:=settings.ssn("//hotkeys/" ev.desc).text
		smalledit(ev.desc,ea)
		return
	}
	if (ev.desc="grid color"||ev.desc="dot color"){
		type:=ev.desc="grid color"?"grid":"dot"
		ea:=settings.ea("//settings/grid")
		color:=RGB(dlg_color(RGB(ea[type])))
		settings.add("grid").SetAttribute(type,color)
		makeblock()
		return
	}
	if (ev.gui){
		return guiedit(ev)
	}
	if (ev.gui){
		current:=gui.ssn("//show"),options:=ssn(current,"@options").text,new:=""
		if (ev.parent="styles"){
			check:=TV_Get(A_EventInfo,"Check")?ev.value:""
			if Check
			options.=" " check
			if (Check=""){
				Loop,Parse,options,%A_Space%,%A_Space%
				if (A_LoopField!=ev.value)
				new.=A_LoopField " "
			}
			options:=new?new:options
			current.SetAttribute("options",Trim(options))
			options:=RegExReplace(options,"i)(Hide|Minimize)")
			Gui,1:Show,%options%
			mode_select()
		}
		if (ev.parent="constants")
		smalledit(ev.value,gui.ea("//show"))
		return
	}
	if (ev.type="Picture"&&InStr(ev.desc,"name of control")){
		current:=gui.current(v.last),ea:=xml.easy(current)
		FileSelectFile,file,,% ea.value,Select a new file.,*.png;*.gif;*.jpg
		if ErrorLevel||file=""
		return
		current.SetAttribute("value",file)
		update(current),edit()
		if (v.currentmode!="interact")
		highlight()
		return
	}
	if (ev.desc="font"){
		if !gui.allsel()
		return
		if ev.parent="all selected"
		list:=gui.ssn("//*[(" gui.allsel() ") and @font]"),ea:=xml.easy(list)
		else
		list:=gui.ssn("//*[(" gui.allsel() ") and @font and @type='" ev.type "']"),ea:=xml.easy(list)
		if !ea.font
		ea:={font:"Tahoma"}
		dlg_font(ea)
		if (ev.parent="all selected"){
			selected:=gui.sn("//selected/*")
			while,sel:=selected.item(A_Index-1){
				current:=gui.current(sel.text)
				if !RegExMatch(ssn(current,"@type").text,"(Picture|Slider|Progress)")
				for a,b in ea
				current.SetAttribute(a,b)
				update(current)
			}
		}
		else if (ev.parent="constants"){
			list:=gui.allsel()
			list:=gui.sn("//*[(" list ") and @type='" ev.type "']")
			while,ll:=list.item(A_Index-1){
				for a,b in ea
				ll.SetAttribute(a,b)
				update(ll)
			}
		}
		edit()
		return
	}
	if (ev.desc="color"||ev.desc="background color"){
		selected:=gui.sn("//selected/*"),allsel:=gui.allsel()
		if allsel{
			allsel:="(" allsel ") and @" ev.value
			color:=gui.ssn("//*[" allsel "]/@" ev.value).text
			color:=RGB(dlg_color(RGB(color)))
			while,sel:=selected.item(a_index-1){
				current:=gui.current(sel.text),current.SetAttribute(ev.value,color)
				update(current)
			}
			highlight()
		}
		return
	}
	if (ev.parent="style")
	return styles()
	;messed up
	if ev.value
	hwnd({remove:44}),smalledit(ev.value,gui.ea("//*[@hwnd='" v.last "']"))
	return
	2GuiEscape:
	2GuiClose:
	hwnd({remove:2})
	return
	editgo:
	Gui,2:Default
	ControlGetText,newval,Edit2,% hwnd([44])
	hwnd({remove:44})
	ev:=v.lastev
	if ev.Gui=2
	return guiedit(ev,newval)
	if (ev.parent="settings"){
		TV_Modify(TV_GetSelection(),"",ev.desc " : " newval)
		settings.ssn("//actions/hotkey/key[@desc='" ev.desc "']").SetAttribute("value",newval)
		gui_hotkey()
		return
	}
	if (ev.gui){
		current:=gui.ssn("//show")
		current.SetAttribute(ev.value,newval)
		ea:=xml.easy(current)
		if RegExMatch(ev.value,"(x|y|w|h)")
		WinMove,% hwnd([1]),,% ea.x,% ea.y,% ea.w+(v.Border*2),% ea.h+(v.Border*2)+v.Caption
		edit(),dupcheck()
		return
	}
	if (ev.hotkey){
		TV_Modify(TV_GetSelection(),"",ev.desc " : " newval)
		settings.add("hotkeys/" ev.desc).text:=newval
		gui_hotkey()
		return
	}
	list:=gui.sn("//*[(" gui.allsel() ") and @type='" ev.type "']")
	TV_Modify(TV_GetSelection(),"Select Vis Focus",ev.desc " : " newval)
	current:=gui.current(v.last),old:=xml.easy(current)
	if ev.value="g"
	newval:=clean(newval)
	current.SetAttribute(ev.value,newval)
	att:=xml.easy(current)
	;do a reload of a single control here.
	if (att.type="ListView"&&ev.value="value"){
		gui.remove("//*[@hwnd='" att.hwnd "']")
		DllCall("DestroyWindow",uint,att.hwnddd)
		newcon:=add_control(att.type,att)
		current:=gui.current(newcon.hwnd)
		v.removelist.Insert(con)
		gui.add("selected/hwnd",{text:newcon.hwnd})
		v.last:=newcon.hwnd
	}
	update(current,ev.value,old[ev.value]),highlight()
	if InStr(ev.desc,"will reload")
	reload()
	hwnd({remove:44}),edit()
	dupcheck()
	return
}
smalledit(ll,last){
	num:=ssn(controls.ssn("//*[@value='" ll "']"),"@type").text?"number":""
	VarSetCapacity(rect,A_PtrSize*4),NumPut(A_EventInfo,rect,0,"UPtr")
	SendMessage,(0x1100|4),true,&rect,SysTreeView321,% hwnd([2])
	y:=NumGet(rect,4)&0xffff
	ControlGet,hwnd,hwnd,,SysTreeView321,% hwnd([2])
	WinGetPos,x,yy,,,ahk_id%hwnd%
	if hwnd(44)
	hwnd({remove:44})
	Gui,44:Default
	Gui,44:-Caption +hwndhwnd Owner2
	Gui,44:Margin,0,0
	text:=controls.ssn("//*[@value='" ll "']/@desc").text,hwnd(44,hwnd)
	Gui,Add,Edit,Disabled,% v.editvalue[A_EventInfo].desc " :"
	Gui,Add,Edit,%num% x+0 w150,% IsObject(last)?last[ll]:last
	Gui,Add,Button,x+0 y-1 Default geditgo,Done
	x:=x+2+NumGet(rect,0)&0xffff,y:=y+yy
	Gui,Show,x%x% y%y%
	v.editing:=A_EventInfo
	return
	44GuiEscape:
	hwnd({remove:44})
	return
}
hidecheck(){
	Gui,2:Default
	for id in v.tvrem{
		VarSetCapacity(tvitem,A_PtrSize*4)
		info:=A_PtrSize=4?{0:8,4:id,12:0xf000}:{0:8,8:id,20:0xf000}
		for a,b in info
		NumPut(b,tvitem,a)
		SendMessage,4415,0,&tvitem,SysTreeView321,% hwnd([2])
	}
}
update(node,change="",old="",noredraw=""){
	ea:=xml.easy(node)
	if (RegExMatch(change,"i)(w|h)")&&ea.type="Picture"){
		MsgBox,4,Resize Image,Keep Aspect Ratio?
		IfMsgBox,Yes
		{
			other:=change="w"?"h":"w",ea[other]:=ea[other]*ea[change]/old,ea[other]:=Floor(ea[other])
			node.SetAttribute(other,ea[other])
		}
		WinActivate,% hwnd([1])
		WinSet,Redraw,,% hwnd([1])
		GuiControl,1:movedraw,% ea.hwnd,% "w" ea.w " h" ea.h
		GuiControl,1:,% ssn(node,"@hwnd").text,% "*w-1 " ssn(node,"@value").text
	}
	else if (ea.Type="Picture"){
		current:=gui.current(ea.hwnd)
		GuiControl,1:,% ssn(node,"@hwnd").text,% "*w-1 " ea.value
		GuiControl,1:movedraw,% ea.hwnd
		for a,b in getpos(ea.hwnd)
		if a not in x,y
		current.SetAttribute(a,b)
		ea:=xml.easy(current)
	}
	value:=RegExMatch(ea.type,"i)(ComboBox|Tab|Tab2|DropDownList|ListBox)")?"|" ea.value:ea.value
	GuiControl,1:,% ea.hwnd,%value%
	for a,b in ea
	if a in x,y,w,h
	pos.=a b " "
	ea.x+=v.Border,ea.y+=v.Border+v.Caption
	grid(ea.x,ea.y,1)
	Gui,1:Default
	Gui,1:Font,% compilefont(ea),% ea.font
	GuiControl,1:Font,% ea.hwnd
	GuiControl,1:movedraw,% ea.hwnd,%pos%	
	Gui,1:Font
	return
}
checkfiles(){
	temp:=ComObjCreate("MSXML2.DOMDocument")
	if !fileexist("lib")
	FileCreateDir,lib
	list:=[]
	for a,b in {"controls.xml":{path:"lib\controls.xml",version:"0.001.5"},"tile.bmp":{path:"tile.bmp"}}{
		temp.load(b.path),vers:=ssn(temp,"//version").text,verver:=b.version
		if b.version
		{
			if instr(vers,"auto_version")
			continue
			if (vers<verver)
			FileDelete,% b.path
		}
		if !FileExist(b.path)
		list[a]:=b.path
	}
	for a,b in list{
		if (InStr(a,".xml")){
			con:=URLDownloadToVar("http://www.maestrith.com/files/NewGUICreator/" a,400,50,"Downloading controls.xml","Please wait...")
			FileAppend,%con%,% b
		}
		else
		{
			FileDelete,%b%
			UrlDownloadToFile,http://www.maestrith.com/files/GUICreator/%a%,%b%
		}
	}
	SplashTextOff
	temp:=""
}
rcm(){
	GuiContextMenu:
	MouseGetPos,x,y,,con,2
	Grid(x,y,1),con:=married(con),v.last:=con
	current:=gui.current(con)
	ancestor:=ssn(current,"ancestor::*[@type='Tab' or @type='Tab2']/@hwnd")
	SendMessage, 0x1304,,,,% "ahk_id" ancestor.text
	tabcount:=ErrorLevel
	c:=controls.sn("//controls/*")
	while,b:=c.item(A_Index-1).nodename
	Menu,Add,Add,%b%,Add
	Menu,rcm,Add,&Add,:Add
	if (tabcount>1&&tabcount!="FAIL"){
		Loop,%tabcount%
		Menu,movetab,Add,%A_Index%,movetab
		Menu,rcm,Add,Move to tab,:movetab
	}
	Menu,rcm,Add
	menu:=[{["File","menu"]:["New GUI","Load GUI","Save GUI","Save GUI As","Export GUI","Reload","Test GUI"]}
	,{["Edit","menu"]:["Copy GUI to Clipboard","Remove Selected","Reorder GUI"]}
	,{["About","menu"]:["GUI Creator Version"]}
	,{["Settings","settings"]:["GUI Settings","Settings"]}
	,{["Refresh"]:["Refresh","split"]}
	,{["Help"]:["editmenu"]}]
	for a,b in menu
	for c,d in b{
		menu:=c.1 2
		if c.2
		for e,f in d{
			Menu,%menu%,Add,%f%,% c.2
			Menu,rcm,Add,% c.1,:%menu%
			lastmenu:=c.2
		}
		else
		{
			if d.2="split"
			Menu,rcm,Add
			Menu,rcm,Add,% c.1,% d.1
		}
	}
	Menu,rcm,Show
	Menu,rcm,DeleteAll
	if (tabcount>1&&tabcount!="FAIL"){
		Menu,movetab,DeleteAll
		Menu,movetab,Delete
	}
	return
	menu:
	fun:=clean(A_ThisMenuItem)
	if IsFunc(fun)
	%fun%()
	return
	add:
	value:=""
	if (A_ThisMenuItem="Picture"){
		FileSelectFile,file,,,Select an image,*.jpg;*.png;*.gif
		if ErrorLevel||file=""
		return
		value:=file
	}
	value:=value?value:A_ThisMenuItem
	add_control(A_ThisMenuItem,{x:x,y:y,value:value,type:A_ThisMenuItem})
	return
	settings:
	select:=A_ThisMenuItem="settings"?3:2
	edit(A_ThisMenuItem)
	return
	editmenu:
	mm:=A_ThisMenuItem
	if (mm="help")
	help()
	return
}
clean(info,options=""){
	if !options
	return RegExReplace(info," ","_")
	return RegExReplace(info,"_"," ")
}
save_gui_as(){
	option:=settings.ssn("//options/Warn_Overwrite").text?"S16":""
	FileSelectFile,save,%option%,,Save GUI As:,*.xml
	if (ErrorLevel||save="")
	return
	save:=InStr(save,".xml")?save:save ".xml"
	save_gui(save)
}
Dlg_Font(ByRef Style,window="",effects=1){
	window:=window?window:hwnd(2)
	style.color:=RGB(style.color)
	VarSetCapacity(logfont,60),LogPixels:=DllCall("GetDeviceCaps","uint",DllCall("GetDC","uint",0),"uint",90),Effects:=0x041+(Effects?0x100:0)
	for a,b in fontval:={16:style.bold?700:400,20:style.italic,21:style.underline,22:style.strikeout,0:style.size?Floor(style.size*logpixels/72):16}
	NumPut(b,logfont,a)
	cap:=VarSetCapacity(choosefont,A_PtrSize=8?103:60,0)
	NumPut(hwnd,choosefont,A_PtrSize)
	for index,value in [[cap,0,"Uint"],[&logfont,A_PtrSize=8?24:12,"Uptr"],[effects,A_PtrSize=8?36:20,"Uint"],[style.color,A_PtrSize=4?6*A_PtrSize:5*A_PtrSize,"Uint"]]
	NumPut(value.1,choosefont,value.2,value.3)
	if (A_PtrSize=8)
	strput(style.font,&logfont+28),r:=DllCall("comdlg32\ChooseFont","uptr",&CHOOSEFONT,"cdecl"),name:=strget(&logfont+28)
	else
	strput(style.font,&logfont+28,32,"utf-8"),r:=DllCall("comdlg32\ChooseFontA","uptr",&CHOOSEFONT,"cdecl"),name:=strget(&logfont+28,32,"utf-8")
	if !r
	return 0
	st:=[]
	for a,b in {bold:16,italic:20,underline:21,strikeout:22}
	st[a]:=NumGet(logfont,b,"UChar")
	st.bold:=st.bold<188?0:1
	st.color:=RGB(NumGet(choosefont,A_PtrSize=4?6*A_PtrSize:5*A_PtrSize))
	st.size:=NumGet(CHOOSEFONT,A_PtrSize=8?32:16,"UChar")//10
	st.font:=name
	style:=st
}
rgb(c){
	setformat,IntegerFast,H
	c:=(c&255)<<16 | (c&65280) | (c>>16),c:=SubStr(c,1)
	SetFormat, integerfast,D
	return c
}
Dlg_Color(Color,hwnd=""){
	static
	if !cc{
		VarSetCapacity(cccc,16*A_PtrSize,0),cc:=1,size:=VarSetCapacity(CHOOSECOLOR,9*A_PtrSize,0)
		Loop,16{
			IniRead,col,color.ini,color,%A_Index%,0
			NumPut(col,cccc,(A_Index-1)*4,"UInt")
		}
	}
	NumPut(size,CHOOSECOLOR,0,"UInt"),NumPut(hwnd,CHOOSECOLOR,A_PtrSize,"UPtr")
	,NumPut(Color,CHOOSECOLOR,3*A_PtrSize,"UInt"),NumPut(3,CHOOSECOLOR,5*A_PtrSize,"UInt")
	,NumPut(&cccc,CHOOSECOLOR,4*A_PtrSize,"UPtr")
	ret:=DllCall("comdlg32\ChooseColorW","UPtr",&CHOOSECOLOR,"UInt")
	if !ret
	exit
	Loop,16
	IniWrite,% NumGet(cccc,(A_Index-1)*4,"UInt"),color.ini,color,%A_Index%
	IniWrite,% Color:=NumGet(CHOOSECOLOR,3*A_PtrSize,"UInt"),color.ini,default,color
	return Color
}
compilefont(ea){
	if ea.size
	font.="s" ea.size
	if ea.color!=""
	font.=" c" ea.color
	for a,b in {Bold:ea.bold,Italic:ea.italic,Strikeout:ea.strikeout,Underline:ea.underline}
	if b
	font.=" " a " "
	return Trim(font)
}

styles(){
	styles:
	if A_GuiEvent!=Normal
	return
	if !A_EventInfo
	return
	ControlGet,tab,tab,,SysTabControl321,% hwnd([2])
	if Tab>1
	goto styleend
	if !v.editvalue[A_EventInfo].value
	return
	check:=TV_Get(A_EventInfo,"Check")?1:0
	value:=v.editvalue[A_EventInfo].value
	current:=gui.current(v.last),ea:=xml.easy(current),option:=A_EventInfo
	op:=ea.options,contain:=0
	Loop,Parse,op,%A_Space%,%A_Space%
	if (A_LoopField==value)
	contain:=1
	if check&&contain=0
	ea.options.=" " value
	if (check=0&&contain){
		op:=ea.options,list:=""
		Loop,Parse,op,%A_Space%,%A_Space%
		if (A_LoopField!=value)
		list.=A_LoopField " "
		ea.options:=Trim(list)
	}
	if InStr(value,"-")
	flip:=check=0?RegExReplace(value,"\-","+"):value
	if !InStr(value,"-")
	flip:=check=0?"-" value:"+" value
	sel:=gui.sn("//selected/*")
	TV_GetText(parent,TV_GetParent(TV_GetParent(A_EventInfo)))
	while,hwnd:=sel.item(A_Index-1).text{
		current:=gui.current(hwnd)
		type:=ssn(current,"@type").text
		if (type!=parent)
		continue
		current.SetAttribute("options",Trim(ea.options))
		if (InStr(flip,"Multi")&&type="ListView")
		continue
		GuiControl,1:%flip%,% hwnd
		GuiControl,1:movedraw,% hwnd
	}
	if InStr(v.editvalue[A_EventInfo].desc,"GUI Will Reload")
	reload()
	return
	styleend:
	if (tab=2){
		check:=TV_Get(A_EventInfo,"Check")?1:0
		setting:=v.windowoptions[A_EventInfo],new:=""
		show:=gui.ssn("//show/@options")
		ss:=show.text
		if check
		new:=Trim(ss " " setting)
		else
		Loop,Parse,ss,%A_Space%,%A_Space%
		if (A_LoopField!=setting)
		new:=Trim(new " " A_LoopField)
		gui.add("gui/show",{att:{options:new}})
	}
	return
}
reload(){
	current:=gui.xml.xml
	v.loading:=1
	Gui,1:Default
	gui(1),gui:=new xml("gui")
	temp:=new xml("temp")
	temp.xml.loadxml(current),tabcount:=0
	ctrl:=temp.sn("//@hwnd/..")
	while,ct:=ctrl.item(A_Index-1){
		ea:=xml.easy(ct)
		if ea.tabnum&&!ea.tab	;<---This is for
		ea.tab:=ea.tabnum		;<---backward compatibility.
		add_control(ea.type,ea)
	}
	filename:=temp.ssn("//file/filename").text
	dir:=temp.ssn("//file/dir").text
	gui.add("gui/file/filename").text:=filename
	Gui.add("gui/file/dir").text:=dir
	gui.Transform()
	ea:=temp.ea("//show"),gui.ssn("*").AppendChild(temp.ssn("//show"))
	ea.options:=RegExReplace(ea.options,"i)(Hide|Minimize|NA|NoActivate)")
	for a,b in ea
	if a in x,y,w,h
	if b
	position.=a b " "
	Gui,Show,% position " " ea.options
	v.loading:=0
	WinSetTitle,% hwnd([1]),,GUI Creator : %filename%
	snap(1),gui_hotkey()
}
select_all(){
	selectall:
	gui.remove("//gui/selected")
	selected:=gui.add("gui/selected")
	all:=gui.sn("//*[@hwnd]/@hwnd")
	while,aa:=all.item(A_Index-1){
		gui.add("gui/selected/hwnd",{dup:1}).text:=aa.text
		Gui.unique("templist/control",{att:{control:aa.text}},"control")
	}
	highlight(),edit()
	return
}
compile_gui(ret=""){
	gui.Transform()
	compile:=[]
	find_duplicates()
	www:=gui.sn("//*[@font='' or @type='Picture' or @type='MonthCal']/@hwnd")
	while,ww:=www.item(A_Index-1){
		current:=gui.current(ww.text)
		for a,b in ["bold","italic","underline","strikeout","font","size"]
		current.RemoveAttribute(b)
	}
	temp:=new xml("temp"),list:=[]
	biglist:=gui.sn("//*[@hwnd]")
	if gg:=gui.ssn("//show/@gui").Text
	total:="Gui," gg "`n"
	while,bl:=biglist.item(A_Index-1){
		ea:=xml.easy(bl),position:=""
		list:=att.r?["x","y","w"]:["x","y","w","h"]
		for a,b in list
		if ea[b]
		position.=b ea[b] " "
		if ea.r
		position.="r" ea.r " "
		cf:=compilefont(ea)
		fm:=ea.font?cf:""
		if (ea.tab!=lasttab)
		total.="Gui,Tab," ea.tab "`r`n"
		if (lastfont&&ea.font="")
		total.="Gui,Font`r`n"
		if (lastfont!=cf ea.font&&ea.font)
		total.="Gui,Font,Normal " compilefont(ea) "," ea.font "`r`n"
		color:=ea.color?"c" ea.color:""
		options:=ea.options?ea.options " ":""
		glabel:=ea.g?" g" ea.g:""
		var:=ea.v?" v" ea.v:""
		back:=ea.background?" Background" ea.background:""
		toption:=Trim(RegExReplace(position options color var glabel back,"\s\s"," "))
		total.="Gui,Add," ea.type "," toption "," ea.value "`r`n"
		lastfont:=cf ea.font
		lasttab:=ea.tab
		var:=glabel:=back:=""
		if InStr(ea.type,"Tab")
		lasttab:=""
	}
	winoptions:=" " gui.ssn("//show/@options").Text
	ea:=gui.ea("//show"),position:=""
	if !InStr(ea.gui,"Resize")
	ea.x+=Round(v.border/2),ea.y+=Round(v.border/2)
	if !RegExMatch(ea.options,"i)\bcenter\b"){
		if !InStr(ea.options,"xcenter")
		position.="x" ea.x
		if !InStr(ea.options,"ycenter")
		position.=" y" ea.y
	}
	position.=" w" ea.w " h" ea.h
	total.="Gui,Show," position winoptions "," gui.ssn("//show/@title").text "`r`nReturn`r`n"
	labels:=gui.sn("//*[@g!='']"),one:=[]
	while,lab:=labels.item(a_index-1){
		ea:=xml.easy(lab)
		if !one[ea.g]{
			total.=ea.g ":`r`n"
			if prog:=gui.ssn("//labels/" ea.g).text
			total.=RegExReplace(prog,"\n","`r`n") "`r`n"
			total.="Return`r`n"
		}
		one[ea.g]:=1
	}
	total.="GuiClose:`r`nExitApp`r`nReturn"
	if ret
	return total
	show_code()
}
find_duplicates(){
	dup:=gui.sn("//*[@v!='']"),duplicate:=[]
	while,dd:=dup.item(A_Index-1){
		ea:=gui.easy(dd)
		check:=sn(dd,"//*[@v='" ea.v "']")
		if check.length>1
		while,cc:=check.item(A_Index-1)
		duplicate[ea.hwnd]:=1
	}
	if duplicate.MinIndex(){
		hwnd({remove:2})
		gui.remove("//gui/selected")
		for a,b in duplicate
		gui.add("gui/selected/hwnd",{text:a,dup:1}),highlight()
		m("The highlighted controls have duplicate variables.","Please fix this.")
		Exit
	}
}
/*
edithotkey(){
	edithotkey:
	global hot
	if A_GuiEvent!=Normal
	return
	WinGetPos,xx,yy,,,% hwnd([2])
	Gui,2:ListView,SysListView322
	ControlGetPos,x,y,w,h,SysListView322,% hwnd([2])
	VarSetCapacity(rect,16)
	SendMessage,(0x1000|14),LV_GetNext()-1,&rect,SysListView322,% hwnd([2])
	Gui,44:+Owner2 +hwndhwnd -Caption
	LV_GetText(control,LV_GetNext(),2),y:=NumGet(rect,4)+y+yy,x:=xx+x+1,LV_GetText(key,LV_GetNext())
	Gui,44:Add,Hotkey,ghotkey vhot,%key%
	Gui,44:Add,Edit,x+0 Disabled,%control%
	Gui,44:Add,Button,x+0 gehk,Done
	Gui,44:Add,Button,x+0 gehk,Clear
	Gui,44:Show,x%x% y%y%
	return
	ehk:
	if (A_GuiControl="Done")
	goto 44GuiEscape
	if (A_GuiControl="Clear")
	settings.remove("//hotkeys/" control),LV_Modify(LV_GetNext(),"Col1","")
	44GuiEscape:
	Gui,44:Destroy
	gui_hotkey()
	return
	hotkey:
	Gui,44:Submit,Nohide
	Gui,2:Default
	Gui,2:ListView,SysListView322
	settings.add("hotkeys/" control).text:=hot
	LV_Modify(LV_GetNext(),"Col1",hot)
	return
}
*/
mode_select(){
	static modes:={0:"Move",1:"Resize",2:"Interact"},mode=0
	modesel:
	if A_ThisHotkey
	ea:=settings.ssn("//key[@value='" A_ThisHotkey "']/@desc").text
	if (ea="previous mode"){
		if mode>0
		mode--
		else if mode=0
		mode:=2
	}
	if (ea="next mode"){
		mode++
		mode:=Mod(mode,3)
	}
	sleep,1
	Gui,2:Default
	SB_SetText("LButton mode : " modes[mode])
	v.currentmode:=modes[mode]
	Gui,1:Default
	if !hwnd(2)
	TrayTip,GUI Creator,% "LButton mode : " modes[mode]
	else
	TrayTip
	return
}
resize(templist,x,y){
	Grid(x,y)
	while,GetKeyState("LButton","P"){
		MouseGetPos,xx,yy
		Grid(xx,yy)
		offw:=xx-x,offh:=yy-y
		change:=lastx=xx?"h":"w",other:=change="w"?"h":"w",oo:=[]
		if !(lastx=xx&&lasty=yy)
		while,tl:=templist.item(A_Index-1){
			ea:=xml.easy(tl),w:=ea.w+offw,h:=ea.h+offh
			if (ea.type="Picture")
			w:=ea.w*h/ea.h,picture:=1
			GuiControl,1:movedraw,% ea.control,% "w" w " h" h
			ct:=gui.current(ea.control),ct.SetAttribute("w",w),ct.SetAttribute("h",h)
		}
		sleep,30
		lastx:=xx,lasty:=yy
	}
	if (picture){
		while,tl:=templist.item(a_index-1)
		if (ssn(tl,"@type").Text="Picture")
		update(gui.current(ssn(tl,"@control").text))
	}
}
help(){
	help=
	(
	GUI Creator Help,Help:
	Press Ctrl+A to select all controls
	Hold Ctrl+LButton to toggle an items select state
	Hold Shift+LButton to add a control to the selection
	Hold Alt+LButton to interact with the control
	Scroll your mouse wheel to change LButton mode 
	-(Current mode is on the bottom of the edit window)
	Delete deletes all selected controls.
	)
	MsgBox,32,GUI Creator,% RegExReplace(help,"\t")
}
remove_selected(){
	delete:
	selected:=gui.sn("//selected/*")
	while,sel:=selected.item(a_index-1){
		con:=sel.text
		WinGetClass,out,ahk_id%con%
		if InStr(out,"SysTabControl"){
			current:=gui.ssn("//*[@hwnd='" con "']")
			current.SetAttribute("deleted",1)
			gui.remove("//*[@hwnd='" con "']")
			ControlMove,,-55,-44,0,0,ahk_id%con%
			del:=sn(current,"descendant::*[@hwnd]")
			while,dd:=del.item(a_index-1){
				con:=ssn(dd,"@hwnd").text
				DllCall("DestroyWindow",uint,con)
				gui.remove("//*[@hwnd='" con "']")
			}
			continue
		}
		DllCall("DestroyWindow",uint,con)
		WinGet,cl,ControlList,% hwnd([1])
		Gui,1:Tab
		gui.remove("//*[@hwnd='" con "']")
	}
	highlight()
	WinSet,Redraw,,% hwnd([1])
	return
}
gui_creator_version(){
	Gui,88:Destroy
	Gui,88:Default
	Gui,88:+hwndhwnd
	hwnd(88,hwnd)
	Gui,Add,Edit,w500 h500,% URLDownloadToVar("http://files.maestrith.com/NewGUICreator/GUI Creator.text",250,50,"Downloading latest version info","Please wait...")
	Gui,Add,Button,gvupd,Update Script
	Gui,Show,,Version=0.001.26
	ControlSend,Edit1,^{Home},% hwnd([88])
	return
	vupd:
	Version=0.001.26
	ext:=A_IsCompiled?".exe":".ahk"
	FileMove,%A_ScriptName%,Backup-%version%-%A_ScriptName%,1
	SplashTextOn,200,50,Downloading,Please wait
	URLDownloadToFile,http://files.maestrith.com/NewGUICreator/GUI Creator%ext%,%A_ScriptName%
	SplashTextOff
	Run,%A_ScriptName%
	ExitApp
	return
	88GuiEscape:
	88GuiClose:
	hwnd({remove:88})
	return
}
URLDownloadToVar(url,info*){
	if info.1
	SplashTextOn,% info.1,% info.2,% info.3,% info.4
	hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
	hObject.Open("GET",url)
	hObject.Send()
	SplashTextOff
	return hObject.ResponseText
}
Copy_GUI_to_Clipboard(){
	Copy_GUI_to_Clipboard:
	Clipboard:=compile_gui(1)
	TrayTip,GUI Creator,Script copied to your Clipboard
	return
}
makeblock(){
	ea:=settings.ea("//settings/grid")
	dot:=ea.dot?ea.dot:0,grid:=ea.grid!=""?ea.grid:0xEEEEEE
	image:=ComObjCreate("WIA.ImageFile")
	vector:=ComObjCreate("WIA.Vector")
	dot+=0,grid+=0
	vector.add(dot)
	loop,99
	vector.add(grid)
	image:=vector.imagefile(10,10)
	FileDelete,tile.bmp
	image.savefile("tile.bmp")
	display_grid("removebrush")
	WinSet,Redraw,,% hwnd([1])
}
adjust(){
	adjust:
	templist:=gui.sn("//templist/*")
	Gui.Transform()
	if !templist.length
	return
	killhighlight(),grid:=settings.ssn("//options/Snap_To_Grid").text
	direction:=settings.ssn("//key[@value='" A_ThisHotkey "']/@desc").text
	while,tl:=templist.item(A_Index-1){
		ea:=xml.easy(tl)
		pos:=getpos(ea.control)
		if direction=Left
		pos.x-=grid?10:1
		if direction=Right
		pos.x+=grid?10:1
		if direction=up
		pos.y-=grid?10:1
		if direction=down
		pos.y+=grid?10:1
		grid(pos.x,pos.y)
		GuiControl,1:movedraw,% ea.control,% "x" pos.x " y" pos.y
		ct:=gui.current(ea.control),ct.SetAttribute("x",pos.x),ct.SetAttribute("y",pos.y)
	}
	highlight()
	return
}
Export_GUI(){
	option:=settings.ssn("//options/Warn_Overwrite").text?"S16":""
	FileSelectFile,file,%option%,,Choose a file to save the GUI.,*.ahk
	if ErrorLevel||file=""
	return
	file:=InStr(file,".ahk")?file:file ".ahk"
	gg:=compile_gui(1)
	FileDelete,%file%
	FileAppend,%gg%,%file%
}
show_code(){
	info:=compile_gui(1)
	Gui,58:Destroy
	Gui,58:Add,Edit,w800 h800 -Wrap,% info
	Gui,58:Show
	return
	58GuiEscape:
	Gui,58:Destroy
	return
}
dupcheck(){
	vars:=gui.sn("//*[@v!='']"),list:=[]
	while vv:=vars.item(a_index-1){
		ea:=xml.easy(vv)
		count:=gui.sn("//*[@v='" ea.v "']")
		if RegExReplace(gui[],"i)v=" Chr(34) ea.v Chr(34),,count)&&count>1
		list[ea.hwnd]:=1
	}
	if list.maxindex(){
		gui.remove("//selected")
		for a in list
		gui.add("gui/selected/hwnd",{dup:1}).text:=a
		highlight()
		MsgBox,48,Variable Conflict!,The selected controls share the same Variable.  Please change them
	}
}
move(templist,x,y){
	while,GetKeyState("LButton","P"){
		MouseGetPos,xx,yy
		Grid(xx,yy)
		if !(lastx=xx&&lasty=yy)
		while,tl:=templist.item(A_Index-1){
			ea:=xml.easy(tl),x:=ea.x+xx,y:=ea.y+yy
			grid(x,y)
			GuiControl,1:movedraw,% ea.control,% "x" x " y" y
			ct:=gui.current(ea.control),ct.SetAttribute("x",x),ct.SetAttribute("y",y)
		}
		sleep,30
		lastx:=xx,lasty:=yy
	}
}
reorder_gui(){
	static clist,tvlist
	Gui,3:Destroy
	Gui,3:Default
	Gui,+Owner1 +hwndhwnd
	hwnd(3,hwnd)
	Hotkey,IfWinActive,% hwnd([3])
	Hotkey,+up,moveit,On
	Hotkey,+down,moveit,On
	Gui,Add,Text,,Usage: Press either Shift+Up or Shift+Down to move a control`nControls may be re-ordered if`n1.You move a control from a tab to the main GUI`n2.If you move a control from a GroupBox to the main Gui
	Gui,Add,TreeView,w300 h500 AltSubmit greorder
	reorderpop:
	gg:=gui.sn("//*[@hwnd]"),clist:=[],tvlist:=[],tablist:=[]
	while,control:=gg.item(a_index-1){
		if ssn(control,"@tab").text{
			node:=control
			while,node.nodename!="tab"
			node:=node.ParentNode
			last:=node.xml
			if (!tablist[node.xml]){
				lasttab:=TV_Add("Tab " ssn(control,"@tab").text,lastcontrol,"Expand")
				parent:=lastcontrol
				tablist[node.xml]:=lasttab
			}
			parent:=tablist[node.xml]
			if ssn(control.ParentNode,"@type").text="GroupBox"
			parent:=lastgroup
		}
		else if (control.ParentNode.nodename!="window")
		parent:=lastgroup
		else
		parent:=0
		con:=TV_Add(ssn(control,"@type").text,parent,"Expand")
		clist[con]:=ssn(control,"@hwnd").text
		tvlist[ssn(control,"@hwnd").text]:=con
		if InStr(ssn(control,"@type").text,"Tab")
		lastcontrol:=con
		if InStr(ssn(control,"@type").text,"GroupBox")
		lastgroup:=con
	}
	TV_Modify(TV_GetNext(),"Select Focus")
	if A_ThisLabel=menu
	gosub high
	Gui,Show,,Reorder GUI
	return
	3GuiEscape:
	3GuiClose:
	Gui,3:Destroy
	return
	reorder:
	if A_GuiEvent not in normal,k
	return
	if A_GuiEvent=k
	if A_EventInfo=16
	return
	high:
	if !hwnd:=clist[TV_GetSelection()]
	return
	Gui.remove("//selected"),Gui.Add("gui/selected/hwnd").text:=hwnd
	highlight()
	current:=gui.ssn("//*[@hwnd='" hwnd "']")
	if tab:=ssn(current,"@tab").text{
		phwnd:=ssn(current,"ancestor::*[@type='Tab' or @type='Tab2']/@hwnd").text
		GuiControl,1:Choose,%phwnd%,%tab%
	}
	Gui,3:Default
	WinSet,Top,,% hwnd([3])
	return
	moveit:
	Gui,3:Default
	TV_GetText(tt,TV_GetSelection())
	if InStr(tt,"tab ")
	return m("Can not move tabs")
	nextitem:=A_ThisHotkey="+up"?TV_GetPrev(TV_GetSelection()):TV_GetNext(TV_GetSelection())
	first:=gui.ssn("//*[@hwnd='" clist[TV_GetSelection()] "']")
	second:=gui.ssn("//*[@hwnd='" clist[nextitem] "']")
	if !second
	return
	first.SetAttribute("reorder",1)
	top:=first.ParentNode
	if A_ThisHotkey=+up
	top.insertbefore(first,second)
	else
	top.insertbefore(second,first)
	GuiControl,-Redraw,SysTreeView321
	TV_Delete()
	gosub reorderpop
	select:=gui.ssn("//@reorder/..")
	select.RemoveAttribute("reorder")
	TV_Modify(tvlist[ssn(select,"@hwnd").text],"Select Vis Focus")
	GuiControl,+Redraw,SysTreeView321
	return
}
/*
	Move_Selected_Item_Up(){
		GuiControl,-Redraw,SysTreeView321
		current:=current()
		if b4:=current.previousSibling{
			current.SetAttribute("here",1)
			new:=b4.parentnode.insertBefore(current,b4)
			load_menu(x)
			clear_here()
		}
		GuiControl,+Redraw,SysTreeView321
	}
	Move_Selected_Item_Down(){
		GuiControl,-Redraw,SysTreeView321
		current:=current()
		if b4:=current.nextSibling{
			current.SetAttribute("here",1)
			new:=b4.parentnode.insertBefore(b4,current)
			load_menu(x)
			clear_here()
		}
		GuiControl,+Redraw,SysTreeView321
	}
*/
move_to_tab(){
	movetab:
	current:=gui.current(v.last)
	current.SetAttribute("tab",A_ThisMenuItem)
	ea:=xml.easy(current),hwnd:=ea.hwnd
	add_control(ea.type,ea)
	DllCall("DestroyWindow",uint,gui.ea("//*[@hwnd='" hwnd "']").hwnd)
	current.ParentNode.RemoveChild(current),highlight()
	return
}
guiedit(ev,value=""){
	if A_GuiEvent!=Normal
	return
	if (value){
		gui.ssn("//show/@" ev.value).text:=value
		edit("GUI Settings"),vv:=ev.value,ea:=gui.ea("//show")
		if vv in x,y,w,h
		WinMove,% hwnd([1]),,% ea.x,% ea.y,% ea.w+(v.Border*2),% ea.h+(v.Border*2+v.Caption)
		return
	}
	if ev.parent="constants"
	return smalledit(ev.desc,ev.start)
	if !gui.ssn("//show/@" ev.parent)
	Gui.ssn("//show").SetAttribute(ev.parent,"")
	toggle(gui.ssn("//show/@" ev.parent),ev.value,TV_Get(A_EventInfo,"Check"))
	if ev.parent="options"
	Gui,1:Show,% RegExReplace(gui.ssn("//show/@options").text,"i)(Hide|Minimize|NA|NoActivate)")
	edit("GUI Settings")
}
toggle(node,value,check){
	values:=[],vv:=node.text " " value
	Loop,Parse,vv,%A_Space%,%A_Space%
	values[A_LoopField]:=1
	if !check
	values.remove(value)
	for a in values
	list.=a " "
	node.text:=Trim(list)
}
test_gui(){
	static pid
	info:="#SingleInstance,Force`n" compile_gui(1)
	pid:=dynarun(info)
	ea:=gui.ea("//show")
	x:=ea.x,y:=ea.y
	if InStr(gui.ssn("//show/@gui").text,"-Caption"){
		Gui,33:Destroy
		Gui,33:+AlwaysOnTop
		Gui,33:Add,Text,,This window pops up when you select no caption
		Gui,33:Add,Button,gshow,Show Window
		Gui,33:Add,Button,gkill,Kill Window
		Gui,33:Show,Center,Window control
	}
	return
	show:
	WinActivate,ahk_pid%pid%
	return
	33GuiClose:
	33GuiEscape:
	kill:
	WinKill,ahk_pid%pid%
	Gui,33:Destroy
	Gui,1:Default
	return
}
edit_labels(){
	static
	labels:=gui.sn("//*[@g!='']/@g")
	Gui,4:Destroy
	Gui,4:+hwndhwnd
	hwnd(4,hwnd)
	Gui,4:Add,ListView,w150 h300 AltSubmit gpop,Labels
	Gui,4:Add,Edit,x+10 w500 h300 geditlabel veditlabel
	Gui,4:Default
	while,ll:=labels.item(a_index-1)
	LV_Add("",ll.text)
	Gui,4:Show,,Label Editor
	LV_Modify(1,"Focus Vis Select")
	return
	editlabel:
	Gui,4:Submit,Nohide
	LV_GetText(label,LV_GetNext())
	gui.add("labels/" label).text:=editlabel
	return
	pop:
	Gui,4:Default
	LV_GetText(label,LV_GetNext())
	ControlSetText,Edit1,% RegExReplace(gui.ssn("//labels/" label).text,"\n","`r`n"),% hwnd([4])
	return
	4GuiClose:
	4GuiEscape:
	hwnd({remove:4})
	return
}
;http://www.autohotkey.com/community/viewtopic.php?t=63916
DynaRun(TempScript){
	static _:="uint"
	@:=A_PtrSize?"Ptr":_
	name := "GUI Creator Test"
	__PIPE_GA_ := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,3,_,0,_,255,_,0,_,0,@,0,@,0)
	__PIPE_    := DllCall("CreateNamedPipe","str","\\.\pipe\" name,_,3,_,0,_,255,_,0,_,0,@,0,@,0)
	if (__PIPE_=-1 or __PIPE_GA_=-1)
	Return 0
	Run, %A_AhkPath% "\\.\pipe\%name%",,UseErrorLevel HIDE,PID
	If ErrorLevel
	MsgBox, 262144, ERROR,% "Could not open file:`n" __AHK_EXE_ """\\.\pipe\" name """"
	DllCall("ConnectNamedPipe",@,__PIPE_GA_,@,0)
	DllCall("CloseHandle",@,__PIPE_GA_)
	DllCall("ConnectNamedPipe",@,__PIPE_,@,0)
	script := (A_IsUnicode ? chr(0xfeff) : (chr(239) . chr(187) . chr(191))) . TempScript
	if !DllCall("WriteFile",@,__PIPE_,"str",script,_,(StrLen(script)+1)*(A_IsUnicode ? 2 : 1),_ "*",0,@,0)
	Return A_LastError
	DllCall("CloseHandle",@,__PIPE_)
	Return PID
}