Simple PropertyGrid
Posted: Mon May 21, 2012 8:09 am
Simple PropertyGridGadget using ScrollAreaGadget and PureBasic's Gadgets.
It is very easy to use the PropertyGridGadget:
AddXXXXGadget stands for AddStringGadget, AddButtonGadget, AddComboBoxGadget etc.
Because the Gadgets within the PropertyGridGadget are PB Gadgets, you can work with them as usual
and check the events etc.
You have to call CheckPropertyGridSectionClick(PropertyGridGadget,EventGadget(),EventType())
for #PB_Event_Gadget in your event loop (for all your PropertyGrid's!) if the event was not for
your own gadgets.

It is very easy to use the PropertyGridGadget:
Code: Select all
prop1 = PropertyGridGadget(Nr,x,y,width,height) ; optional background/front colors and flags for the ScrollAreaGadget (for example border style)
section = AddSection(prop1,"sectionName") ; optional 'open' state: 0 or 1, specifies that the section is open or closed
AddXXXXGadget(prop1, section, "Description", ...optional args for the gadget type... )
Because the Gadgets within the PropertyGridGadget are PB Gadgets, you can work with them as usual
and check the events etc.
You have to call CheckPropertyGridSectionClick(PropertyGridGadget,EventGadget(),EventType())
for #PB_Event_Gadget in your event loop (for all your PropertyGrid's!) if the event was not for
your own gadgets.
Code: Select all
;
; Simple PropertyGrid
;
; by Danilo, May 2012, PureBasic 4.60
;
#PropertyGrid_SectionFont = "Arial"
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
#PropertyGrid_DefaultItemHeight = 20
#PropertyGrid_SectionFontSize = 10
CompilerCase #PB_OS_Linux
#PropertyGrid_DefaultItemHeight = 22
#PropertyGrid_SectionFontSize = 10
CompilerCase #PB_OS_MacOS
#PropertyGrid_DefaultItemHeight = 25
#PropertyGrid_SectionFontSize = 14
CompilerDefault ; future
#PropertyGrid_DefaultItemHeight = 20
#PropertyGrid_SectionFontSize = 12
CompilerEndSelect
Structure PropertyGridGadgetSubItem
DescriptionGadget.i
ItemGadget.i
EndStructure
Structure PropertyGridItem
SectionDescriptionGadget.i
SectionButtonGadget.i
IsSection.i
Opened.i
List SubItems.PropertyGridGadgetSubItem()
EndStructure
Structure PropertyGridData
ItemHeight.i
Font.i
backColor.q
frontColor.q
List Items.PropertyGridItem()
EndStructure
Procedure __GetPropertyGridImage(open.i)
Static openImage.i, closeImage.i
If Not openImage
openImage = CreateImage(#PB_Any,11,11,24)
If openImage And StartDrawing( ImageOutput(openImage) )
Box(0,0,11,11,RGB($FF,$FF,$FF))
DrawingMode(#PB_2DDrawing_Outlined)
Box(0,0,11,11,RGB($00,$00,$00))
LineXY(2,5,8,5,RGB($00,$00,$00))
StopDrawing()
EndIf
EndIf
If Not closeImage
closeImage = CreateImage(#PB_Any,11,11,24)
If closeImage And StartDrawing( ImageOutput(closeImage) )
Box(0,0,11,11,RGB($FF,$FF,$FF))
DrawingMode(#PB_2DDrawing_Outlined)
Box(0,0,11,11,RGB($00,$00,$00))
LineXY(2,5,8,5,RGB($00,$00,$00))
LineXY(5,2,5,8,RGB($00,$00,$00))
StopDrawing()
EndIf
EndIf
If open
ProcedureReturn openImage
Else
ProcedureReturn closeImage
EndIf
EndProcedure
Procedure UpdatePropertyGrid(PropertyGridGadget)
*memory.PropertyGridData = GetGadgetData(PropertyGridGadget)
If *memory
i = 0
height = *memory\ItemHeight
width = GadgetWidth(PropertyGridGadget)
ForEach *memory\Items()
If *memory\Items()\IsSection
ResizeGadget( *memory\Items()\SectionDescriptionGadget,20,i,width-20,height-1)
ResizeGadget( *memory\Items()\SectionButtonGadget , 4,i+height*0.5-6,11,11)
Else
ResizeGadget( *memory\Items()\SectionDescriptionGadget,20,i,width*0.5-40,height-1)
ResizeGadget( *memory\Items()\SectionButtonGadget ,width*0.5-19,i,width*0.5-4,height-1)
EndIf
i + height
If *memory\Items()\Opened
ForEach *memory\Items()\SubItems()
ResizeGadget( *memory\Items()\SubItems()\DescriptionGadget,20,i,width*0.5-40,height-1)
ResizeGadget( *memory\Items()\SubItems()\ItemGadget ,width*0.5-19,i,width*0.5-4,height-1)
i + height
Next
EndIf
Next
If GetGadgetAttribute(PropertyGridGadget,#PB_ScrollArea_InnerHeight) <> i
SetGadgetAttribute(PropertyGridGadget,#PB_ScrollArea_InnerHeight,i)
EndIf
If GetGadgetAttribute(PropertyGridGadget,#PB_ScrollArea_InnerWidth) <> width-20
SetGadgetAttribute(PropertyGridGadget,#PB_ScrollArea_InnerWidth,width-20)
EndIf
EndIf
EndProcedure
Procedure __SetSection(PropertyGridGadget,section)
*memory.PropertyGridData = GetGadgetData(PropertyGridGadget)
If *memory
If section = 0
LastElement( *memory\Items() )
OpenGadgetList(PropertyGridGadget)
ProcedureReturn #True
EndIf
ForEach *memory\Items()
If *memory\Items()\SectionButtonGadget = section
OpenGadgetList(PropertyGridGadget)
ProcedureReturn #True
EndIf
Next
EndIf
EndProcedure
Procedure __AddSectionItem(PropertyGridGadget,section,Description.s,Gadget.i)
*memory.PropertyGridData = GetGadgetData(PropertyGridGadget)
If *memory
descGadget = StringGadget(#PB_Any,0,0,0,0,Description,#PB_String_ReadOnly)
;descGadget = TextGadget(#PB_Any,0,0,0,0,Description);,#PB_Text_Border)
;DisableGadget( descGadget, 1 )
If section = 0
If AddElement( *memory\Items() )
*memory\Items()\IsSection = 0
*memory\Items()\SectionButtonGadget = Gadget
*memory\Items()\SectionDescriptionGadget = descGadget
CloseGadgetList()
UpdatePropertyGrid(PropertyGridGadget)
ProcedureReturn #True
EndIf
Else
LastElement( *memory\Items()\SubItems() )
If AddElement( *memory\Items()\SubItems() )
*memory\Items()\SubItems()\DescriptionGadget = descGadget
*memory\Items()\SubItems()\ItemGadget = Gadget
CloseGadgetList()
If *memory\Items()\Opened
UpdatePropertyGrid(PropertyGridGadget)
Else
HideGadget(*memory\Items()\SubItems()\DescriptionGadget,1)
HideGadget(*memory\Items()\SubItems()\ItemGadget ,1)
EndIf
ProcedureReturn #True
EndIf
EndIf
EndIf
FreeGadget(Gadget)
EndProcedure
Procedure PropertyGridGadget(gadgetNr,x,y,width,height,backColor.q=-1,frontColor.q=-1,flags=#PB_ScrollArea_Single)
gadget = ScrollAreaGadget(gadgetNr,x,y,width,height,width-20,1,#PropertyGrid_DefaultItemHeight,flags)
If gadget
If gadgetNr = #PB_Any : gadgetNr = gadget : EndIf
If backColor <> -1
SetGadgetColor(gadgetNr,#PB_Gadget_BackColor,backColor)
EndIf
If frontColor <> -1
SetGadgetColor(gadgetNr,#PB_Gadget_FrontColor,frontColor)
EndIf
*memory.PropertyGridData = AllocateMemory( SizeOf(PropertyGridData) )
If Not *memory
FreeGadget(gadgetNr)
ProcedureReturn 0
EndIf
InitializeStructure(*memory,PropertyGridData)
*memory\ItemHeight = #PropertyGrid_DefaultItemHeight
*memory\Font = LoadFont(#PB_Any,#PropertyGrid_SectionFont,#PropertyGrid_SectionFontSize,#PB_Font_Bold)
*memory\backColor = backColor
*memory\frontColor = frontColor
SetGadgetData(gadgetNr,*memory)
CloseGadgetList()
EndIf
ProcedureReturn gadgetNr
EndProcedure
Procedure AddSection(PropertyGridGadget,sectionName.s,open.i=1)
*memory.PropertyGridData = GetGadgetData(PropertyGridGadget)
If *memory
LastElement( *memory\Items() )
If AddElement( *memory\Items() )
OpenGadgetList(PropertyGridGadget)
width = GadgetWidth(PropertyGridGadget)
height = *memory\ItemHeight
gadget = TextGadget(#PB_Any,20,0,width-20,height,sectionName)
*memory\Items()\SectionDescriptionGadget = gadget
*memory\Items()\SectionButtonGadget = ImageGadget(#PB_Any,0,0,0,0,ImageID(__GetPropertyGridImage(open)))
*memory\Items()\Opened = open
*memory\Items()\IsSection = 1
SetGadgetFont(gadget,FontID(*memory\Font))
If *memory\backColor <> -1
SetGadgetColor(gadget,#PB_Gadget_BackColor,*memory\backColor)
EndIf
If *memory\frontColor <> -1
SetGadgetColor(gadget,#PB_Gadget_FrontColor,*memory\frontColor)
EndIf
CloseGadgetList()
UpdatePropertyGrid(PropertyGridGadget)
ProcedureReturn *memory\Items()\SectionButtonGadget
EndIf
EndIf
EndProcedure
Procedure CheckPropertyGridSectionClick(PropertyGridGadget,EventGadget,EventType)
*memory.PropertyGridData = GetGadgetData(PropertyGridGadget)
If *memory
ForEach *memory\Items()
If EventGadget = *memory\Items()\SectionButtonGadget And EventType = #PB_EventType_LeftClick
*memory\Items()\Opened ! 1
open = *memory\Items()\Opened
SetGadgetState(*memory\Items()\SectionButtonGadget,ImageID(__GetPropertyGridImage(open)))
ForEach *memory\Items()\SubItems()
HideGadget( *memory\Items()\SubItems()\DescriptionGadget , 1-open )
HideGadget( *memory\Items()\SubItems()\ItemGadget , 1-open )
Next
UpdatePropertyGrid(PropertyGridGadget)
Break
EndIf
Next
UpdatePropertyGrid(PropertyGridGadget)
EndIf
EndProcedure
;---[ PropertyGrid Gadgets ]---
Procedure AddStringGadget(PropertyGridGadget,section,Description.s,Content.s,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = StringGadget(#PB_Any,0,0,0,0,Content,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddCheckBoxGadget(PropertyGridGadget,section,Description.s,Text.s,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = CheckBoxGadget(#PB_Any,0,0,0,0,Text,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddButtonGadget(PropertyGridGadget,section,Description.s,Text.s,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = ButtonGadget(#PB_Any,0,0,0,0,Text,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddComboBoxGadget(PropertyGridGadget,section,Description.s,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = ComboBoxGadget(#PB_Any,0,0,0,0,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddProgressBarGadget(PropertyGridGadget,section,Description.s,Minimum,Maximum,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = ProgressBarGadget(#PB_Any,0,0,0,0,Minimum,Maximum,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddSpinGadget(PropertyGridGadget,section,Description.s,Minimum,Maximum,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = SpinGadget(#PB_Any,0,0,0,0,Minimum,Maximum,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddTrackBarGadget(PropertyGridGadget,section,Description.s,Minimum,Maximum,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = TrackBarGadget(#PB_Any,0,0,0,0,Minimum,Maximum,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddSplitterGadget(PropertyGridGadget,section,Description.s,Gadget1,Gadget2,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = SplitterGadget(#PB_Any,0,0,0,0,Gadget1,Gadget2,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddIPAddressGadget(PropertyGridGadget,section,Description.s)
If __SetSection(PropertyGridGadget,section)
gadget = IPAddressGadget(#PB_Any,0,0,120,#PropertyGrid_DefaultItemHeight)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddShortcutGadget(PropertyGridGadget,section,Description.s,Shortcut)
If __SetSection(PropertyGridGadget,section)
gadget = ShortcutGadget(#PB_Any,0,0,0,0,Shortcut)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddDateGadget(PropertyGridGadget,section,Description.s,Mask$="",Date=0,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = DateGadget(#PB_Any,0,0,0,0,Mask$,Date,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
Procedure AddHyperLinkGadget(PropertyGridGadget,section,Description.s,Text$,Color,flags=0)
If __SetSection(PropertyGridGadget,section)
gadget = HyperLinkGadget(#PB_Any,0,0,0,0,Text$,Color,flags)
If __AddSectionItem(PropertyGridGadget,section,Description,gadget)
ProcedureReturn gadget
EndIf
EndIf
EndProcedure
;---------------------------------------------------------------------
Procedure AddComboBox_FalseTrue(PropertyGridGadget,section,Description.s,FalseTrue.i)
combo = AddComboBoxGadget(PropertyGridGadget,section,Description)
AddGadgetItem(combo,-1,"False")
AddGadgetItem(combo,-1,"True")
SetGadgetState(combo,FalseTrue)
ProcedureReturn combo
EndProcedure
OpenWindow(0,0,0,800,600,"PropertyGrid",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
prop = PropertyGridGadget(#PB_Any,10,10,300,580);,RGB($80,$80,$80),RGB($00,$00,$00))
section1 = AddSection(prop,"Section 1")
string1 = AddStringGadget(prop,section1,"String","Item 1")
string2 = AddStringGadget(prop,section1,"Number","123456",#PB_String_Numeric)
spin1 = AddSpinGadget (prop,section1,"SpinGadget",1,100,#PB_Spin_Numeric)
SetGadgetText(spin1,"1")
split = AddSplitterGadget(prop,section1,"Splitter",ButtonGadget(#PB_Any,0,0,50,0,"1"),ButtonGadget(#PB_Any,0,0,50,0,"2"),#PB_Splitter_Vertical)
SetGadgetAttribute(split,#PB_Splitter_FirstMinimumSize,50)
SetGadgetAttribute(split,#PB_Splitter_SecondMinimumSize,50)
AddTrackBarGadget(prop,section1,"Trackbar",1,100)
section2 = AddSection(prop,"Section 2")
combo1 = AddComboBoxGadget(prop,section2,"Combobox 1")
For i = 1 To 10 : AddGadgetItem(combo1,-1,"Item "+Str(i)) : Next
check1 = AddCheckBoxGadget(prop,section2,"Checkbox 1","Check me!")
btn1 = AddButtonGadget (prop,section2,"Choose Directory","...")
section3 = AddSection(prop,"Section 3")
progress = AddProgressBarGadget(prop,section3,"Progress",0,100)
SetGadgetState(progress,40)
AddShortcutGadget(prop,section3,"Shortcut",0)
AddDateGadget(prop,section3,"Date")
AddHyperLinkGadget(prop,section3,"Hyperlink","Hyper Hyper!",RGB($00,$00,$FF))
ip = AddIPAddressGadget(prop,section3,"IP Address")
SetGadgetState(ip, MakeIPAddress(127, 0, 0, 1))
For i = 4 To 20
sec = AddSection(prop,"Section "+Str(i),0)
For j = 1 To 10
AddStringGadget(prop,sec,"Description "+Str(j),"Item "+Str(j))
Next j
Next i
prop2 = PropertyGridGadget(#PB_Any,330,10,450,280,RGB($40,$40,$40),RGB($FF,$FF,$FF))
For i = 1 To 20
sec = AddSection(prop2,"Section "+Str(i),0)
For j = 1 To 10
AddStringGadget(prop2,sec,"Section "+Str(i)+", Field "+Str(j),"Item "+Str(j))
Next j
Next i
prop3 = PropertyGridGadget(#PB_Any,330,300,300,280,-1,-1,#PB_ScrollArea_Flat)
AddComboBox_FalseTrue(prop3,0,"AllowDrop" ,#False)
AddComboBox_FalseTrue(prop3,0,"Enabled" ,#True)
AddComboBox_FalseTrue(prop3,0,"FullRowSelect",#False)
AddComboBox_FalseTrue(prop3,0,"HideSelection",#True)
AddComboBox_FalseTrue(prop3,0,"HotTracking" ,#False)
spinImgIdx = AddSpinGadget (prop3,0,"ImageIndex",1,100,#PB_Spin_Numeric) : SetGadgetText(spinImgIdx,"1")
secImageSize = AddSection(prop3,"ImageSize",0)
spinImgWidth = AddSpinGadget (prop3,secImageSize,"Width ",1,100,#PB_Spin_Numeric) : SetGadgetText(spinImgWidth ,"32")
spinImgHeight = AddSpinGadget (prop3,secImageSize,"Height",1,100,#PB_Spin_Numeric) : SetGadgetText(spinImgHeight,"32")
While WindowEvent():Wend
HideWindow(0,0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
Select EventGadget
Case btn1
MessageRequester("INFO","Button pressed")
Default
; check for PropertyGrid Events (section opened/closed)
CheckPropertyGridSectionClick(prop ,EventGadget,EventType)
CheckPropertyGridSectionClick(prop2,EventGadget,EventType)
CheckPropertyGridSectionClick(prop3,EventGadget,EventType)
EndSelect
EndSelect
ForEver