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









