November 25, 2020, 05:17:23 AM

Author Topic: [bmx] Property Editor by JoshK [ 1+ years ago ]  (Read 670 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Property Editor by JoshK [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : Property Editor
Author : JoshK
Posted : 1+ years ago

Description : Get the images here:
<a href="http://www.leadwerks.com/post/PropertyGrid.zip" target="_blank">http://www.leadwerks.com/post/PropertyGrid.zip[/url]


Code :
Code: BlitzMax
  1. Strict
  2.  
  3. Import maxgui.maxgui
  4. Import brl.eventqueue
  5. Import brl.retro
  6. Import brl.tgaloader
  7. Import brl.bmploader
  8. ?win32
  9. Import pub.win32
  10. ?
  11.  
  12. Rem
  13.  
  14. Import maxgui.drivers
  15.  
  16. Local window:TGadget
  17.  
  18. window=CreateWindow("Properties",40,40,360,400,Null,WINDOW_TITLEBAR|WINDOW_CENTER|WINDOW_RESIZABLE|WINDOW_HIDDEN)
  19.  
  20. Local grid:TPropertyGrid=TPropertyGrid.Create(0,0,,,window)
  21. SetGadgetLayout grid,1,1,1,1
  22. Local group:TPropertyGroup
  23.  
  24. group=grid.AddGroup("Settings")
  25. group.AddProperty("String","Hello!")
  26. group.AddProperty("Integer","3",PROPERTY_INTEGER,"Edit the integer")
  27. group.AddProperty("Float","1",PROPERTY_FLOAT,"This is a float")
  28. group.AddProperty("Boolean","1",PROPERTY_BOOL,"Toggle this on and off")
  29. group.AddProperty("Choice","1|A,B,C,D",PROPERTY_CHOICE,"Choose your destiny")
  30. group.expand()
  31.  
  32. group=grid.AddGroup("More Settings")
  33. group.AddProperty("Integer with range","3|3,10",PROPERTY_INTEGER,"Edit the integer")
  34. group.AddProperty("Float with range","0.63|0.5,1.0,10",PROPERTY_FLOAT,"This is a float")
  35. group.AddProperty("High-res float","0.63|0.5,1.0,100",PROPERTY_FLOAT,"This is a float")
  36. group.AddProperty("File","C:MyFile.bmp|Text Files (*.txt):txt;Windows Bitmap (*.bmp):bmp",PROPERTY_FILE,"This file does something")
  37. group.AddProperty("Folder","C:",PROPERTY_PATH,"This folder is used for something")
  38. group.AddProperty("Color","255,0,0",PROPERTY_COLOR,"Choose a color")
  39. group.AddProperty("Editable Choice","Candle|Pulse,Candle,Strobe,Flame",PROPERTY_CHOICEEDIT,"Sets the light style:~nStrobe - turns on and off quickly~n2blinking - blinks~n3pulse - gentle intensity pulse~n4candle - firelight flicker")
  40. group.AddProperty("Vector2","1.0,2.0,3.0,4.0",PROPERTY_VEC2,"Sets the position")
  41. group.AddProperty("Vector3","1.0,2.0,3.0,4.0",PROPERTY_VEC3,"Sets the position")
  42. group.AddProperty("Vector4","1.0,2.0,3.0,4.0",PROPERTY_VEC4,"Sets the position")
  43.  
  44. group.sort()
  45.  
  46. ShowGadget window
  47.  
  48. While True
  49.         WaitEvent
  50.         Print CurrentEvent.tostring()
  51.         Select EventID()
  52.                 Case EVENT_WINDOWCLOSE
  53.                         End
  54.         EndSelect
  55. Wend
  56.  
  57. EndRem
  58.  
  59. Incbin "header.tga"
  60. Incbin "header2.tga"
  61. Incbin "tree.bmp"
  62. Incbin "folder.tga"
  63. Incbin "border.tga"
  64.  
  65.  
  66. Type TPropertyGrid Extends TProxyGadget {expose}
  67.        
  68.         Const headerheight:Int=20
  69.         Const headerspacer:Int=0
  70.         Const sliderwidth:Int=18
  71.         Const treeimagebottompadding:Int=14
  72.        
  73.         Global list:TList=New TList
  74.         Global background:Int[]=[255,255,255]
  75.         Global headercolor:Int[]=[128,128,128]
  76.         Global color_headertext:Int[]=[255,255,255]
  77.         Global color_headertexthover:Int[]=[150,150,150]
  78.         Global color_itemtext:Int[]=[0,0,0]
  79.         Global color_selecteditemtext:Int[]=[0,0,255]
  80.        
  81.         Field slider:TGadget
  82.         Field groups:TList=New TList
  83.         Field panel:TGadget
  84.         Field sections:TMap=New TMap
  85.         Field currentitem:TProperty
  86.         Field font:TGUIFont
  87.         Field properties:TMap=New TMap
  88.  
  89.         Method Collapse()
  90.                 For Local propertygroup:Tpropertygroup=EachIn sections.values()
  91.                         propertygroup.Collapse(0)
  92.                 Next
  93.                 AdjustLayout()
  94.         EndMethod
  95.        
  96.         Method Expand()
  97.                 For Local propertygroup:Tpropertygroup=EachIn sections.values()
  98.                         propertygroup.Expand(0)
  99.                 Next
  100.                 AdjustLayout()
  101.         EndMethod
  102.        
  103.         Method Combine(combiner:TPropertyGrid,update=1)
  104.                 Local item:TProperty[2]
  105.                 Local key$
  106.                 For Local gs:TPropertyGroup=EachIn groups
  107.                         If Not gs.hidden
  108.                                 If combiner.sections.valueforkey(gs.name)=Null
  109.                                         gs.hide(0)
  110.                                 Else
  111.                                         For item[0]=EachIn gs.items
  112.                                                 If Not item[0].hidden
  113.                                                         key=item[0].name.tolower()
  114.                                                         item[1]=TProperty(combiner.properties.valueforkey(key))
  115.                                                         If Not item[1]
  116.                                                                 item[0].hide(0)
  117.                                                         Else
  118.                                                                 If item[0].style<>item[1].style Or item[0].extra<>item[1].extra Or item[0].range[0]<>item[1].range[0] Or item[0].range[1]<>item[1].range[1] Or item[0].flags<>item[1].flags Or item[0].group.name<>item[1].group.name
  119.                                                                         item[0].hide(0)
  120.                                                                 EndIf
  121.                                                         EndIf
  122.                                                 EndIf
  123.                                         Next
  124.                                 EndIf
  125.                         EndIf
  126.                 Next
  127.                 'slower
  128.                 Rem
  129.                 For key=EachIn properties.keys()
  130.                         item[0]=TProperty(properties.valueforkey(key))
  131.                         item[1]=TProperty(combiner.properties.valueforkey(key))
  132.                         If Not item[1]
  133.                                 item[0].hide(0)
  134.                         Else
  135.                                 If item[0].style<>item[1].style Or item[0].extra<>item[1].extra Or item[0].range[0]<>item[1].range[0] Or item[0].range[1]<>item[1].range[1] Or item[0].flags<>item[1].flags Or item[0].group.name<>item[1].group.name
  136.                                         item[0].hide(0)
  137.                                         Continue
  138.                                 EndIf
  139.                         EndIf
  140.                 Next
  141.                 EndRem
  142.                 If update AdjustLayout()
  143.         EndMethod
  144.  
  145.         Method SetFont(font:TGUIFont)
  146.                 Self.font=font
  147.                 For Local propertygroup:Tpropertygroup=EachIn sections.values()
  148.                         propertygroup.SetFont(font)
  149.                 Next
  150.         EndMethod
  151.  
  152.         Method New()
  153.                 headerpixmap[0]=LoadPixmap("incbin::header.tga")
  154.                 headerpixmap[1]=LoadPixmap("incbin::header2.tga")
  155.         EndMethod
  156.        
  157.         Method SetProperty(name:String,value:String)
  158.                 Local property:TProperty
  159.                 name=name.tolower()
  160.                 property=TProperty(properties.valueforkey(name))
  161.                 If property property.setvalue(value)
  162.         EndMethod
  163.  
  164.         Method GetProperty:String(name:String,defaultvalue:String="")
  165.                 Local property:TProperty
  166.                 name=name.tolower()
  167.                 property=TProperty(properties.valueforkey(name))
  168.                 If property.hidden Or property.group.hidden Or property.undetermined property=Null
  169.                 If property Return property.value Else Return defaultvalue
  170.         EndMethod
  171.  
  172.         Method Cleanup()
  173.                 For Local propertygroup:Tpropertygroup=EachIn sections.values()
  174.                         propertygroup.Free()
  175.                 Next
  176.                 FreeGadget slider
  177.                 FreeGadget panel
  178.                 sections.clear()
  179.                 currentitem=Null
  180.                 Super.cleanup
  181.         EndMethod
  182.        
  183.         Rem
  184.         Method Load:Int(url:Object)
  185.                 Local stream:TStream=ReadStream(url)
  186.                 If Not stream Return False
  187.                 Local s:String
  188.                 Local group:TPropertyGroup
  189.                 Local sarr:String[]
  190.                 While Not stream.Eof()
  191.                         s=stream.ReadLine().Trim()
  192.                         If s
  193.                                 sarr=s.split("//")
  194.                                 s=sarr[0]
  195.                                 If s
  196.                                         If s[0]=Asc("[")
  197.                                                 s=s[1..s.length-1].Trim()
  198.                                                 group=AddGroup(s)
  199.                                         Else
  200.                                                 If group
  201.                                                         sarr=s.split("\")
  202.                                                         sarr=sarr[..6]
  203.                                                         Local class:Int
  204.                                                         Select sarr[2].tolower().Trim()
  205.                                                                 Case "","string" class=PROPERTY_STRING
  206.                                                                 Case "float" class=PROPERTY_FLOAT
  207.                                                                 Case "integer" class=PROPERTY_INTEGER
  208.                                                                 Case "file" class=PROPERTY_FILE
  209.                                                                 Case "path" class=PROPERTY_PATH
  210.                                                                 Case "color" class=PROPERTY_COLOR
  211.                                                                 Case "bool" class=PROPERTY_BOOL
  212.                                                                 Case "choice" class=PROPERTY_CHOICE
  213.                                                                 Case "choiceedit" class=PROPERTY_choiceedit
  214.                                                                 Case "vector2" class=PROPERTY_VEC2
  215.                                                                 Case "vector3" class=PROPERTY_VEC3
  216.                                                                 Case "vector4" class=PROPERTY_VEC4
  217.                                                         EndSelect
  218.                                                         group.addproperty(sarr[0].Trim(),sarr[1].Trim(),class,sarr[3].Trim(),Int(sarr[4]),sarr[5].Trim())
  219.                                                 EndIf
  220.                                         EndIf
  221.                                 EndIf
  222.                         EndIf
  223.                 Wend
  224.                 stream.close()
  225.                 Return True
  226.         EndMethod
  227.         EndRem
  228.        
  229.         Method Clear()
  230.                 For Local gs:TPropertyGroup=EachIn sections.values()
  231.                         gs.free()
  232.                 Next
  233.         EndMethod
  234.        
  235.         Function Create:TPropertyGrid(x=0,y=0,width=-1,height=-1,group:TGadget)
  236.                 Local grid:TPropertyGrid=New TPropertyGrid
  237.                 If width=-1 width=group.ClientWidth()-x
  238.                 If height=-1 height=group.ClientHeight()-y
  239.                 grid.panel=CreatePanel(x,y,width,height,group)
  240.                 grid.SetProxy(grid.panel)
  241.                 AddHook EmitEventHook, eventHandler, Null, 1
  242.                 list.addlast(grid)
  243.                 grid.slider=CreateSlider(grid.panel.ClientWidth()-sliderwidth,0,sliderwidth,grid.panel.ClientHeight(),grid.panel)
  244.                 SetGadgetLayout grid.slider,0,1,1,1
  245.                 SetGadgetColor grid.panel,background[0],background[1],background[2]
  246.                 Return grid
  247.         EndFunction
  248.        
  249.         Method AddGroup:TPropertyGroup(name:String)
  250.                 Local gs:TPropertyGroup=New TPropertyGroup
  251.                 gs.header=CreatePanel(0,0,panel.ClientWidth(),headerheight,panel,PANEL_ACTIVE)
  252.                 SetGadgetPixmap gs.header,LoadPixmap("incbin::border.tga")
  253.                 SetGadgetLayout gs.header,1,1,1,0
  254.                 SetPanelColor gs.header,headercolor[0],headercolor[1],headercolor[2]
  255.                 gs.headerlabel=CreateLabel(name,headerheight,2,gs.header.ClientWidth()-headerheight,20,gs.header)
  256.                 If font SetGadgetFont gs.headerlabel,font
  257.                 SetGadgetColor gs.headerlabel,color_headertext[0],color_headertext[1],color_headertext[2],0
  258.                 SetGadgetLayout gs.headerlabel,1,1,1,0
  259.                 gs.panel=CreatePanel(0,20,panel.ClientWidth(),2,panel)
  260.                 SetGadgetLayout gs.panel,1,1,1,0
  261.                 gs.grid=Self
  262.                 gs.link=groups.addlast(gs)
  263.                 sections.insert(name,gs)
  264.  
  265.                 gs.name=name
  266.  
  267.                 gs.sidepanel=CreatePanel(0,0,TPropertyGroup.itemheight,gs.panel.height,gs.panel)
  268.                 HideGadget gs.sidepanel
  269.                 SetGadgetPixmap gs.sidepanel,LoadPixmap("incbin::tree.bmp")
  270.                 SetGadgetLayout gs.sidepanel,1,1,1,1
  271.                
  272.                 SetPanelColor gs.panel,background[0],background[1],background[2]
  273.                
  274.                 gs.imagepanel=CreatePanel(0,0,headerheight,headerheight,gs.header,PANEL_ACTIVE)        
  275.                 SetGadgetPixmap gs.imagepanel,headerpixmap[0]
  276.                 SetGadgetLayout gs.imagepanel,1,0,1,0
  277.                 SetPanelColor gs.imagepanel,headercolor[0],headercolor[1],headercolor[2]
  278.                
  279.                 SetGadgetSensitivity gs.headerlabel,SENSITIZE_MOUSE
  280.                
  281.                 AdjustLayout()
  282.                 Return gs
  283.         EndMethod
  284.        
  285.         Method CalcHeight:Int()
  286.                 Local gs:TPropertyGroup
  287.                 Local y:Int=0
  288.                 For gs=EachIn sections.values()
  289.                         If Not gs.hidden
  290.                                 If gs.collapsed
  291.                                         y:+headerheight+headerspacer
  292.                                 Else
  293.                                         y:+headerheight+gs.y
  294.                                 EndIf
  295.                         EndIf
  296.                 Next
  297.                 Return y
  298.         EndMethod
  299.        
  300.         Method Sort()
  301.                 Local gs:TPropertyGroup
  302.                 For gs=EachIn sections.values()
  303.                         gs.sort()
  304.                 Next
  305.         EndMethod
  306.  
  307.         Method ShowAll(update=1)
  308.                 Local gs:TPropertyGroup
  309.                 For gs=EachIn groups
  310.                         gs.showall()
  311.                 Next
  312.                 If update AdjustLayout()
  313.         EndMethod
  314.        
  315.         Field slidermode:Int=1
  316.        
  317.         Field headerpixmap:TPixmap[2]
  318.        
  319.         Method AdjustLayout(items:Int=True)
  320.                 Local x:Int
  321.                 Local y:Int
  322.                 Local h:Int
  323.                
  324.                 h=CalcHeight()
  325.                 If h>panel.ClientHeight()
  326.                         SetSliderRange slider,panel.ClientHeight(),h
  327.                         If slidermode<>1
  328.                                 slidermode=1
  329.                                 items=True
  330.                                 ShowGadget slider
  331.                         EndIf
  332.                 Else
  333.                         If slidermode<>0
  334.                                 slidermode=0
  335.                                 items=True
  336.                                 HideGadget slider
  337.                                 SetSliderValue slider,0
  338.                         EndIf
  339.                 EndIf
  340.                 If slidermode
  341.                         y=-SliderValue(slider)
  342.                 EndIf
  343.                 If items
  344.                         For Local gs:TPropertyGroup=EachIn groups
  345.                                 If gs.hidden
  346.                                         HideGadget gs.header
  347.                                         HideGadget gs.panel
  348.                                 Else
  349.                                         SetGadgetShape gs.header,0,y,panel.ClientWidth(),headerheight
  350.                                         If gs.collapsed
  351.                                                 SetGadgetPixmap gs.imagepanel,headerpixmap[0]
  352.                                                 HideGadget gs.panel
  353.                                                 y:+headerheight+headerspacer
  354.                                         Else
  355.                                                 SetGadgetPixmap gs.imagepanel,headerpixmap[1]
  356.                                                 SetGadgetShape gs.panel,0,y+headerheight,panel.ClientWidth()-sliderwidth*slidermode,gs.y
  357.                                                 gs.AdjustLayout()
  358.                                                 ShowGadget gs.panel
  359.                                                 y:+headerheight+gs.panel.height
  360.                                                 ShowGadget gs.panel
  361.                                         EndIf
  362.                                         ShowGadget gs.header
  363.  
  364.                                 EndIf
  365.                                 SetGadgetShape(gs.sidepanel,0,0,gs.itemheight,gs.panel.height-treeimagebottompadding)
  366.                                 SetGadgetLayout gs.sidepanel,1,0,1,1
  367.                         Next
  368.                 EndIf
  369.         EndMethod
  370.        
  371.         Function GadgetWindow:TGadget(gadget:TGadget)
  372.                 While gadget
  373.                         gadget=GadgetGroup(gadget)
  374.                         If GadgetClass(gadget)=GADGET_WINDOW Return gadget
  375.                 Wend
  376.                 Return Null
  377.         EndFunction
  378.        
  379.         Function GadgetHasParent:Int(gadget:TGadget,parent:TGadget)
  380.                 While gadget
  381.                         gadget=GadgetGroup(gadget)
  382.                         If gadget=parent Return True
  383.                 Wend
  384.                 Return False
  385.         EndFunction
  386.        
  387.         Function eventHandler:Object( pID%, pData:Object, pContext:Object )
  388.                 Local event:TEvent = TEvent(pData)
  389.                
  390.                 If event
  391.                         Local grid:TPropertyGrid
  392.                         Local gs:TPropertyGroup
  393.                         Local gi:TProperty
  394.                        
  395.                         For grid=EachIn TPropertyGrid.list
  396.                                 If Not GadgetHidden(grid)
  397.                                         If event.id=EVENT_WINDOWSIZE' Or event.id=EVENT_GADGETSHOW
  398.                                                 If GadgetWindow(grid.panel)=event.source
  399.                                                         grid.AdjustLayout(0)
  400.                                                         Return event
  401.                                                 EndIf
  402.                                         EndIf
  403.                                        
  404.                                         If GadgetHasParent(TGadget(event.source),grid.panel)
  405.                                        
  406.                                                 If event.source=grid.slider
  407.                                                         grid.AdjustLayout()
  408.                                                         Return event
  409.                                                 EndIf
  410.                                                
  411.                                                 For gs=EachIn grid.groups
  412.                                                        
  413.                                                         If gs.imagepanel=event.source Or gs.header=event.source Or gs.headerlabel=event.source
  414.                                                                 Return gs.EventHook(event)
  415.                                                         EndIf
  416.                                                         If Not gs.collapsed
  417.                                                                 If Not gs.hidden
  418.                                                                         If GadgetHasParent(TGadget(event.source),gs.panel)
  419.                                                                                 For gi=EachIn gs.items
  420.                                                                                         If Not gi.hidden
  421.                                                                                                 If gi.control=event.source Or gi.control2=event.source Or gi.helper[0]=event.source
  422.                                                                                                         Return gi.eventhook(event,grid)
  423.                                                                                                 EndIf
  424.                                                                                         EndIf
  425.                                                                                 Next
  426.                                                                         EndIf
  427.                                                                 EndIf
  428.                                                         EndIf
  429.                                                 Next
  430.                                                
  431.                                         EndIf
  432.                                 EndIf
  433.                         Next
  434.                 EndIf
  435.                
  436.                 Return pData
  437.         EndFunction
  438.        
  439. EndType
  440.  
  441. Const PROPERTY_STRING=0
  442. Const PROPERTY_CHOICE=1
  443. Const PROPERTY_CHOICEEDIT=2
  444. Const PROPERTY_INTEGER=3
  445. Const PROPERTY_FLOAT=4
  446. Const PROPERTY_BOOL=5
  447. Const PROPERTY_FILE=6
  448. Const PROPERTY_PATH:Int=7
  449. Const PROPERTY_COLOR:Int=8
  450. Const PROPERTY_VEC2:Int=9
  451. Const PROPERTY_VEC3:Int=10
  452. Const PROPERTY_VEC4:Int=11
  453.  
  454. Type TPropertyGroup {expose}
  455.  
  456.         Const labelwidth:Int=100
  457.         Const itemheight:Int=20
  458.         Const indent:Int=itemheight
  459.         Const itemspacing:Int=2
  460.         Const numberitemspacing:Int=50
  461.         Const numberitemsliderwidth:Int=12
  462.        
  463.         Field link:TLink
  464.         Field items:TList=New TList
  465.         Field grid:TPropertyGrid
  466.         Field headerlabel:TGadget
  467.         Field imagepanel:TGadget
  468.         Field header:TGadget
  469.         Field panel:TGadget
  470.         Field sidepanel:TGadget
  471.         Field x:Int=0
  472.         Field y:Int=itemspacing
  473.         Field h:Int=2
  474.         Field collapsed:Int=1
  475.         Field enterevents:Int
  476.         Field name:String
  477.         Field hidden:Int
  478.        
  479.         Method hide(update=1)
  480.                 hidden=True
  481.                 If update grid.AdjustLayout()
  482.         EndMethod
  483.        
  484.         Method ShowAll()
  485.                 show(0)
  486.                 For Local item:TProperty=EachIn items
  487.                         item.show(0)
  488.                 Next
  489.         EndMethod
  490.        
  491.         Method Show(update=1)
  492.                 hidden=False
  493.                 If update grid.AdjustLayout()
  494.         EndMethod
  495.        
  496.         Method Free()
  497.                 For Local item:TProperty=EachIn items
  498.                         item.free()
  499.                 Next
  500.                 FreeGadget imagepanel
  501.                 FreeGadget sidepanel
  502.                 FreeGadget panel
  503.                 FreeGadget header      
  504.                 If grid.sections.valueforkey(name)=Self
  505.                         grid.sections.remove(name)
  506.                 EndIf
  507.                 If link
  508.                         link.remove()
  509.                         link=Null
  510.                 EndIf
  511.                 items.clear()
  512.                 grid.AdjustLayout()
  513.                 grid=Null
  514.         EndMethod
  515.  
  516.         Method SetFont(font:TGUIFont)
  517.                 SetGadgetFont headerlabel,font
  518.                 For Local item:TProperty=EachIn items
  519.                         item.setfont(font)
  520.                 Next
  521.         EndMethod
  522.  
  523.         Method Sort()
  524.                 Local y:Int=itemspacing
  525.                 SortList(items)
  526.                 AdjustLayout()
  527.         EndMethod
  528.        
  529.         Method AdjustLayout()
  530.                 Local y:Int=itemspacing
  531.                 Local n:Int
  532.                 Local count:Int
  533.                 count=items.count()
  534.                 For Local item:TProperty=EachIn items
  535.                         If item.hidden
  536.                                 HideGadget item.label
  537.                                 HideGadget item.control
  538.                                 If item.control2 HideGadget item.control2
  539.                                 If item.helper[0] HideGadget item.helper[0]
  540.                                 If item.helper[1] HideGadget item.helper[1]
  541.                         Else
  542.                                 SetGadgetShape item.label,GadgetX(item.label),y,GadgetWidth(item.label),GadgetHeight(item.label)
  543.                                 SetGadgetShape item.control,GadgetX(item.control),y,GadgetWidth(item.control),GadgetHeight(item.control)
  544.                                 If item.control2
  545.                                         SetGadgetShape item.control2,GadgetX(item.control2),y,GadgetWidth(item.control2),GadgetHeight(item.control2)
  546.                                 EndIf
  547.                                 If item.helper[0]
  548.                                         SetGadgetShape item.helper[0],GadgetX(item.helper[0]),y,GadgetWidth(item.helper[0]),GadgetHeight(item.helper[0])
  549.                                 EndIf
  550.                                 ShowGadget item.label
  551.                                 ShowGadget item.control
  552.                                 If item.control2 ShowGadget item.control2
  553.                                 If item.helper[0] ShowGadget item.helper[0]
  554.                                 If item.helper[1] ShowGadget item.helper[1]
  555.                                 y:+itemheight+itemspacing
  556.                                 n:+1
  557.                         EndIf
  558.                 Next
  559.                 SetGadgetShape panel,panel.xpos,panel.ypos,panel.width,y
  560.                 'SetPanelColor panel,255,0,0
  561.         EndMethod
  562.        
  563.         'Method UpdateColor()
  564.         '       If enterevents>0
  565.         '               SetGadgetColor headerlabel,grid.color_headertexthover[0],grid.color_headertexthover[1],grid.color_headertexthover[2],0
  566.         '       Else
  567.         '               SetGadgetColor headerlabel,grid.color_headertext[0],grid.color_headertext[1],grid.color_headertext[2],0
  568.         '       EndIf
  569.         'EndMethod
  570.        
  571.         Method EventHook:TEvent( event:TEvent )
  572.                 Select event.id
  573.                         'Case EVENT_MOUSELEAVE
  574.                         '       enterevents:-1
  575.                         '       UpdateCOlor
  576.                         'Case EVENT_MOUSEENTER
  577.                         '       enterevents:+1
  578.                         '       UpdateColor
  579.                         Case EVENT_MOUSEDOWN
  580.                                 SetGadgetColor imagepanel,grid.color_headertexthover[0],grid.color_headertexthover[1],grid.color_headertexthover[2],1
  581.                                 SetGadgetColor header,grid.color_headertexthover[0],grid.color_headertexthover[1],grid.color_headertexthover[2],1
  582.                                 Return Null
  583.                         Case EVENT_MOUSEUP
  584.                                 toggle()
  585.                                 SetGadgetColor imagepanel,grid.headercolor[0],grid.headercolor[1],grid.headercolor[2],1
  586.                                 SetGadgetColor header,grid.headercolor[0],grid.headercolor[1],grid.headercolor[2],1
  587.                                 Return Null
  588.                 EndSelect
  589.                 Return Null
  590.         EndMethod
  591.  
  592.         Method Toggle()
  593.                 If collapsed Expand() Else Collapse()
  594.         EndMethod
  595.        
  596.         Method Collapse(update=1)
  597.                 collapsed=True
  598.                 If update grid.AdjustLayout()
  599.         EndMethod
  600.        
  601.         Method Expand(update=1)
  602.                 collapsed=False
  603.                 'For Local gs:TPropertyGroup=EachIn grid.groups
  604.                 '       If gs<>Self gs.hidden=True
  605.                 'Next
  606.                 If update grid.AdjustLayout()
  607.         EndMethod
  608.  
  609.         Function Filter_Vector(event:TEvent,context:Object)
  610.                 If event.ID=EVENT_KEYCHAR
  611.                         If event.data=KEY_BACKSPACE Return 1
  612.                         If event.data=44 Return 1
  613.                         If event.data=47 Return 0
  614.                         If event.data<45 Or event.data>57 Return 0
  615.                 EndIf
  616.                 Return 1
  617.         EndFunction
  618.  
  619.         Function Filter_Color(event:TEvent,context:Object)
  620.                 If event.ID=EVENT_KEYCHAR
  621.                         If event.data=KEY_BACKSPACE Return 1
  622.                         If event.data=44 Return 1
  623.                         If event.data<48 Or event.data>57 Return 0
  624.                 EndIf
  625.                 Return 1
  626.         EndFunction
  627.        
  628.         Function Filter_Integer(event:TEvent,context:Object)
  629.                 If event.ID=EVENT_KEYCHAR
  630.                         If event.data=KEY_BACKSPACE Return 1
  631.                         If event.data<48 Or event.data>57 Return 0
  632.                 EndIf
  633.                 Return 1
  634.         EndFunction
  635.  
  636.         Function Filter_Float(event:TEvent,context:Object)
  637.                 If event.ID=EVENT_KEYCHAR
  638.                         If event.data=KEY_BACKSPACE Return 1
  639.                         If event.data=47 Return 0
  640.                         If event.data<45 Or event.data>57 Return 0
  641.                 EndIf
  642.                 Return 1
  643.         EndFunction
  644.        
  645.         Method AddProperty:TProperty(name:String,value:String="",style:Int=0,tooltip:String="",flags:Int=0,label:String="")
  646.                 Local griditem:TProperty=New TProperty
  647.                 items.addlast(griditem)
  648.                
  649.                 ShowGadget sidepanel
  650.  
  651.                 If Not label label=name
  652.                
  653.                 griditem.style=style
  654.                 griditem.flags=flags
  655.                
  656.                 griditem.label=CreateLabel(label,indent+x,y,labelwidth,20,panel)
  657.                
  658.                 griditem.group=Self
  659.                
  660.                 SetGadgetLayout griditem.label,1,0,1,0
  661.                 SetGadgetColor griditem.label,grid.background[0],grid.background[1],grid.background[2],1
  662.                 SetGadgetColor griditem.label,grid.color_itemtext[0],grid.color_itemtext[1],grid.color_itemtext[2],0
  663.                
  664.                 Local sarr:String[]=value.split("|")
  665.                 Local s:String,i:Int
  666.                
  667.                 griditem.value=sarr[0]
  668.                
  669.                 If sarr.length>1
  670.                         griditem.extra=sarr[1]
  671.                 EndIf
  672.                
  673.                 griditem.name=name'Self.name+"_"+name'uncomment this for category+name
  674.                 grid.properties.insert(griditem.name.tolower(),griditem)
  675.                
  676.                 'griditem.imagepanel=CreatePanel(0,y-itemspacing,itemheight,itemheight+itemspacing,panel)
  677.                 'SetGadgetLayout griditem.imagepanel,1,0,1,0
  678.                 'SetPanelColor griditem.imagepanel,0,0,255
  679.                 'SetGadgetPixmap griditem.imagepanel,LoadPixmap("tree.bmp")
  680.                
  681.                 Select style
  682.  
  683.                         Case PROPERTY_VEC2
  684.                                 sarr=value.split(",")
  685.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  686.                                 SetGadgetLayout griditem.control,1,1,1,0
  687.                                 SetGadgetFilter(griditem.control,Filter_Vector)
  688.                                 If sarr.length>1 griditem.setvaluevec2(Float(sarr[0]),Float(sarr[1])) Else griditem.setvaluevec2(0,0)
  689.                                
  690.                         Case PROPERTY_VEC3
  691.                                 sarr=value.split(",")
  692.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  693.                                 SetGadgetLayout griditem.control,1,1,1,0
  694.                                 SetGadgetFilter(griditem.control,Filter_Vector)
  695.                                 If sarr.length>2 griditem.setvaluevec3(Float(sarr[0]),Float(sarr[1]),Float(sarr[2])) Else griditem.setvaluevec3(0,0,0)
  696.        
  697.                         Case PROPERTY_VEC4
  698.                                 sarr=value.split(",")
  699.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  700.                                 SetGadgetLayout griditem.control,1,1,1,0
  701.                                 SetGadgetFilter(griditem.control,Filter_Vector)
  702.                                 If sarr.length>3 griditem.setvaluevec4(Float(sarr[0]),Float(sarr[1]),Float(sarr[2]),Float(sarr[3])) Else griditem.setvaluevec4(0,0,0,0)
  703.                        
  704.                         Case PROPERTY_COLOR
  705.                                 'griditem.control=CreateColorPicker(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent-itemheight,itemheight,panel)
  706.                                 'SetGadgetLayout griditem.control,1,1,1,0
  707.                                 'SetGadgetToolTip griditem.control,"Select a color"
  708.                                 'Notify GadgetY(griditem.control)+", "+y
  709.                                
  710.                                 'SetGadgetColor griditem.control,sarr[0]
  711.                                 'griditem.control2=CreateButton("",GadgetX(griditem.control)+GadgetWidth(griditem.control),y,itemheight,itemheight,panel)
  712.                                
  713.                                 'SetGadgetLayout griditem.control2,0,1,1,0
  714.                                 'SetGadgetColor griditem.control2,255,255,255
  715.                                 'SetGadgetFilter(griditem.control,Filter_Color)
  716.                                 'Rem
  717.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent-itemheight,itemheight,panel)
  718.                                 SetGadgetLayout griditem.control,1,1,1,0
  719.                                 griditem.control2=CreateButton("",GadgetX(griditem.control)+GadgetWidth(griditem.control),y,itemheight,itemheight,panel)
  720.                                 SetGadgetToolTip griditem.control2,"Select a color"
  721.                                 SetGadgetLayout griditem.control2,0,1,1,0
  722.                                 sarr=griditem.value.split(",")
  723.                                 If sarr.length=3
  724.                                         griditem.value=Int(sarr[0])+","+Int(sarr[1])+","+Int(sarr[2])
  725.                                 Else
  726.                                         griditem.value="0,0,0"
  727.                                 EndIf
  728.                                 SetGadgetText griditem.control,griditem.value
  729.                                 sarr=griditem.value.split(",")
  730.                                 SetGadgetColor griditem.control2,Int(sarr[0]),Int(sarr[1]),Int(sarr[2])
  731.                                 SetGadgetFilter(griditem.control,Filter_Color)
  732.                                
  733.                                 'EndRem
  734.                        
  735.                         Case PROPERTY_BOOL
  736.                                 griditem.control=CreateButton("True",indent+x+labelwidth+2,y-1,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel,BUTTON_CHECKBOX)
  737.                                 SetButtonState griditem.control,Int(sarr[0])
  738.                                 SetGadgetLayout griditem.control,1,1,1,0
  739.                                 griditem.setvaluebool(Int(griditem.value))
  740.                                
  741.                         Case PROPERTY_FILE
  742.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent-itemheight,itemheight,panel)
  743.                                 SetGadgetText griditem.control,sarr[0]
  744.                                 SetGadgetLayout griditem.control,1,1,1,0
  745.                                 griditem.control2=CreateButton("...",GadgetX(griditem.control)+GadgetWidth(griditem.control),y,itemheight,itemheight,panel)
  746.                                 SetGadgetPixmap griditem.control2,LoadPixmap("incbin::folder.tga")
  747.                                 SetGadgetToolTip griditem.control2,"Select file"
  748.                                 SetGadgetLayout griditem.control2,0,1,1,0
  749.  
  750.                         Case PROPERTY_PATH
  751.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent-itemheight,itemheight,panel)
  752.                                 SetGadgetText griditem.control,sarr[0]
  753.                                 SetGadgetLayout griditem.control,1,1,1,0
  754.                                 griditem.control2=CreateButton("...",GadgetX(griditem.control)+GadgetWidth(griditem.control),y,itemheight,itemheight,panel)
  755.                                 SetGadgetPixmap griditem.control2,LoadPixmap("incbin::folder.tga")
  756.                                 SetGadgetToolTip griditem.control2,"Select path"
  757.                                 SetGadgetLayout griditem.control2,0,1,1,0
  758.                                
  759.                         Case PROPERTY_STRING
  760.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  761.                                 SetGadgetText griditem.control,sarr[0]
  762.                                 SetGadgetLayout griditem.control,1,1,1,0
  763.                        
  764.                         Case PROPERTY_INTEGER
  765.                                 If sarr.length>1
  766.                                         sarr=sarr[1].split(",")
  767.                                 EndIf
  768.                                 If sarr.length>1
  769.                                         griditem.control=CreateTextField(indent+x+labelwidth,y,numberitemspacing-numberitemsliderwidth,itemheight,panel)
  770.                                         SetGadgetLayout griditem.control,1,0,1,0
  771.                                         griditem.control2=CreateSlider(indent+x+labelwidth+numberitemspacing,y,panel.ClientWidth()-GadgetX(griditem.control)-numberitemspacing,itemheight,panel,SLIDER_HORIZONTAL|SLIDER_TRACKBAR)
  772.                                         griditem.range[0]=Int(sarr[0])
  773.                                         griditem.range[1]=Int(sarr[1])-griditem.range[0]+1
  774.                                         SetGadgetLayout griditem.control2,1,1,1,0
  775.                                         SetSliderRange griditem.control2,1,griditem.range[1]
  776.                                         griditem.helper[0]=CreateSlider(GadgetX(griditem.control)+GadgetWidth(griditem.control),y,12,itemheight,panel,SLIDER_VERTICAL)
  777.                                         SetGadgetLayout griditem.helper[0],1,0,1,0                                     
  778.                                         SetSliderRange griditem.helper[0],1,griditem.range[1]
  779.                                 Else
  780.                                         griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  781.                                         SetGadgetLayout griditem.control,1,1,1,0
  782.                                 EndIf
  783.                                 griditem.setvalueinteger(Int(griditem.value))
  784.                                 SetGadgetFilter(griditem.control,Filter_Integer)
  785.                                
  786.                         Case PROPERTY_FLOAT
  787.                                 If sarr.length>1
  788.                                         sarr=sarr[1].split(",")
  789.                                 EndIf
  790.                                 If sarr.length>1
  791.                                         griditem.control=CreateTextField(indent+x+labelwidth,y,numberitemspacing-numberitemsliderwidth,itemheight,panel)
  792.                                         SetGadgetLayout griditem.control,1,0,1,0
  793.                                         If sarr.length>2 griditem.floatitemmultiplier=Float(sarr[2])
  794.                                         griditem.control2=CreateSlider(indent+x+labelwidth+numberitemspacing,y,panel.ClientWidth()-GadgetX(griditem.control)-numberitemspacing,itemheight,panel,SLIDER_HORIZONTAL|SLIDER_TRACKBAR)
  795.                                         griditem.range[0]=Int(Float(sarr[0])*griditem.floatitemmultiplier)
  796.                                         griditem.range[1]=Int(Float(sarr[1])*griditem.floatitemmultiplier)-griditem.range[0]+1
  797.                                         SetGadgetLayout griditem.control2,1,1,1,0
  798.                                         SetSliderRange griditem.control2,1,griditem.range[1]
  799.                                         griditem.helper[0]=CreateSlider(GadgetX(griditem.control)+GadgetWidth(griditem.control),y,12,itemheight,panel,SLIDER_VERTICAL)
  800.                                         SetGadgetLayout griditem.helper[0],1,0,1,0                                     
  801.                                         SetSliderRange griditem.helper[0],1,griditem.range[1]
  802.                                 Else
  803.                                         griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  804.                                         SetGadgetLayout griditem.control,1,1,1,0
  805.                                 EndIf
  806.                                 griditem.setvaluefloat(Float(griditem.value))
  807.                                 SetGadgetFilter(griditem.control,Filter_Float)
  808.                                 Rem
  809.                                 griditem.control=CreateTextField(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  810.                                 SetGadgetText griditem.control,FloatToString(Float(sarr[0]))
  811.                                 SetGadgetFilter(griditem.control,Filter_Integer)
  812.                                 SetGadgetLayout griditem.control,1,1,1,0
  813.                                 EndRem
  814.                                
  815.                         Case PROPERTY_CHOICE,PROPERTY_CHOICEEDIT
  816.                                 i=Int(sarr[0])
  817.                                 value=sarr[0]
  818.                                 If style=PROPERTY_CHOICE
  819.                                         griditem.control=CreateComboBox(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel)
  820.                                 Else
  821.                                         griditem.control=CreateComboBox(indent+x+labelwidth,y,panel.ClientWidth()-x-labelwidth-2-indent,itemheight,panel,COMBOBOX_EDITABLE)
  822.                                 EndIf
  823.                                 ?win32
  824.                                 SendMessageA(QueryGadget(griditem.control,QUERY_HWND),CB_SETITEMHEIGHT,-1,itemheight-5);
  825.                                 ?
  826.                                 If sarr.length>1
  827.                                         sarr=sarr[1].split(",")
  828.                                         For s=EachIn sarr
  829.                                                 AddGadgetItem(griditem.control,s)
  830.                                         Next
  831.                                 EndIf
  832.                                 If style=1
  833.                                         If i<CountGadgetItems(griditem.control) And i>-2
  834.                                                 SelectGadgetItem griditem.control,i
  835.                                         EndIf
  836.                                 Else
  837.                                         SetGadgetText griditem.control,value
  838.                                 EndIf
  839.                                 SetGadgetLayout griditem.control,1,1,1,0
  840.                 EndSelect
  841.                
  842.                 'SetGadgetColor griditem.control,128,128,128,1
  843.                
  844.                 'SetGadgetColor griditem.control,grid.background[0],grid.background[1],grid.background[2],1
  845.                 'If griditem.control2 SetGadgetColor griditem.control2,grid.background[0],grid.background[1],grid.background[2],0
  846.                 'If griditem.helper[0] SetGadgetColor griditem.helper[0],grid.background[0],grid.background[1],grid.background[2],0
  847.                
  848.                 SetGadgetToolTip griditem.control,tooltip
  849.                
  850.                 If grid.font griditem.SetFont(grid.font)
  851.                
  852.                 y:+itemheight+itemspacing
  853.                 grid.AdjustLayout()
  854.                
  855.                 Return griditem
  856.         EndMethod      
  857. EndType
  858.  
  859.  
  860. Type TProperty
  861.        
  862.         Field name:String
  863.         Field label:TGadget
  864.         Field flags:Int
  865.         Field style:Int
  866.         Field control:TGadget
  867.         Field control2:TGadget
  868.         Field imagepanel:TGadget
  869.         Field value:String
  870.         Field extra:String
  871.         Field helper:TGadget[2]
  872.         Field range:Int[2]
  873.         Field floatitemmultiplier:Float=10.0
  874.         Field hidden:Int=0
  875.         Field group:TPropertyGroup
  876.         Field undetermined:Int
  877.  
  878.         Const undeterminedtext:String="<different>"
  879.  
  880.         Method MakeUndetermined()
  881.                 Select style
  882.                         Case PROPERTY_STRING,PROPERTY_INTEGER,PROPERTY_FLOAT,PROPERTY_FILE,PROPERTY_PATH,PROPERTY_COLOR,PROPERTY_VEC2,PROPERTY_VEC3,PROPERTY_VEC4,PROPERTY_CHOICEEDIT
  883.                                 SetGadgetText control,undeterminedtext
  884.                         Case PROPERTY_CHOICE
  885.                                 SelectGadgetItem control,-1
  886.                         Case PROPERTY_BOOL
  887.                                 SetButtonState control,-1
  888.                 EndSelect
  889.                 undetermined=1
  890.         EndMethod
  891.        
  892.         Method Hide(update=1)
  893.                 hidden=1
  894.                 If update group.grid.AdjustLayout()
  895.         EndMethod
  896.        
  897.         Method Show(update=1)
  898.                 hidden=0
  899.                 If update group.grid.AdjustLayout()
  900.         EndMethod
  901.        
  902.         Method Free()
  903.                 FreeGadget control
  904.                 If control2 FreeGadget control2
  905.                 If helper[0] FreeGadget helper[0]
  906.                 If helper[1] FreeGadget helper[1]
  907.                 If group.grid.properties.valueforkey(name.tolower())=Self
  908.                         group.grid.properties.remove(name.tolower())
  909.                 EndIf
  910.                 If group.grid.currentitem=Self group.grid.currentitem=Null
  911.                 group=Null
  912.         EndMethod
  913.        
  914.         Method Compare:Int(o:Object)
  915.                 Return GadgetText(label).compare(GadgetText(TProperty(o).label))
  916.         EndMethod
  917.        
  918.         Method SetFont(font:TGUIFont)
  919.                 If label SetGadgetFont label,font
  920.                 If control SetGadgetFont control,font
  921.                 If control2 SetGadgetFont control2,font
  922.                 If helper[0] SetGadgetFont helper[0],font
  923.                 If helper[1] SetGadgetFont helper[1],font
  924.         EndMethod
  925.        
  926.         Method EventHook:TEvent( event:TEvent,grid:TPropertyGrid )
  927.                 Local s:String
  928.                 Local ovalue:String=value
  929.                 Local wasundetermined:Int
  930.                
  931.                 wasundetermined=undetermined
  932.                
  933.                 Rem
  934.                 If event.id=EVENT_GADGETLOSTFOCUS
  935.                         SetGadgetColor label,0,0,0,0
  936.                         group.grid.currentitem=Null
  937.                 Else
  938.                         If group.grid.currentitem
  939.                                 SetGadgetColor group.grid.currentitem.label,0,0,0,0
  940.                         EndIf
  941.                         SetGadgetColor label,0,0,255,0
  942.                         group.grid.currentitem=Self
  943.                 EndIf
  944.                 EndRem
  945.                
  946.                 Select event.source
  947.                         Case control
  948.                                 Select style
  949.                                        
  950.                                         Case PROPERTY_STRING,PROPERTY_FILE,PROPERTY_PATH
  951.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  952.                                                         setvaluestring(GadgetText(control))
  953.                                                 EndIf
  954.                                        
  955.                                         Case PROPERTY_INTEGER
  956.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  957.                                                         SetValueInteger(Int(GadgetText(control)))
  958.                                                 EndIf
  959.  
  960.                                         Case PROPERTY_FLOAT
  961.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  962.                                                         SetValueFloat(Float(GadgetText(control)))
  963.                                                 EndIf
  964.                                        
  965.                                         Case PROPERTY_VEC2
  966.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  967.                                                         Local sarr:String[]=GadgetText(control).split(",")
  968.                                                         If sarr.length<>2
  969.                                                                 If undetermined
  970.                                                                         SetGadgetText control,undeterminedtext
  971.                                                                 Else
  972.                                                                         SetGadgetText control,value
  973.                                                                 EndIf
  974.                                                         Else
  975.                                                                 SetValueVec2(Float(sarr[0]),Float(sarr[1]))
  976.  
  977.                                                         EndIf
  978.                                                 EndIf                                  
  979.                                        
  980.                                         Case PROPERTY_VEC4
  981.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  982.                                                         Local sarr:String[]=GadgetText(control).split(",")
  983.                                                         If sarr.length<>4
  984.                                                                 If undetermined
  985.                                                                         SetGadgetText control,undeterminedtext
  986.                                                                 Else
  987.                                                                         SetGadgetText control,value
  988.                                                                 EndIf
  989.                                                         Else
  990.                                                                 SetValueVec4(Float(sarr[0]),Float(sarr[1]),Float(sarr[2]),Float(sarr[3]))
  991.  
  992.                                                         EndIf
  993.                                                 EndIf
  994.                                                                                                
  995.                                         Case PROPERTY_VEC3
  996.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  997.                                                         Local sarr:String[]=GadgetText(control).split(",")
  998.                                                         If sarr.length<>3
  999.                                                                 If undetermined
  1000.                                                                         SetGadgetText control,undeterminedtext
  1001.                                                                 Else
  1002.                                                                         SetGadgetText control,value
  1003.                                                                 EndIf
  1004.                                                         Else
  1005.                                                                 SetValueVec3(Float(sarr[0]),Float(sarr[1]),Float(sarr[2]))
  1006.  
  1007.                                                         EndIf
  1008.                                                 EndIf
  1009.                                        
  1010.                                         Case PROPERTY_COLOR
  1011.                                                 If event.id=EVENT_GADGETLOSTFOCUS
  1012.                                                         Local sarr:String[]=GadgetText(control).split(",")
  1013.                                                         If sarr.length=3
  1014.                                                                 SetValueColor(Int(sarr[0]),Int(sarr[1]),Int(sarr[2]))
  1015.                                                         Else
  1016.                                                                 If undetermined
  1017.                                                                         SetGadgetText control,undeterminedtext
  1018.                                                                 Else
  1019.                                                                         SetGadgetText control,value
  1020.                                                                 EndIf
  1021.                                                         EndIf
  1022.                                                 EndIf
  1023.  
  1024.                                         Case PROPERTY_CHOICEEDIT
  1025.                                                 If event.id=EVENT_GADGETACTION
  1026.                                                         SetValueString(GadgetText(control))
  1027.                                                 EndIf
  1028.                                                
  1029.                                         Case PROPERTY_CHOICE
  1030.                                                 If event.id=EVENT_GADGETACTION SetValueChoice(SelectedGadgetItem(control))
  1031.                                        
  1032.                                         Case PROPERTY_BOOL
  1033.                                                 If event.id=EVENT_GADGETACTION SetValueBool(event.data)
  1034.  
  1035.                                 EndSelect
  1036.                        
  1037.                         Case helper[0]
  1038.                                 Select style
  1039.                                         Case PROPERTY_INTEGER
  1040.                                                 Local i:Int=range[1]-(SliderValue(helper[0])-range[0]+1)
  1041.                                                 SetValueInteger(i)
  1042.  
  1043.                                         Case PROPERTY_FLOAT
  1044.                                                 Local i:Int=range[1]-(SliderValue(helper[0])-range[0]+1)
  1045.                                                 SetValueFloat(i/floatitemmultiplier)
  1046.                                
  1047.                                 EndSelect
  1048.                                
  1049.                         Case control2
  1050.                                 Select style
  1051.                                        
  1052.                                         Case PROPERTY_INTEGER
  1053.                                                 Local i:Int=SliderValue(control2)+range[0]-1
  1054.                                                 SetValueInteger(i)
  1055.  
  1056.                                         Case PROPERTY_FLOAT
  1057.                                                 Local i:Int=(SliderValue(control2)+range[0]-1)
  1058.                                                 SetValueFloat(i/floatitemmultiplier)
  1059.                                        
  1060.                                         Case PROPERTY_FILE
  1061.                                                 s=RequestFile("Select File",extra,0,GadgetText(control))
  1062.                                                 If s
  1063.                                                         If (1 & flags) s=StripDir(s)
  1064.                                                         setvaluestring(s)
  1065.                                                 EndIf
  1066.                                                
  1067.                                         Case PROPERTY_PATH
  1068.                                                 s=RequestDir("Select path",GadgetText(control))
  1069.                                                 If s setvaluestring(s)
  1070.                                        
  1071.                                         Case PROPERTY_COLOR
  1072.                                                 Local sarr:String[]=value.split(",")
  1073.                                                 If RequestColor(Int(sarr[0]),Int(sarr[1]),Int(sarr[2])) SetValueColor(RequestedRed(),RequestedGreen(),RequestedBlue())
  1074.                                        
  1075.                                 EndSelect
  1076.                 EndSelect
  1077.                
  1078.                 If Not undetermined
  1079.                         If value<>ovalue Or wasundetermined=1
  1080.                                 Return CreateEvent(EVENT_GADGETACTION,grid,0,0,0,0,name+"="+value)
  1081.                         EndIf
  1082.                 EndIf
  1083.                
  1084.                 Return Null
  1085.         EndMethod
  1086.  
  1087.         Method SetValueColor(r:Int,g:Int,b:Int)
  1088.                 undetermined=0
  1089.                 SetGadgetColor control2,r,g,b
  1090.                 value=r+","+g+","+b
  1091.                 SetGadgetText control,value
  1092.         EndMethod
  1093.        
  1094.         Method SetValueFloat(i:Float)
  1095.                 undetermined=0
  1096.                 If control2
  1097.                         i=Round(i*floatitemmultiplier)/floatitemmultiplier
  1098.                         i:*floatitemmultiplier
  1099.                         If i<range[0] i=range[0]
  1100.                         If i>range[0]+range[1]-1 i=range[0]+range[1]-1
  1101.                         value=FloatToString(i/floatitemmultiplier)
  1102.                         SetGadgetText control,value
  1103.                         If control2 SetSliderValue control2,i-range[0]+1
  1104.                         If helper[0] SetSliderValue helper[0],range[1]-(i-range[0]+1)
  1105.                 Else
  1106.                         value=FloatToString(i)
  1107.                         SetGadgetText control,value
  1108.                 EndIf
  1109.         EndMethod
  1110.        
  1111.         Method SetValueChoice(choice:Int)
  1112.                 undetermined=0
  1113.                 If choice<0 choice=0
  1114.                 If choice>CountGadgetItems(control)-1 choice=CountGadgetItems(control)-1
  1115.                 value=String(choice)
  1116.                 SelectGadgetItem control,choice
  1117.         EndMethod
  1118.        
  1119.         Method SetValueInteger(i:Int)
  1120.                 undetermined=0
  1121.                 If control2
  1122.                         If i<range[0] i=range[0]
  1123.                         If i>range[0]+range[1]-1 i=range[0]+range[1]-1
  1124.                 EndIf
  1125.                 value=String(i)
  1126.                 SetGadgetText control,value
  1127.                 If control2 SetSliderValue control2,i-range[0]+1
  1128.                 If helper[0] SetSliderValue helper[0],range[1]-(i-range[0]+1)
  1129.         EndMethod
  1130.  
  1131.         Method SetValueVec2(x#,y#)
  1132.                 undetermined=0
  1133.                 value=floattostring(x)+","+floattostring(y)
  1134.                 SetGadgetText control,value
  1135.         EndMethod
  1136.        
  1137.         Method SetValueVec3(x#,y#,z#)
  1138.                 undetermined=0
  1139.                 value=floattostring(x)+","+floattostring(y)+","+floattostring(z)
  1140.                 SetGadgetText control,value
  1141.         EndMethod
  1142.  
  1143.         Method SetValueVec4(x#,y#,z#,w#)
  1144.                 undetermined=0
  1145.                 value=floattostring(x)+","+floattostring(y)+","+floattostring(z)+","+floattostring(w)
  1146.                 SetGadgetText control,value
  1147.         EndMethod
  1148.  
  1149.         Method SetValueString(s$)
  1150.                 undetermined=0
  1151.                 value=s
  1152.                 If GadgetText(control)<>value SetGadgetText control,value
  1153.         EndMethod
  1154.        
  1155.         Method SetValueBool(b:Int)
  1156.                 undetermined=0
  1157.                 If b b=1
  1158.                 value=String(b)
  1159.                 SetButtonState control,b
  1160.                 If b SetGadgetText control,"True" Else SetGadgetText control,"False"   
  1161.         EndMethod
  1162.        
  1163.         Method SetValue(s$)
  1164.                 Local i:Int
  1165.                 Local sarr:String[]
  1166.                 undetermined=False
  1167.                 Select style
  1168.                         Case PROPERTY_STRING,PROPERTY_CHOICEEDIT,PROPERTY_PATH
  1169.                                 SetValueString(s)
  1170.                         Case PROPERTY_FILE
  1171.                                 If (1 & flags) s=StripDir(s)
  1172.                                 SetValueString(s)
  1173.                         Case PROPERTY_CHOICE
  1174.                                 SetValueString(Int(s))
  1175.                         Case PROPERTY_INTEGER
  1176.                                 SetValueInteger(Int(s))
  1177.                         Case PROPERTY_FLOAT
  1178.                                 SetValueFloat(Float(s))
  1179.                         Case PROPERTY_BOOL
  1180.                                 SetValueBool(Int(s))
  1181.                         Case PROPERTY_COLOR
  1182.                                 sarr=s.split(",")[..3]
  1183.                                 SetValueColor(Int(sarr[0]),Int(sarr[1]),Int(sarr[2]))
  1184.                         Case PROPERTY_VEC2
  1185.                                 sarr=s.split(",")[..2]
  1186.                                 SetValueVec2(Float(sarr[0]),Float(sarr[1]))                            
  1187.                         Case PROPERTY_VEC3
  1188.                                 sarr=s.split(",")[..3]
  1189.                                 SetValueVec3(Float(sarr[0]),Float(sarr[1]),Float(sarr[2]))
  1190.                         Case PROPERTY_VEC4
  1191.                                 sarr=s.split(",")[..4]
  1192.                                 SetValueVec4(Float(sarr[0]),Float(sarr[1]),Float(sarr[2]),Float(sarr[3]))                              
  1193.                 EndSelect
  1194.         EndMethod
  1195.        
  1196. EndType
  1197.  
  1198. Private
  1199.  
  1200. Function Round(val#)
  1201.         Local dec#
  1202.         dec#=val-Floor(val)
  1203.         If dec<0.5 Return Floor(val) Else Return Ceil(val)
  1204. EndFunction
  1205.  
  1206. Function FloatToString:String(value:Float,places=3)
  1207.         Local sign=Sgn(value)
  1208.         value=Abs(value)
  1209.         Local i=Round(value*10^places)
  1210.         Local ipart=Int(i/10^places)
  1211.         Local dpart=i-ipart*10^places
  1212.         Local si$=ipart
  1213.         Local di$
  1214.         If dpart>0
  1215.                 di=dpart
  1216.                 While di.length<places
  1217.                         di="0"+di
  1218.                 Wend
  1219.                 di="."+di
  1220.         EndIf
  1221.         While Right(di,1)="0"
  1222.                 di=Left(di,di.length-1)
  1223.         Wend
  1224.         If di="" di=".0"
  1225.         If sign=-1 si="-"+si
  1226.         Return si+di
  1227. EndFunction
  1228.  
  1229. Public


Comments :


DreamLoader(Posted 1+ years ago)

 nice one


byo(Posted 1+ years ago)

 Great job!! Really easy to use. Thanks a lot.This would be perfect as a module. ;)


Galaxy613(Posted 1+ years ago)

 This is awesome. Using it in my current project. I had to do some tweaking along with adding disabling and enabling of properties. Really easy to do with your framework. Very wonderful. :)


GaryV(Posted 1+ years ago)

 The link to the images is dead. :(


GW(Posted 1+ years ago)

 This is pretty cool. Thanks for sharing.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal