Advertisement
Guest User

GUI Buildeer Deluxe

a guest
Jan 10th, 2016
1,686
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Name: GUI Buildeer Deluxe
  3. Version 1.0 (Saturday, January 09, 2016)
  4. Created: Saturday, January 02, 2016
  5. Author: tidbit
  6. Credit:
  7.     Family Dollar, For "providing" the delicious snacks (at discount prices) needed for making this program.
  8.     Bugz000      , A currently unused function that may get added in eventually.
  9.  
  10. Hotkeys:
  11.     esc   --- Quit
  12.     enter --- Generate! but not Generate?
  13.     maybe others
  14.    
  15. Description:
  16.     Generate a gui with the press of a key. No more slaving away at trying to
  17.     build a gui in a "Gui builder" or trying to figure out the code yourself, learning
  18.     is overrated anyways.
  19.     For the visually impaired or those who cannot read, there is also a Speak option.
  20.     If you want some control, there's advanced settings for you to do stuff with.
  21.    
  22. Other info:
  23.     1=edit, 2=button, 3=checkbox, 4=radio, 5=ddl, 6=combobox
  24.     7=hotkey, 8=datetime, 9=Listview
  25.  
  26. To-do:
  27.     - groupbox, treeview, tabs, possibly activex (ie)
  28.     - insert random code snippets, generate fully functional guis
  29.     - new positioning system to reduce the chance of oversized 90% empty guis
  30.    
  31. */
  32. #SingleInstance, force
  33. _name_:="GUI Buildeer Deluxe"
  34. _ver_:="1.0"
  35.  
  36. texts:=["","Settings","Width","Height","Color","Domains","Qualification"
  37. ,"Dock","IPR","ACSC's","Submit","OK","Okay","Send","Forward","Back","button"
  38. ,"add","remove","...",A_DDDD]
  39. lists:=["aaa||bbb|ccc|ddd|eee", "Car|Truck||Suv|Van|Boat", "1||2|3|4|5|6", "LDL||ISPS|QTR|AXTDs", "Goat|Pig|Cow|Crow|Ostrich|Alpaca||Gazelle"]
  40.  
  41.  
  42.  
  43. gui, settings: margin, 6, 6
  44. gui, settings: +resize
  45. ; gui, settings: color, 0x8FBC8F
  46. ; gui, settings: font, s12
  47. gui, settings: add, button, xm ym w200 default gdoTheStuff, Generate!
  48. gui, settings: add, checkbox, xm y+m cgreen vspeak, Speak the controls
  49. gui, settings: add, text, xm y+m cblue vtxt1, Controls* to add:
  50. gui, settings: add, edit, x+m yp-3 w100 section number cblue vcCount, 7
  51. gui, settings: add, updown, vud1, 7
  52. gui, settings: add, text, xm y+m vtxt6, Gui name:
  53. gui, settings: add, edit, xs yp-3 w100 vguiName,
  54. gui, settings: add, text, xm y+-1 cgray vtxt2, *(control groups, such as a text+edit`nor three checkboxes)
  55. GroupBox2("Settings", "speak,txt1,cCount,ud1,txt2,txt6,guiName", "settings")
  56.  
  57. gui, settings: add, radio, xm y+10 cred checked vmode1 gmode, Odds mode
  58. gui, settings: add, radio, x+m yp cred vmode2 gmode, Order mode
  59. gui, settings: add, text, xm y+m vtxt3, Control* odds:
  60. gui, settings: add, edit, x+m yp-3 w150 r2 vodds, 1 1 1 1 2 2 2 2 3 3 4 5 5 6 6 7 8 9
  61. gui, settings: add, text, xm y+m vtxt4, Control* Order:
  62. gui, settings: add, edit, x+m yp-3 w150 r2 vorder, 1 1 2 2 9 5
  63. gui, settings: add, text, xm y+-1 cgray vtxt5, *(1=edit, 2=button, 3=checkbox, 4=radio, 5=ddl,`n6=combobox 7=hotkey, 8=datetime, 9=Listview)
  64.  
  65. guiControlGet, pos, settings: pos, order
  66. guiControl, settings: move, odds, % "x" posx
  67. GroupBox2("Advanced settings", "mode1,mode2,txt3,odds,txt4,order,txt5", "settings")
  68.  
  69. gui, settings: add, button, xm y+m w200 vgenbtn2 gdoTheStuff, Generate?
  70.  
  71. gui, settings: add, text, ym section, Output:
  72. gui, settings: add, button, x+m ys-3 w20 ghelp, ?
  73.  
  74. gui, settings: font, s10, courier new
  75. gui, settings: add, edit, xs y+m w430 r22 -wrap +hScroll vdisp
  76.  
  77. guiControlGet, pos, settings: pos, disp
  78. guiControlGet, pos2, settings: pos, genbtn2
  79. guiControl, settings: move, disp, % "h" pos2y+pos2h-posy
  80.  
  81. gosub, mode
  82. gui, settings: show, x100 autoSize, % _name_ " - v" _ver_
  83. return
  84.  
  85.  
  86. ; esc:: ; we don't need you either.
  87. ;   critical
  88. ;   exitapp
  89. ; return
  90.  
  91.  
  92. settingsGuiClose: ; you don't like me
  93. settingsGuiEscape: ; you don't like me and you're too lazy to move the mouse
  94.     exitapp
  95. return
  96.  
  97.  
  98. settingsGuiSize: ; big, small, big, small
  99.     guiControlGet, pos, settings: pos, disp
  100.     guiControl, settings: move, disp, % "w" A_GuiWidth-posx-6 " h" A_GuiHeight-posy-6
  101. return
  102.  
  103.  
  104. mode: ; you pressed a radio button, probably
  105.     gui, settings: default
  106.     gui, settings: submit, nohide
  107.     if (mode1=1)
  108.     {
  109.         guiControl, settings: +c0xff0000, txt3
  110.         guiControl, settings: +c0x000000, txt4
  111.     }
  112.     else if (mode2=1)
  113.     {
  114.         guiControl, settings: +c0x000000, txt3
  115.         guiControl, settings: +c0xff0000, txt4
  116.     }
  117.     guiControl, settings: movedraw, txt3 ; update the color
  118.     guiControl, settings: movedraw, txt4 ; update the color
  119. return
  120.  
  121.  
  122. help: ; because you need it
  123.     help=
  124.     (ltrim join`n
  125.     OPTIONS:`tInformation for: gui, add, control, OPTIONS, text
  126.     ---
  127.     x30`tx coordinates (coords) for the control, in pixels
  128.     xm`tPosition the control to the GUIs "margin" (the default spacing)
  129.     x+3`tPosition the control 3 pixels to the right of the previously added control
  130.     xs`tPosition the control at the last controls x-coord that used the keyword "section"
  131.     xp`tPosition the control at the previous added controls x-coord
  132.     xp+3`tPosition the control at the previous added controls x-coord and indent 3 pixels
  133.     y...`tHas all the same options as X, but for Y, obviously
  134.     ---
  135.     w100`tWidth of the control, in pixels
  136.     wp`tUse the previous controls width
  137.     h100`tHeight of the control, in pixels
  138.     hp`tUse the previous controls height
  139.     r1`tSet the control to this many "text rows" tall. 1=1 line, 2=2 lines, etc.
  140.     ---
  141.     vBanana`tControls output variable. This usually contains its value.
  142.     `tYou DO NOT use the "v". Only use "Banana". "Banana" is the variable name.
  143.     `t"v" only tells AHK that "banana is the variable for this control".
  144.     gLabel`tThe label (section of code) to go to when the control is triggered.
  145.     )
  146.     help:=st_columnize(help, "`t")
  147.     msgBox2(help, _name_ " - help", "r20 -wrap +hscroll readonly")
  148. return
  149.  
  150.  
  151. doTheStuff: ; did I stutter?
  152.     critical ; prevent button spamming, because why not.
  153.     gui, genned: destroy ; we don't need that old crap in our gui.
  154.     gui, genned: default
  155.     gui, settings: submit, nohide
  156.    
  157.     ; !!! do not touch !!!
  158.     codeArr:=[] ; raw code and settings
  159.     cArr:=[]    ; the final control strings.
  160.     vList:={}   ; used to generate variable names like banana1, banana2, ...
  161.     gList:={}   ; is this label already in existence?
  162.     odds:=strReplace(odds, ",", " ")   ; repace commas with spaces. lets users use , or space
  163.     order:=strReplace(order, ",", " ") ; repace commas with spaces. lets users use , or space
  164.     odds:=regExReplace(odds, "(\h){2,}", "$1")   ; remove excessive blanks
  165.     order:=regExReplace(order, "(\h){2,}", "$1") ; remove excessive blanks
  166.  
  167.     guiName:=(guiName="") ? "" : guiName ": "
  168.  
  169.     if (speak=1) ; creative variable names at their finest.
  170.         lemons:=ComObjCreate("SAPI.SpVoice"), lemons.rate:=3
  171.    
  172.     if (mode1=1)
  173.     {
  174.         list:=strSplit(odds, " ")
  175.         count:=cCount
  176.     }
  177.     else if (mode2=1)
  178.     {
  179.         list:=strSplit(order, " ")
  180.         count:=list.maxIndex()
  181.     }
  182.    
  183.     ; generate the controls and their settings.
  184.     ; c... = control...
  185.     loop, %count%
  186.     {
  187.         ctext:=texts[rand(texts.maxIndex())]
  188.         clist:=lists[rand(lists.maxIndex())]
  189.         cont:=list[(mode2=1) ? A_Index : rand(list.maxIndex())]
  190.        
  191.         cVar:=genLabelN(ctext)
  192.         cVar:=(cVar="") ? "dummy" : cVar
  193.         cPos:=genPos()
  194.         cwidth:=rand(200,40)
  195.         ; cwidth:=(cwidth<30) ? "" : cwidth
  196.        
  197.         guiOptions:=cPos " w" cwidth " v" cVar
  198.         guiOptions2:=guiOptions " g" cVar
  199.         if (cont=1)
  200.             codeArr.push(addEdit(ctext, 1, guiOptions))
  201.         else if (cont=2)
  202.             codeArr.push(addButton(ctext, guiOptions2))
  203.         else if (cont=3)
  204.             codeArr.push(addCheckbox(ctext, 1, guiOptions2, rand(4,2)))
  205.         else if (cont=4)
  206.             codeArr.push(addCheckbox(ctext, 2, guiOptions2, rand(4,2)))
  207.         else if (cont=5)
  208.             codeArr.push(addEdit(clist, 2, guiOptions2))
  209.         else if (cont=6)
  210.             codeArr.push(addEdit(clist, 3, guiOptions2))
  211.         else if (cont=7)
  212.             codeArr.push(addEdit(ctext, 4, guiOptions))
  213.         else if (cont=8)
  214.             codeArr.push(addEdit(ctext, 5, guiOptions2))
  215.         else if (cont=9)
  216.             codeArr.push(addListview(clist, cPos " w" rand(400,100)
  217.             . " r" rand(15, 5) " vLV" cVar " g" cVar))
  218.     }
  219.    
  220.     ; do some re-formatting to build the gui a bit easier.
  221.     ; probably not needed, but w/e.
  222.     for key, arr in codeArr ; 'split' by the total number of items
  223.     {
  224.         loop, % arr["opts"].maxIndex()
  225.         {
  226.             options:="" ; never forget.
  227.             ctype:=arr["sets", A_Index, "t"] ; control type
  228.             clabel:=arr["sets", A_Index, "l"] ; control label (text)
  229.             for bbb, arr2 in arr["opts", A_Index] ; I really hate doing this 2-for thingy
  230.                 for k, v in arr2
  231.                     if (k="v")
  232.                     {
  233.                         vvar:=trim(v)
  234.                         break, 2
  235.                     }
  236.             if (vList.hasKey(vvar) && vvar!="") ; if this variable aready exists, add 1
  237.                 vList[vvar]+=1
  238.             else if (vvar!="") ; otherwise it's new, set to 1
  239.                 vList[vvar]:=1
  240.             arr["opts", A_Index, bbb, "v"].=vList[vvar] ; because
  241.            
  242.             ; fileAppend, % st_printArr(arr["opts", A_Index]) "`n", *
  243.             for k, arr2 in arr["opts", A_Index] ; I really hate doing this 2-for thingy
  244.                 for k, v in arr2
  245.                     if (trim(v)!="")
  246.                         options.=" " k "" v
  247.             cArr.push({"t":ctype, "l": clabel, "opts":options})
  248.         }
  249.     }
  250.  
  251.     ; build the gui and generate the code
  252.     codeOut:=""
  253.     for k, v in cArr
  254.     {
  255.         t1:=trim(v.t), t2:=trim(v.opts), t3:=trim(v.l) ; the main gui sections.
  256.         t22:=regExReplace(t2, "i)\b[vg]\S+") ; don't create it with a glabel. it'll toss an error. v also isn't needed.
  257.         gui, genned: add, %t1%, %t22%, %t3%
  258.         if (speak=1) ; you figure this out yourself
  259.         {
  260.             gui, genned: show, center autoSize
  261.             lemons.speak(t1)
  262.         }
  263.        
  264.         if (t1="Listview") ; listviews need things inside them.
  265.         {
  266.             loop, % rand(10, 3) ; random amount of things.
  267.             {
  268.                 temp:=A_Index ; the row of the listview
  269.                 LV_Add() ; probably adds a row?
  270.                 loop, % LV_GetCount("column") ; that many.
  271.                     LV_Modify(temp, "col" A_Index, texts[rand(texts.maxIndex())])
  272.             }
  273.             LV_ModifyCol() ; make the columns not tiny.
  274.         }
  275.         codeOut.="gui, " guiName "add, " t1 ", " t2 ", " t3 "`n"
  276.     }
  277.  
  278.     ; sloppy stuff below.
  279.     codeOut:=st_columnize(codeOut, ",", [1,3][rand(2)], " ", ",")
  280.     codeOut.="`n`ngui, " guiName "show,, " _name_ " - v" rand(200) ".0`nreturn"
  281.     guiName2:=strReplace(guiName, ": ")
  282.     temp=
  283.     (ltrim join`n
  284.     `n`n
  285.     `; When you press escape or the [x] button, exit the program
  286.     %guiName2%GuiEscape:
  287.     %guiName2%GuiClose:
  288.     `texitApp
  289.     return
  290.     )
  291.     codeOut.=temp
  292.  
  293.     ; add in the g-labels:
  294.     ; msgBox % "ggg`n" st_printArr(cArr)
  295.     for key, val in cArr
  296.     {
  297.         regExMatch(val["opts"], "i)\b[g](\S+)", o) ; o1 contains the glabel
  298.         if (o1="" || gList.hasKey(o1))
  299.             continue
  300.         gList[o1]:=1 ; this label has now been used. do not add another.
  301.         temp=
  302.         (ltrim join`n
  303.         `n`n
  304.         %o1%:
  305.         `tgui, %guiName%submit, noHide
  306.         `t`; Your code here
  307.         return
  308.         )
  309.         codeOut.=temp
  310.     }
  311.  
  312.     if (speak=1) ; I hope you understand what this means by now...
  313.         lemons.rate:=0, lemons.speak("Your ""G. u. i."" is complete")
  314.    
  315.     guiControl, settings:, disp, %codeOut%
  316.     gui, genned: show, autoSize, % _name_ " - v" rand(200) ".0"
  317.    
  318.     if (speak=1) ; I give up.
  319.     {
  320.         lemons.speak("Copy the code, and study it well, " texts[rand(texts.maxIndex())])
  321.         soundBeep, 750, 345
  322.         lemons.speak("don't forget to thank tidbit!")
  323.     }
  324.     ; msgBox % st_printArr(vList) "`n---`n" st_printArr(codeArr)
  325.     ; msgBox % st_printArr(cArr)
  326. return
  327.  
  328.  
  329. ; 3 1 1 5 3 16 135 1 5 5 8 2 53
  330. rand(max=100, min=1)
  331. {
  332.     random, r, %min%, %max%
  333.     return r
  334. }
  335.  
  336. ; supid position stuff
  337. genPos()
  338. {
  339.     aaa:=rand(100, 1)
  340.     return (aaa<=60) ? "xm"
  341.          : (aaa<=70) ? "x+3 yp"
  342.          : (aaa<=95) ? "xp y+3"
  343.          :             "ym"
  344. }
  345. ; old supid position stuff
  346. ; genPos()
  347. ; {
  348. ;   aaa:=rand(100, 1)
  349. ;   return (aaa<=60) ? {"x":"m" , "y":" "}
  350. ;        : (aaa<=70) ? {"x":"+3", "y":"p"}
  351. ;        : (aaa<=95) ? {"x":"p" , "y":"+3"}
  352. ;        :             {"x":" " , "y":"m"}
  353. ; }
  354.  
  355. ; generate a name for vVar or whatever. remove anything not in the ABCs. Poor ampersand.
  356. genLabelN(N)
  357. {
  358.     if (N="")
  359.         return "Banana"
  360.     return regExReplace(N, "[\W- ]", "")
  361. }
  362.  
  363. ; very sloppy stuff below. I won't bother explaining.
  364. addEdit(labelT="", ctype=1, options="x14 y13 w200 r1")
  365. {
  366.     opts:={}
  367.     opts["opts"]:={}  ; gui options, x, y, w, h, etc
  368.     opts["sets"]:={}  ; gui settings, such as type and display text
  369.     ctype:=(ctype=1) ? "edit"
  370.     : (ctype=2) ? "ddl"
  371.     : (ctype=3) ? "comboBox"
  372.     : (ctype=4) ? "hotkey"
  373.     : "dateTime"
  374.    
  375.     if (ctype="hotkey")
  376.         modifiers:=["!","+","^","!+","^!","!^+","^+"]
  377.         , special:=modifiers[rand(modifiers.maxIndex())] chr(rand(90, 65))
  378.     if (ctype="dateTime")
  379.         modifiers:=["","LongDate","Time","yyyy-MMM-dd","yyyy-dd-MMM"]
  380.         , special:=modifiers[rand(modifiers.maxIndex())]
  381.     ; control 1. the label/text control.
  382.     if (labelT!=""        ; if the label is blank don't create it.
  383.     && ctype!="ddl"       ; ddls don't need a label.
  384.     && ctype!="datetime") ; datetime don't need a label.
  385.     {
  386.         temp:=opts["opts"].push({})
  387.         options2:=RegExReplace(options, "i)\b[wrhg]\S+")
  388.         options2:=RegExReplace(options2, "i)(v\S+)", "vtext")
  389.         for k,v in strSplit(trim(RegExReplace(options2, "(\h)+", "$1")), " ")
  390.             regExMatch(v, "i)\b(hwnd|[xywhrcvg])(\S+)", o) ; these are the GUI options
  391.             , opts["opts", temp].push({"" o1:o2})
  392.            
  393.         opts["sets"].push({"l":(ctype="combobox") ? "List" : labelT, "t":"text"})
  394.  
  395.         ; control 2. the input control to the right
  396.         temp:=opts["opts"].push({})
  397.         options:="x+3 yp-3 " RegExReplace(options, "i)\b[xy]\S+")
  398.         for k,v in strSplit(trim(RegExReplace(options, "(\h)+", "$1")), " ")
  399.             regExMatch(v, "i)\b(hwnd|[xywhrcvg])(\S+)", o) ; these are the GUI options
  400.             , opts["opts", temp].push({"" o1:o2})
  401.        
  402.         opts["sets"].push({"l":(ctype="Edit") ? ""
  403.         : (ctype="Hotkey") ? special
  404.         : labelT
  405.         , "t":ctype})
  406.     }
  407.     else
  408.     {
  409.         temp:=opts["opts"].push({})
  410.         for k,v in strSplit(trim(RegExReplace(options, "(\h)+", "$1")), " ")
  411.             regExMatch(v, "i)\b(hwnd|[xywhrcvg])(\S+)", o) ; these are the GUI options
  412.             , opts["opts", temp].push({"" o1:o2})
  413.    
  414.         opts["sets"].push({"l":(ctype="edit") ? "List"
  415.         : (ctype="dateTime") ? special
  416.         : labelT
  417.         , "t":ctype})
  418.     }
  419.     ; msgBox % st_printArr(opts)
  420.     return opts
  421. }
  422.  
  423. ; use your imagination.
  424. addButton(labelT="Button", options="x14 y13 w200 r1")
  425. {
  426.     opts:={}
  427.     opts["opts"]:={}  ; gui options, x, y, w, h, etc
  428.     opts["sets"]:={}  ; gui settings, such as type and display text
  429.  
  430.     temp:=opts["opts"].push({})
  431.     for k,v in strSplit(trim(RegExReplace(options, "(\h)+", "$1")), " ")
  432.         regExMatch(v, "i)\b(hwnd|[xywhrcvg])(\S+)", o) ; these are the GUI options
  433.         , opts["opts", temp].push({"" o1:o2})
  434.    
  435.     opts["sets"].push({"l":labelT, "t":"button"})
  436.     return opts
  437. }
  438.  
  439. ; checkbox, radio
  440. addCheckbox(labelT="aaa", ctype=1, options="x14 y13 w200 r1", count=3)
  441. {
  442.     opts:={}
  443.     opts["opts"]:={}  ; gui options, x, y, w, h, etc
  444.     opts["sets"]:={}  ; gui settings, such as type and display text
  445.     labelT:=(trim(labelT)="") ? "dummy" : labelT
  446.     ctype:=(ctype=1) ? "checkbox" : "radio"
  447.     aaa:=rand(3,1)=1
  448.    
  449.     loop, %count%
  450.     {
  451.         bbb:=A_Index ; super usful variable name. atleast it's easy to identify
  452.         options:=RegExReplace(options, "i)\b[wrh]\S+") ; just let them auto-size themselves.
  453.        
  454.          ; first control of the group dictates the starting position
  455.          ; which is the initial Options. we don't need to modify them.
  456.         temp:=opts["opts"].push({}) ; this var name isn't so helpful. deal with it
  457.         if (bbb!=1)
  458.         {
  459.             if  (aaa=1) ; horizontal list, less chance
  460.                 options:=" x+3 yp " RegExReplace(options, "i)\b[xy]\S+")
  461.             else ; vertical list
  462.                 options:=" xp y+3 " RegExReplace(options, "i)\b[xy]\S+")
  463.         }
  464.         options:=trim(RegExReplace(options, "(\h)+", "$1"))
  465.         for k,v in strSplit(options, " ")
  466.             regExMatch(v, "i)\b(hwnd|[xywhrcvg])(\S+)", o)
  467.             , opts["opts", temp].push({"" o1:o2})
  468.         opts["sets"].push({"l":labelT " " bbb, "t":ctype})
  469.     }  
  470.     ; msgBox % st_printArr(opts)
  471.     return opts
  472. }
  473.  
  474. ; Listview. pretty much identical code to Button. should have just combined them. boohoo.
  475. addListview(labelT="Header1|Header2|Header3", options="x14 y13 w200 r15")
  476. {
  477.     opts:={}
  478.     opts["opts"]:={}  ; gui options, x, y, w, h, etc
  479.     opts["sets"]:={}  ; gui settings, such as type and display text
  480.  
  481.     temp:=opts["opts"].push({})
  482.     for k,v in strSplit(trim(RegExReplace(options, "(\h)+", "$1")), " ")
  483.         regExMatch(v, "i)\b(hwnd|[xywhrcvg])(\S+)", o) ; these are the GUI options
  484.         , opts["opts", temp].push({"" o1:o2})
  485.    
  486.     opts["sets"].push({"l":labelT, "t":"listView"})
  487.     return opts
  488. }
  489.  
  490. ; really old function made by tidbit.
  491. msgbox2(text="", title="Msgbox", options="readonly -wrap w300 r12", ctrl="edit")
  492. {
  493.     static
  494.     Gui, msgbox: New
  495.     Gui, font,, Courier New
  496.     Gui, +OwnDialogs +hwndMBHWND
  497.     Gui, add, %ctrl%, %options% -wantReturn, %text%
  498.     GuiControlGet, x, Pos, %ctrl%1
  499.     xw:=xw-70+xx
  500.     Gui, add, button, x%xw% y+10 w70 Default vbtn gMB2OK, OK
  501.     GuiControl, focus, btn
  502.     Gui, show,, %title%
  503.     WinWaitClose, ahk_id %MBHWND%
  504.  
  505.     msgboxGUIEscape:
  506.     msgboxGUIClose:
  507.     MB2OK:
  508.         gui,  Destroy
  509.     Return
  510. }
  511.  
  512. ; really really old function made by tidbit.
  513. GroupBox2(Text, Controls, GuiName=1, Offset="0,0", Padding="3,3,3,3", TitleHeight=15)
  514. {
  515.    static
  516.    xx:=yy:=ww:=hh:=PosX:=PosY:=PosW:=PosH:=0
  517.    StringSplit, Padding, Padding, `,
  518.    StringSplit, Offset, Offset, `,
  519.    loop, parse, Controls, `,
  520.    {
  521.       LoopField:=trim(A_LoopField)
  522.       guiControlGet, Pos, %GuiName%: Pos, %LoopField%
  523.       if (A_Index=1)
  524.          xx:=PosX, yy:=PosY, ww:=PosX+PosW, hh:=PosY+PosH
  525.       xx:=((xx<PosX) ? xx : PosX)
  526.       yy:=((yy<PosY) ? yy : PosY)
  527.       ww:=((ww>PosX+PosW) ? ww : PosX+PosW)
  528.       hh:=((hh>PosY+PosH) ? hh : PosY+PosH)
  529.       guiControl, %GuiName%: Move, %LoopField%, % "x" PosX+Padding1+Offset1 " y" PosY+Padding3+Offset2+titleHeight
  530.    }
  531.    xx+=Offset1
  532.    yy+=Offset2
  533.    ww+=Padding1+Padding2+Offset1-xx
  534.    hh+=Padding3+Padding4+titleHeight+Offset2-yy
  535.    counter+=1
  536.    UID:="GB" GUIName counter xx yy ww hh
  537.    status := GroupBox2_Add(guiname, xx, yy, ww, hh, uid, text)
  538.    Return (status == true ? [uid,xx,yy,ww,hh] : false)
  539. }
  540. GroupBox2_Add(guiname, xx, yy, ww, hh, uid, text) {
  541.     Global
  542.     Gui, %GuiName%: add, GroupBox, x%xx% y%yy% w%ww% h%hh% v%UID%, %Text%
  543.     return (errorlevel == 0 ? true : false)
  544. }
  545.  
  546. ; used for debugging. it's a major life-saver
  547. ; Lexikos or someone needs to add something like this built-in to ahk :P
  548. st_printArr(array, depth=5, indentLevel="")
  549. {
  550.    for k,v in Array
  551.    {
  552.       list.= indentLevel "[" k "]"
  553.       if (IsObject(v) && depth>1)
  554.          list.="`n" st_printArr(v, depth-1, indentLevel . "    ")
  555.       Else
  556.          list.=" => " v
  557.       list.="`n"
  558.    }
  559.    return rtrim(list, "`r`n `t")
  560. }
  561.  
  562. ; ; old function made by tidbit. pretty helpful. quite long. probably not the best.
  563. st_columnize(data, delim="csv", justify=1, pad=" ", colsep=" | ")
  564. {      
  565.     widths:=[]
  566.     dataArr:=[]
  567.    
  568.     if (instr(justify, "|"))
  569.         colMode:=strsplit(justify, "|")
  570.     else
  571.         colMode:=justify
  572.     ; make the arrays and get the total rows and columns
  573.     loop, parse, data, `n, `r
  574.     {
  575.         if (A_LoopField="")
  576.             continue
  577.         row:=A_Index
  578.        
  579.         if (delim="csv")
  580.         {
  581.             loop, parse, A_LoopField, csv
  582.             {
  583.                 dataArr[row, A_Index]:=A_LoopField
  584.                 if (dataArr.maxindex()>maxr)
  585.                     maxr:=dataArr.maxindex()
  586.                 if (dataArr[A_Index].maxindex()>maxc)
  587.                     maxc:=dataArr[A_Index].maxindex()
  588.             }
  589.         }
  590.         else
  591.         {
  592.             dataArr[A_Index]:=strsplit(A_LoopField, delim)
  593.             if (dataArr.maxindex()>maxr)
  594.                 maxr:=dataArr.maxindex()
  595.             if (dataArr[A_Index].maxindex()>maxc)
  596.                 maxc:=dataArr[A_Index].maxindex()
  597.         }
  598.     }
  599.     ; get the longest item in each column and store its length
  600.     loop, %maxc%
  601.     {
  602.         col:=A_Index
  603.         loop, %maxr%
  604.             if (strLen(dataArr[A_Index, col])>widths[col])
  605.                 widths[col]:=strLen(dataArr[A_Index, col])
  606.     }
  607.     ; the main goodies.
  608.     loop, %maxr%
  609.     {
  610.         row:=A_Index
  611.         loop, %maxc%
  612.         {
  613.             col:=A_Index
  614.             stuff:=dataArr[row,col]
  615.             len:=strlen(stuff)
  616.             difference:=abs(strlen(stuff)-widths[col])
  617.  
  618.             ; generate a repeating string about the length of the longest item
  619.             ; in the column.
  620.             loop, % ceil(widths[col]/((strlen(pad)<1) ? 1 : strlen(pad)))
  621.                 padSymbol.=pad
  622.  
  623.             if (isObject(colMode))
  624.                 justify:=colMode[col]
  625.             ; justify everything correctly.
  626.             ; 3 = center, 2= right, 1=left.
  627.             if (strlen(stuff)<widths[col])
  628.             {
  629.                 if (justify=3)
  630.                     stuff:=SubStr(padSymbol, 1, floor(difference/2)) . stuff
  631.                     . SubStr(padSymbol, 1, ceil(difference/2))
  632.                 else
  633.                 {
  634.                     if (justify=2)
  635.                         stuff:=SubStr(padSymbol, 1, difference) stuff
  636.                     else ; left justify by default.
  637.                         stuff:= stuff SubStr(padSymbol, 1, difference)
  638.                 }
  639.             }
  640.             out.=stuff ((col!=maxc) ? colsep : "")
  641.         }
  642.         out:=trim(out) "`r`n"
  643.         ; out.="`r`n"
  644.     }
  645.     stringTrimRight, out, out, 2 ; remove the last blank newline
  646.     return out
  647. }
  648.  
  649. ; hope you enjoyed the random babbling.
  650. ; enjoy.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement