Module: AccordionGadget (crossplatform)

Share your advanced PureBasic knowledge/code with the community.
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Module: AccordionGadget (crossplatform)

Post by holzhacker »

Image

Recently I needed a accordion gadget for a small project, but had to have the same face on windows and linux and the customer wanted on Linux accordion style.

Then just fit me make this module.

I hope it's helpful to someone, it needs many improvements but think it might be useful for someone who want to collaborate feel free.

------------------------------------------------------------------------------------------------------------------
1.6
[+] Added support for background color to the item AccordionGadget
[+] Added support for item icon in the AccordionGadget

1.5
[+] Added support for gradient colors on the item in the procedure AddAccordionItem
[+] Added the #AccordionGadget_Expand and #AccordionGadget_Portray flags for Accordion widget that changes the item's behavior
[*] Changed the procedure name GetAccordionWidth() to GetAccordionItemWidth()
[*] Changed the procedure name GetAccordionHeight() to GetAccordionItemHeight()
[+] Added the procedure GetAccordionWidth() to get the width of the AccordionGadget
[+] Added the procedure GetAccordionHeight() to get the height of the AccordionGadget

1.4
[+] Added support for MacOS untested
[+] Added GetAccordionWidth e GetAccordionHeight to help treat the content
[-] Removed for...next unnecessary (small optimization)
------------------------------------------------------------------------------------------------------------------

Code: Select all

;-Module AccordionGadget

; Comment :
; Author  : holzhacker - romerio@gmail.com
; Version : v1.6
; OS: Windows, Linux
; Created : 03.01.2016
; Updated : 10.01.2016
; Link EN : http://www.purebasic.fr/english/viewtopic.php?f=12&t=64517

; ***************************************************************************************
; TODO
; Add support for multiple accordions;
; Add better treatment pixel calculation between OS
; Confirm the operation in MacOS
; ***************************************************************************************

DeclareModule Accordion
 
  Global accordions.i = -1
  Global itens.i = -1
  Global ActualAccordionItem.i
  Global FirstRun.i = #True 
 
  Structure Accordion
    gadget.i
    x.i
    y.i
    w.i
    h.i
    dashboard.i
    complement.f
    type.i
  EndStructure
 
  Structure AccordionItens
    accordion.i
    gadget.i
    item.i
    text.s
    x.i
    y.i
    w.i
    h.i
    expanded.i
    gadget_container.i
    state.i
    image_selected.i
    image_unselected.i   
  EndStructure
  
  Enumeration ; Types of Accordions
    #AccordionGadget_Expand
    #AccordionGadget_Portray
    #AccordionGadget_Animated
  EndEnumeration
 
  Global Dim Accordion.Accordion(0)
  Global Dim AccordionItens.AccordionItens(0)
 
  Declare.i AccordionGadget(x, y, w, h, TypeAccordion.i)
  Declare.i AddAccordionItem(gadget, text$, backcolor_.i=$763B0A, frontcolor_.i=$D1B499, imageid_.i=0)
  Declare.i UseAccordionGadgetItemList(item)
  Declare.i SetActiveItemAccordion(item)
  Declare.i ChangeItemAccordion()
  Declare.i GetActiveItemAccordion()
  Declare.i SetAccordionComplement(complement.f)
  Declare.i GetAccordionItemWidth(item)
  Declare.i GetAccordionItemHeight(item)
  Declare.i GetAccordionWidth()
  Declare.i GetAccordionHeight()  
  Declare.i SetAccordionBackColor(item.i, color.i)
  
EndDeclareModule

Module Accordion
  
  Procedure.i GetBackgroundColor()
    CompilerIf (#PB_Compiler_OS = #PB_OS_Windows)
      ProcedureReturn (GetSysColor_(#COLOR_BTNFACE))
    CompilerElse
      ProcedureReturn ($EAEAEA)
    CompilerEndIf  
  EndProcedure
  
  Procedure.i Arrow(X1,Y1,Direction = - 1,ArrowLineWidth = 2, Size = 4, ArrowColor = 0)
    ;http://www.purebasic.fr/english/viewtopic.php?f=12&t=64377
    Protected I
    X1 = X1 + Size*2
    DrawingMode(#PB_2DDrawing_Default)
    For i = 1 To Size
      If Direction = 1
        ; Up
        LineXY(((X1-(1))+i),(Y1+i),((X1-(1))+i),(Y1+i)+ArrowLineWidth,ArrowColor )
        LineXY(((X1+(1))-i),(Y1+i),((X1+(1))-i),(Y1+i)+ArrowLineWidth,ArrowColor )
      ElseIf Direction = - 1
        ; Down
        LineXY(((X1-Size)+i),(Y1+i),((X1-Size)+i),(Y1+i)+ArrowLineWidth,ArrowColor )
        LineXY(((X1+Size)-i),(Y1+i),((X1+Size)-i),(Y1+i)+ArrowLineWidth,ArrowColor )
      EndIf
    Next
  EndProcedure 
 
  Procedure.i ChangeItemAccordion()
    For ii= 0 To itens
      If AccordionItens(ii)\gadget = EventGadget()
        ActualAccordionItem = ii
        If AccordionItens(ActualAccordionItem)\expanded = #True
          AccordionItens(ActualAccordionItem)\expanded = #False 
        Else
          AccordionItens(ActualAccordionItem)\expanded = #True
        EndIf         
        SetActiveItemAccordion(ii)
      EndIf
    Next
  EndProcedure
 
  Procedure.i AccordionGadget(x, y, w, h, TypeAccordion.i)
    accordions = accordions + 1
    ReDim Accordion.Accordion(accordions)
   
    Accordion(accordions)\gadget = ContainerGadget(#PB_Any, x, y, w, h, #PB_Container_Flat)
    Accordion(accordions)\x = x
    Accordion(accordions)\y = y
    Accordion(accordions)\w = w
    Accordion(accordions)\h = h
    Accordion(accordions)\dashboard = w
    Accordion(accordions)\complement = 12.3
    Accordion(accordions)\type = TypeAccordion
    CloseGadgetList()
    ProcedureReturn Accordion(accordions)\gadget
  EndProcedure
 
 
  Procedure.i AddAccordionItem(gadget, text$, backcolor_.i=$763B0A, frontcolor_.i=$D1B499, imageid_.i=0)
    itens = itens + 1
    ReDim AccordionItens.AccordionItens(itens)   

    tmpFnt1= LoadFont(#PB_Any, "Anonymous Pro Minus", 16*0.5, #PB_Font_HighQuality)
    tmpFnt2= LoadFont(#PB_Any, "Anonymous Pro Minus", 17*0.5, #PB_Font_HighQuality|#PB_Font_Bold)   
    
    If backcolor_ = #PB_Ignore
      backcolor_  = $763B0A
    EndIf 
    If frontcolor_ = #PB_Ignore
      frontcolor_ = $D1B499
    EndIf 
    
    OpenGadgetList(gadget)
    If Accordion(ii)\gadget = gadget   
      If itens > 0       
        yy.i = 0
        For ii= 0 To itens -1
          ResizeGadget(AccordionItens(ii)\gadget, AccordionItens(ii)\x, AccordionItens(ii)\y, #PB_Ignore, #PB_Ignore)
          yy = yy + GadgetHeight(AccordionItens(ii)\gadget) + 2; + 10
          Gadget = AccordionItens(ii)\gadget
          accordionID = AccordionItens(ii)\accordion
        Next
      EndIf
   
      AccordionItens(itens)\accordion = accordions -1         
      AccordionItens(itens)\item = item
      AccordionItens(itens)\x = GadgetX(Gadget)-1
      AccordionItens(itens)\y = yy*1
      AccordionItens(itens)\w = GadgetWidth(Gadget); - 10
      AccordionItens(itens)\h = 20
      
      ;Selected
      AccordionItens(itens)\image_selected = CreateImage(#PB_Any, AccordionItens(itens)\w, AccordionItens(itens)\h)
      StartDrawing(ImageOutput(AccordionItens(itens)\image_selected))
      DrawingMode(#PB_2DDrawing_Gradient)
      BackColor(backcolor_)
      FrontColor(frontcolor_)
      LinearGradient(0, 0, AccordionItens(itens)\w, AccordionItens(itens)\h)           
      Box(0,0,AccordionItens(itens)\w, AccordionItens(itens)\h, $8F3000)
      DrawingMode(#PB_2DDrawing_AlphaBlend)
      If imageid_ > 0
        DrawImage(ImageID(imageid_), 0, -((ImageHeight(imageid_)-20)/2), 38, 38)
      EndIf 
      DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor(RGB(255,255,255))
      DrawingFont(FontID(tmpFnt2))
      If imageid_ > 0
        DrawText(10 + ImageWidth(imageid_), 3, Text$)
      Else
        DrawText(10, 3, Text$)
      EndIf 
      Arrow(AccordionItens(itens)\w-30,AccordionItens(itens)\h/2-4,-1,2,4, RGB(255,255,255))               
      StopDrawing()             
     
      ;UnSelected
      AccordionItens(itens)\image_unselected= CreateImage(#PB_Any, AccordionItens(itens)\w, AccordionItens(itens)\h)
      StartDrawing(ImageOutput(AccordionItens(itens)\image_unselected))
      Box(0,0,AccordionItens(itens)\w, AccordionItens(itens)\h, GetBackgroundColor()); RGB(228,228,228))
      DrawingMode(#PB_2DDrawing_Transparent)
      FrontColor(RGB(128,128,128))
      DrawingFont(FontID(tmpFnt1))
      DrawText(10, 4, Text$)
      Arrow(AccordionItens(itens)\w-30,AccordionItens(itens)\h/2-4,1,2,4)  
      If itens > 0
        Line(0, 0, AccordionItens(itens)\w, 1, RGB(188,188,188))
      EndIf 
      StopDrawing()             
     
      AccordionItens(itens)\gadget = ImageGadget(#PB_Any, AccordionItens(itens)\x, AccordionItens(itens)\y, AccordionItens(itens)\w, AccordionItens(itens)\h, ImageID(AccordionItens(itens)\image_unselected))
     
      CompilerIf #PB_Compiler_OS = #PB_OS_Windows
        AccordionItens(itens)\gadget_container  = ContainerGadget(#PB_Any, GadgetX(Gadget), yy+31, GadgetWidth(Gadget), Accordion(0)\dashboard)
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
        AccordionItens(itens)\gadget_container  = ContainerGadget(#PB_Any, GadgetX(Gadget), yy+31, GadgetWidth(Gadget)-12, Accordion(0)\dashboard - 400-(yy+31))
      CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
        AccordionItens(itens)\gadget_container  = ContainerGadget(#PB_Any, GadgetX(Gadget), yy+31, GadgetWidth(Gadget)-12, Accordion(0)\dashboard - 400-(yy+31))
      CompilerEndIf               
     
      AccordionItens(itens)\State = #True
      
      Accordion(0)\dashboard = Accordion(0)\dashboard - (AccordionItens(itens)\h + AccordionItens(itens)\x + 1)
     
      ;SetGadgetColor(AccordionItens(itens)\gadget_container, #PB_Gadget_BackColor, RGB(Random(255),Random(255),Random(255)))
     
    EndIf
   
    BindGadgetEvent(AccordionItens(itens)\gadget, @ChangeItemAccordion(), #PB_EventType_LeftClick)
    
    
;    If Accordion(accordions)\type = #AccordionGadget_Expand
      SetActiveItemAccordion(0)
;    EndIf 
    
   
  EndProcedure
 
  Procedure.i UseAccordionGadgetItemList(item)
    OpenGadgetList(AccordionItens(item)\gadget)
  EndProcedure
 
  Procedure.i GetActiveItemAccordion() 
    ProcedureReturn ActualAccordionItem
  EndProcedure

  Procedure.i SetActiveItemAccordion(itemAccordion.i)
    Protected difference=1
   
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      jump = Accordion(0)\h - ((itens * 2) * Accordion(0)\complement)
    CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
      jump = Accordion(0)\h - ((itens * 2)) + Accordion(0)\complement
    CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS      
      jump = Accordion(0)\h - ((itens * 2)) + Accordion(0)\complement
    CompilerEndIf     

    For i=0 To itens
      HideGadget(AccordionItens(i)\gadget_container, #True)
      
      If i-itemAccordion>=1
          CompilerIf #PB_Compiler_OS = #PB_OS_Windows
            difference=jump
          CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
            difference=Accordion(0)\h
          CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
            difference=Accordion(0)\h
          CompilerEndIf   
        EndIf
        
        If Accordion(accordions)\type = #AccordionGadget_Expand
          ResizeGadget(AccordionItens(i)\gadget,0,(GadgetHeight(AccordionItens(i)\gadget)*i+difference)-1,Accordion(0)\w,#PB_Ignore)
        ElseIf Accordion(accordions)\type = #AccordionGadget_Portray
          If AccordionItens(ActualAccordionItem)\expanded = #True
            ResizeGadget(AccordionItens(i)\gadget,0,(GadgetHeight(AccordionItens(i)\gadget)*i+difference)+1,Accordion(0)\w,#PB_Ignore)
          Else
            ResizeGadget(AccordionItens(i)\gadget,0,(i*20)+2,Accordion(0)\w,#PB_Ignore)
            HideGadget(AccordionItens(i)\gadget_container, #True)
          EndIf 
        EndIf 
        
        If i = itemAccordion
            CompilerIf #PB_Compiler_OS = #PB_OS_Windows
              ResizeGadget(AccordionItens(i)\gadget_container,1,GadgetHeight(AccordionItens(i)\gadget)+GadgetHeight(AccordionItens(i)\gadget)*i+difference,GadgetWidth(AccordionItens(i)\gadget),jump); - ((itens*2)))
            CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
              ResizeGadget(AccordionItens(i)\gadget_container,1,GadgetHeight(AccordionItens(i)\gadget)+GadgetHeight(AccordionItens(i)\gadget)*i+difference,GadgetWidth(AccordionItens(i)\gadget),jump)
            CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
              ResizeGadget(AccordionItens(i)\gadget_container,1,GadgetHeight(AccordionItens(i)\gadget)+GadgetHeight(AccordionItens(i)\gadget)*i+difference,GadgetWidth(AccordionItens(i)\gadget),jump)
            CompilerEndIf
            
            If Accordion(accordions)\type = #AccordionGadget_Expand
              SetGadgetState(AccordionItens(i)\gadget,  ImageID(AccordionItens(i)\image_selected))
              HideGadget(AccordionItens(ActualAccordionItem)\gadget_container, #False)
            ElseIf Accordion(accordions)\type = #AccordionGadget_Portray
              If AccordionItens(ActualAccordionItem)\expanded = #True
                SetGadgetState(AccordionItens(i)\gadget,  ImageID(AccordionItens(i)\image_selected))
                HideGadget(AccordionItens(ActualAccordionItem)\gadget_container, #False)
              Else
                SetGadgetState(AccordionItens(i)\gadget,  ImageID(AccordionItens(i)\image_unselected))
                HideGadget(AccordionItens(ActualAccordionItem)\gadget_container, #True)
              EndIf                           
            EndIf 
            AccordionItens(i)\state = #True  
          Else
            SetGadgetState(AccordionItens(i)\gadget,  ImageID(AccordionItens(i)\image_unselected))
            If Accordion(accordions)\type = #AccordionGadget_Expand
              HideGadget(AccordionItens(i)\gadget_container, #True)
            ElseIf Accordion(accordions)\type = #AccordionGadget_Portray
              If AccordionItens(ActualAccordionItem)\expanded = #True
                HideGadget(AccordionItens(ActualAccordionItem)\gadget_container, #False)
              Else
                HideGadget(AccordionItens(i)\gadget_container, #True)
              EndIf             
            EndIf             
            AccordionItens(i)\state = #False 
          EndIf
    Next
  EndProcedure   
 
  Procedure.i SetAccordionComplement(complement.f)
    Accordion(0)\complement.f = complement.f
    SetActiveItemAccordion(ActualAccordionItem)
  EndProcedure
  
  Procedure.i GetAccordionItemWidth(item)
    For ii= 0 To itens
      If ii = item
        ProcedureReturn GadgetWidth(AccordionItens(ii)\gadget_container)
      EndIf
    Next
  EndProcedure
  
  Procedure.i GetAccordionItemHeight(item)
    For ii= 0 To itens
      If ii = item
        ProcedureReturn GadgetHeight(AccordionItens(ii)\gadget_container)
      EndIf
    Next
  EndProcedure
  
  Procedure.i GetAccordionWidth()
    ProcedureReturn GadgetWidth(Accordion(0)\gadget)
  EndProcedure
  
  Procedure.i GetAccordionHeight()
    ProcedureReturn GadgetHeight(Accordion(0)\gadget)
  EndProcedure
  
  Procedure.i SetAccordionBackColor(item, color)
    SetGadgetColor(AccordionItens(item)\gadget_container, #PB_Gadget_BackColor, color)
  EndProcedure
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  UseModule Accordion
 
  Global Window_0 
  Global Container_0, ScrollArea_0, ButtonImage_0, Container_1
 
  OpenWindow(0, 0, 0, 800, 500, "Example AccordionGadget", #PB_Window_SystemMenu|#PB_Window_WindowCentered|#PB_Window_ScreenCentered)
    
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    gadget.i = AccordionGadget(10, 10, 710, 480, #AccordionGadget_Portray)
  CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
    gadget.i = AccordionGadget(10, 10, 710, 400, #AccordionGadget_Portray)
  CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
    gadget.i = AccordionGadget(10, 10, 710, 400, #AccordionGadget_Portray)
  CompilerEndIf   
  
  UsePNGImageDecoder()
  tmp1 = CatchImage(#PB_Any, ?coinsicon_png_start)
  tmp2 = CatchImage(#PB_Any, ?clouds_png_start)
    
  AddAccordionItem(gadget, "Gadget.pb", $00006E, $FFDFF6, tmp1)
  ;{ 
    #WindowWidth  = 390
    #WindowHeight = 350   
    Top = 10
    GadgetHeight = 24
 
    FrameGadget(#PB_Any, 10, Top, 370, 290, "Player...") : Top+20
 
    StringGadget(0,  20, Top, 200, GadgetHeight, "")
    ButtonGadget(1, 223, Top,  72, GadgetHeight, "Play")
    ButtonGadget(2, 295, Top,  72, GadgetHeight, "Stop")  : Top+35
    DisableGadget(2,1)
   
    GadgetToolTip(1,"Play the current song")
   
    PanelGadget(3, 20, Top, #WindowWidth-50, #WindowHeight-Top-60)
      AddGadgetItem(3, 0, "MP3 PlayList")
        ListViewGadget(4, 6, 10, 230, 148)
 
        For k=0 To 30
          AddGadgetItem(4, -1, "Music Song n° "+Str(k))
        Next
 
        ButtonGadget(5,  250, 10, 80, GadgetHeight, "Add")
        ButtonGadget(6,  250, 38, 80, GadgetHeight, "Remove")
        ButtonGadget(7,  250, 66, 80, GadgetHeight, "Select")
        GadgetToolTip(7, "Select the current song")
       
        TrackBarGadget(17, 10, 168, 310, 25, 0, 100)
 
      AddGadgetItem(3, 1, "Options")
        Top = 10
        CheckBoxGadget(10, 10, Top, 250, GadgetHeight, "Enable low-pass filter") : Top+30
        CheckBoxGadget(11, 10, Top, 250, GadgetHeight, "Enable visual plug-in")  : Top+30
        ComboBoxGadget(12, 10, Top, 250, 21) : Top+30
          AddGadgetItem(12, -1, "FireWorks")
          AddGadgetItem(12, -1, "OpenGL spectrum")
          AddGadgetItem(12, -1, "Bump bass")
        SetGadgetState(12,0)
        DisableGadget(12,1)
       
        OptionGadget(13, 10, Top, 80, GadgetHeight, "640*480") : Top+20
        OptionGadget(14, 10, Top, 80, GadgetHeight, "800*600") : Top+20
        OptionGadget(15, 10, Top, 80, GadgetHeight, "1024*768")
        SetGadgetState(13, 1)
       
        ButtonGadget(16, 150, Top, 80, GadgetHeight, "Info")
    CloseGadgetList()
 
    TextGadget  (9, 10, #WindowHeight-30, 250, 24, "PureBasic - Gadget demonstration")
    ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")
 
    SetGadgetState(3, 0)
  ;}   
  CloseGadgetList()

  AddAccordionItem(gadget, "GadgetAdvanced.pb", $007900, $BBFFB7)
  ;{ 
    ListIconGadget(55, 170, 50, 265, 200, "Column 1", 131)
    AddGadgetColumn(55, 1, "Column 2", 300)
    AddGadgetColumn(55, 2, "Column 3", 80)
   
    TextGadget(54, 10, 16, 180, 24, "Please wait while initializing...")
   
    ProgressBarGadget(53, 10, 260, #WindowWidth-25, 20, 0, 100)
   
    ; Update the ProgressBar, just for fun !
    ;
    For k=0 To 100
      SetGadgetState(53, k)
      Delay(10)
    Next
   
    ButtonGadget(50, 200, 5, 0, 0, "button1")
    ButtonGadget(51, 384, 5, 50, 36, "button2")
   
    TreeGadget    (52,  10, 50, 150, 200)
     
    SetGadgetText(54, "Initialize Ok... Welcome !")
   
    ; Fill Up the Tree gadget with lot of entries (including the image)
    ;
   
    For k=0 To 10
      AddGadgetItem(52, -1, "General "+Str(k))
      AddGadgetItem(52, -1, "ScreenMode")
        AddGadgetItem(52, -1, "640*480", 0, 1)
        AddGadgetItem(52, -1, "800*600", 0, 1)
        AddGadgetItem(52, -1, "1024*768", 0, 1)
        AddGadgetItem(52, -1, "1600*1200", 0, 1)
      AddGadgetItem(52, -1, "Joystick")
    Next
     
    ; Fill Up the ListIcon gadget. Notice than the column are separated by Chr(10) (NewLine) character
    ;
    For k=0 To 100
      AddGadgetItem(55, -1, "Element "+Str(k)+Chr(10)+"C 2"+Chr(10)+"Comment 3", 0)
    Next
   
    SetGadgetState(55, 8)   
  ;}     
  CloseGadgetList()   
  AddAccordionItem(gadget, "WebBrowser.pb", #PB_Ignore, #PB_Ignore, tmp2)
    ButtonGadget(71,   0, 0, 50, 25, "Back")
    ButtonGadget(72,  50, 0, 50, 25, "Next")
    ButtonGadget(73, 100, 0, 50, 25, "Stop")
 
    StringGadget(74, 155, 0, 520, 20, "http://www.purebasic.com")
   
    ButtonGadget(75, 675, 0, 25, 25, "Go")
    
    If WebGadget(710, 0, 31, 705, 370, "http://www.purebasic.com") = 0
     
      CompilerIf #PB_Compiler_OS = #PB_OS_Windows
        MessageRequester("Error", "ATL.dll not found", 0)
       
      CompilerElse ; Linux and OX uses Webkit
        MessageRequester("Error", "Webkit library not found", 0)
      CompilerEndIf
     
      End ; Quit
    EndIf
   
    AddKeyboardShortcut(0, #PB_Shortcut_Return, 0)
   
  CloseGadgetList()   
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    SetAccordionComplement(16)
  CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
    SetAccordionComplement(2)
  CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS 
    SetAccordionComplement(2)
  CompilerEndIf   

  Debug GadgetHeight(Accordion::Accordion(0)\gadget)
  
  Debug "---"
  Debug GetAccordionWidth()
  Debug GetAccordionHeight()
  
  SetAccordionBackColor(1, $00FFB7)  
  
  Repeat
    event = WaitWindowEvent(1)
   
    Select event
      Case #PB_Event_Menu
        Select EventMenu()
        EndSelect
 
      Case #PB_Event_Gadget
        Select EventGadget()
           
            Case 0
              If EventType() = #PB_EventType_ReturnKey
                MessageRequester("Info", "Return key pressed", 0)
                SetActiveGadget(0)
              EndIf
             
            Case 1 ; Play
              DisableGadget(2,0)  ; Enable the 'Stop' gadget
              DisableGadget(1,1)  ; Disable the 'Play' Gadget
              
            Case 2 ; Stop
              DisableGadget(1,0)  ; Enable the 'Play' gadget
              DisableGadget(2,1)  ; Disable the 'Stop' Gadget
           
            Case 4
              If EventType() = 2
                SetGadgetText(0, GetGadgetText(4)) ; Get the current item from the ListView..
              EndIf
   
            Case 5 ; Add
              AddGadgetItem(4, -1, "New Item Added...")
   
            Case 6 ; Remove
              RemoveGadgetItem(4, GetGadgetState(4)) ; Remove the current element of the ListView
   
            Case 7 ; Select
              SetGadgetText(0, GetGadgetText(4)) ; Get the current item from the ListView..
     
            Case 8 ; Quit...
              Event = #PB_Event_CloseWindow
   
            Case 11 ; Enable PlugIn..
              DisableGadget(12, 1-GetGadgetState(11))
             
            Case 16 ;
              If GetGadgetState(13) : Result$ = GetGadgetText(13) : EndIf
              If GetGadgetState(14) : Result$ = GetGadgetText(14) : EndIf
              If GetGadgetState(15) : Result$ = GetGadgetText(15) : EndIf
             
              MessageRequester("Info", "Selected screen mode: "+Result$, 0)
           
            Case 17
              SetGadgetText(0, Str(GetGadgetState(17)))
             
            Case 51
              MessageRequester("Information", "You did it !", 0)
         
            Case 52
              SetGadgetText(4, "Tree Gadget. Item selected: "+Str(GetGadgetState(2)))
             
              If EventType() = 2
                MessageRequester("Information", "Doubleclick: item"+Str(GetGadgetState(2))+", Text: "+GetGadgetText(2), 0)
              ElseIf EventType() = 1
                DisplayPopupMenu(0, WindowID(0))
              EndIf
             
            Case 55
              SetGadgetText(4, "ListIcon Gadget. Item selected: "+Str(GetGadgetState(5)))
             
              If EventType() = 2
                MessageRequester("Information", "Doubleclick: item"+Str(GetGadgetState(5))+", Text: "+GetGadgetText(5), 0)
              ElseIf EventType() = 1
                DisplayPopupMenu(0, WindowID(0))
              EndIf             
             
          Case 71
            SetGadgetState(710, #PB_Web_Back)
         
          Case 72
            SetGadgetState(710, #PB_Web_Forward)
         
          Case 73
            SetGadgetState(710, #PB_Web_Stop)
         
          Case 75
            SetGadgetText(710, GetGadgetText(74))             
             
        EndSelect
    EndSelect   
   
  Until event = #PB_Event_CloseWindow
  
  DataSection
    coinsicon_png_start:
      ; size : 1288 bytes
      Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$414449CF040000F4
      Data.q $1C4FDB97EDDA7854,$0B3BB333BFC71C55,$6F62A5D965974B2C,$36B6311B135A4D26,$E178AD009AB4A35A
      Data.q $5FEA3E6FAC66F8D6,$6CDF6A3193EA4FA1,$3EA7D07C1A5469A1,$56354A6942B5A268,$59765D858665CB4A
      Data.q $05D60173BF1736F6,$DD9EC9C62635D064,$E7CEFEF9CCE739D9,$B843B7804677CEFC,$5BFF1AA1E3E9C9F5
      Data.q $3656D40414E8497E,$C99239BA4AE44D30,$EB3BF86D7E1EEF6B,$FFBBE3687B1BA792,$5F19E0F183974BD9
      Data.q $36915E21C2F82ECB,$4A6865A9680CD2B6,$E5C0E0FC3325591A,$07521010D5ABAD97,$DCCCC24F5391D3BB
      Data.q $1055D392E0D6A462,$45882115FF636FD6,$0352F7AC449B7E2C,$E85CACD010D5322B,$6057533023FD6350
      Data.q $8A5B1927E400FF2C,$1953C75885A745BD,$D66F5013D043A182,$357CCD63143BDE22,$B576559F9F12C404
      Data.q $0441EC63DD5F0EBF,$8559280E71661646,$1621A61661E71463,$788A2B7A8598CC29,$9009AAD57D9C60CF
      Data.q $3291907E20461F5B,$177F34D2840CD2F2,$0D3430E8443A9820,$173146497E42565A,$2257E80AAA95EC40
      Data.q $318CB3AF5451E79D,$690A30B3CBE809E8,$0205209772E241DE,$61634C6FA8FC1B90,$4F84A03033DAA6B2
      Data.q $F3D47B28F754839E,$33F4B1855DA70AD2,$B119CF239F64B944,$441FE9B37044E810,$0B7E9C33FD38A520
      Data.q $86030623534422C1,$FF823FF2B0475A5E,$06FFA3043281821E,$41106F73F0955782,$42828164B1D6FF1B
      Data.q $33B7736086ABB704,$F0C9038D0CBF0FAD,$20FE1BB2D020F645,$022AD11BDA4C2D07,$8519290442B042D3
      Data.q $D6D80B3C86089915,$34C974EE45116CED,$44579F81FA49B34A,$AA41880FC705B918,$65A81A3141AFE1A9
      Data.q $AE76ADB2CCDDA9D3,$9530659DBAE53DDB,$80A116441568E76E,$24600FFEF11555C4,$CC8A931A453338C6
      Data.q $61DDE41C8C9435F8,$B34235B65BBD1AF8,$B9815DF58D4BB172,$61DE793DF3230234,$76ED844744AB24E3
      Data.q $11FA8CA1E6EDD701,$25C4639B9000FE3D,$E7D10927E50E8288,$E6C4116C4ECCC04F,$4A33C194C6D56D96
      Data.q $0C428FEAF81E99F8,$894052F93280E01C,$9F325DFCDEB2CD0B,$DF55CC3C653B7359,$8B316022EF3B3D00
      Data.q $65BAC418F11D9F88,$020C456EA1D402DB,$8310C3E6E4236881,$883DE28DC73221FB,$E76EBA99B17B2985
      Data.q $E7645A428FC96E79,$A4A08982946088F7,$83EC9E344BFAF942,$ED96AB1053CC742F,$EC8A7E75340CE008
      Data.q $19B6B10CBA0E05C4,$BBE76B332D093E66,$2F9E6EB502977CCE,$821663D10FABF121,$42E51D43A8810759
      Data.q $AED96E51053D106C,$3C112F7B70941780,$AB59A7E1D7B0210E,$5B29F91465F237FD,$151B940CDAE79DBD
      Data.q $EBB44133E5724408,$59BEB104BDB7B23C,$E2A3417AA2408A6D,$94FAAAC6F535FDE2,$F82054F4110CF91F
      Data.q $747044FD53911866,$8088BFAB36CA20FB,$022E68167944F059,$0473B17E65105BC1,$4F38E9BD88F1FA96
      Data.q $81122F44F16E56FE,$642FAA020EFE20D7,$E921AD83AEE75603,$8833F0F78E4CE997,$E3DE40839F7B7091
      Data.q $62C4158C8833A104,$29BEC43FA9AC1135,$C7C761FEB8699777,$902344089C340F7B,$82528833D52087A3
      Data.q $D3E434AC1053CB4F,$7BDDC41DA20593B3,$19DC7B86E723D5C6,$35C5BEAC77678220,$E77BEC5EF7040B1B
      Data.q $F1FD62DA3B17B6CD,$23C1D76DC988F946,$494027C533119BB9,$DBE2EE71FABEC6E6,$56F6931582FB5FEF
      Data.q $A17DD6A5E751F63C,$3E1E2FEB1EAA77A7,$040B8589A951EB16,$83850F23C62F7741,$F1DD3B6EB2A4EE37
      Data.q $B82CB0C9D02A3072,$E3D54EF77D53F7EA,$6859F801965EAF8F,$59662D5DA75D908B,$2184CF42CF22DE61
      Data.q $787A83638AFA99FC,$56E565B0132CF978,$830F7AA579D837EA,$34D0D4290EFC7B6F,$00000000C3DC183E
      Data.q $826042AE444E4549
    coinsicon_png_end:
    
    clouds_png_start:
      ; size : 1232 bytes
      Data.q $0A1A0A0D474E5089,$524448490D000000,$2000000020000000,$7A7A730000000608,$58457419000000F4
      Data.q $72617774666F5374,$2065626F64410065,$6165526567616D49,$00003C65C9717964,$DA78544144497204
      Data.q $FE14551C4C5D57EC,$B82D281677766766,$69A9A2A58FCA0285,$83EC694908AD0C49,$290BEA26AD0A60C1
      Data.q $317C63469A1F60BC,$128989AD0F8C5F51,$80915890DAD1360D,$8A6B5A307C4C6A92,$5DF974B6910D34A6
      Data.q $F9D9DD816597767E,$80967E56BB3B9EBD,$973321C9BD83C215,$AEF77CE73BE7E733,$78B6072E56C318C0
      Data.q $52D61003CB600FDD,$C792CCACF69DFA78,$EC92EC834F1EDCDB,$E7AF94C6A037553D,$E18BE6F0FF346E87
      Data.q $2DA53D3399EE0B4D,$EBE5B0A83FAC83DD,$AB36E3A97B18D1C7,$F5FE449EBA53DB3D,$43F7C6FBC6753CAA
      Data.q $837E4BB19305B3B6,$ED301AFCB6E88E75,$AA882997B18C7F7D,$6D5A47EAF7BD6753,$05D5EBDCE6BFBBDF
      Data.q $1243A03970B412B8,$F89A8E18D6726912,$158D0B8F79A0243D,$6EDA39D0EE68F805,$A5D53D09AA363120
      Data.q $BAD3CB88BA637539,$937452471490A51D,$A465F22A2A9B93E1,$0448D9BFC75EDF6F,$7618095C6E19B9DC
      Data.q $57F168BEA64B16CE,$6D925C26837A04D5,$26380151BF324DC6,$AD6EF702DBA20315,$514E1CA8C7F7C4A2
      Data.q $C51041C050F76340,$4D1DE3A123575D55,$8A18D759549B7E4F,$A32327B1FEB85C2F,$B3183A6B881C1449
      Data.q $0DA56B2C2158FE50,$DB3CFA2C046C1041,$37072E0B8E40E025,$471DEF6898A02026,$B5D352D9DF57D460
      Data.q $FB3FC7880895BB12,$A289F1AF2CAAADA3,$0EAE183149C3F06C,$B9639D94EAAA22CF,$B0C326C63AE3C477
      Data.q $20837D1164DB030C,$6A2F1ED546ECFE5D,$B482F95465F0F3CB,$64E32042D7C474F9,$17C63E6F7ABE6F8F
      Data.q $AE4053A67194E84C,$25B266874440C247,$4E10C9E98E8AA3CE,$1B189794EF9484D3,$5BD8136FC1F1C508
      Data.q $1AAAA0E7C63713B4,$F17F533C2C44D34C,$C808E12554EE81C4,$B4CDD89840C453B2,$71AA3F832A22C06C
      Data.q $59468BD35A7BB87F,$D237747AD0854F4E,$8C4921A01D3E7FE8,$6B0F8C80F055010D,$943D943E77DAF04B
      Data.q $37D0B34442594C83,$6A92891A4A927420,$144B1A70D4331D0C,$06A0C0D512FF258B,$4FF6DA701F33F934
      Data.q $FF7A34016564E2CD,$2131C7CE2C7DFA89,$9DED3AEF69FA1604,$56E20C1D5C41EA7E,$EEC4510428F500C4
      Data.q $333580F1ABBCC7C3,$C54DD88A1C2BBB72,$173B301306245CC5,$281CD27204F0E8C3,$E12695011BD195CB
      Data.q $BA2A54073E973358,$4193C22299A3C4EC,$87C51519EA01FD84,$2403DD8EF1522BEA,$545597BCF7EF75C5
      Data.q $4DF870E8FF4A2B56,$2170F57CA08B2142,$BABB040B9FC05CB2,$88B307194DFD833A,$A4E88C668F894818
      Data.q $FD1E0FF6F43197F5,$03C193C5EE9A95E6,$936491E490764910,$DF79FF3E73D91738,$91902EF3ED8EB7F9
      Data.q $E9C6B0A4F7978209,$6E9764AD413D92C3,$A5EEF93C4C5E0507,$1932591E1B4FD15B,$A5ADBCA549207977
      Data.q $F2BFB852385F6F23,$678CBA5B622DC7BC,$E5E3B6BA3460E5F7,$A1CDD694E95E2C41,$B9AB54281504EE00
      Data.q $2A7760E9A3BEA050,$950D62775D139E7B,$518A9E322670C825,$BBC7D2E678FFAD7D,$B3FED9B094B73D28
      Data.q $8A8A969C3DCF6D0F,$622602510253B23D,$A06B2F6F7AD85489,$A44A3D423090B231,$D149002A93DA5765
      Data.q $AE13607824A7100C,$1026CC6CF1CD1A60,$9B5AAFB5C6005529,$BFD1B12117369681,$DAEE95D1A239F81B
      Data.q $2379542A4603EE45,$1D7E33D7BFC922EE,$055852649FA2338B,$800A4DA53A927725,$2B7D5BA98778345F
      Data.q $803EFFE1B7FF7087,$BAFB4B46001804BF,$00000000E6064E8E,$826042AE444E4549
    clouds_png_end:  
  EndDataSection
    
  
  
CompilerEndIf


Last edited by holzhacker on Sun Jan 10, 2016 5:08 am, edited 7 times in total.
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Module: AccordionGadget

Post by davido »

@holzhacker,

Looks very interesting, I'll try it on Windows when I can.
I tried this on the Mac, but as I suspected (you specified Windows & Linux) it did not run.

I did notice that line 114 : UseGadgetList(GadgetID(gadget))
Should not this use WindowID() ?
DE AA EB
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Re: Module: AccordionGadget

Post by holzhacker »

Hellodavido,
davido wrote:@holzhacker,

Looks very interesting, I'll try it on Windows when I can.
I tried this on the Mac, but as I suspected (you specified Windows & Linux) it did not run.

I did notice that line 114 :UseGadgetList(GadgetID(gadget))

Should not this use WindowID() ?
Hello @davido,

Sorry, every end of year format all my computers, and tested only on windows xp in virtualbox, but thanks to his observation realized something (yes vc this right ... it is a container I should have used the "OpenGadgetList"). ..

replace the line in question to:

Code: Select all

OpenGadgetList(gadget)
The original post has been updated code ... thanks for collaboration,, if it works on Mac please tell me to update the module header.

thank you
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
LuckyLuke
Enthusiast
Enthusiast
Posts: 181
Joined: Fri Jun 06, 2003 2:41 pm
Location: Belgium

Re: Module: AccordionGadget

Post by LuckyLuke »

Very nice.

Should be part of the offical Gadget library I think.

LuckyLuke
User avatar
Kurzer
Enthusiast
Enthusiast
Posts: 676
Joined: Sun Jun 11, 2006 12:07 am
Location: Near Hamburg

Re: Module: AccordionGadget

Post by Kurzer »

Hello holzhacker,

thank you for this nice piece of code. It works very well on my old 32 Bit Windows XP SP3 system. Image

But I noticed a little glitch in the GUI if using with the old "nativ" GUI theme of Windows XP.
In the panel "Webbrowser" the vertical scrollbar is overlapped by the right border for some pixels. It seems the underlying container gadget is not wide enough.

Image
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070, User age in 2025: 57y
"Happiness is a pet." | "Never run a changing system!"
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Re: Module: AccordionGadget

Post by holzhacker »

Hello kurzer,

In fact the adaptation of examples of PureBasic for the accordion was made on the run, and just by differences in pixels presented in the various operating systems that put the function:

Code: Select all

SetAccordionComplement (complement.f)
That performs an adjustment in height of the accordion container.

Now includes two new functions are:

Code: Select all

GetAccordionWidth(item)
GetAccordionHeight(item)
To assist in the accordion container decoration.

Thanks for the comments ... this code can be greatly improved (animations in transitions, better calculation of areas, etc.) feel free to test and modify, and some general change will please publish here I add in the first post code.
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Module: AccordionGadget

Post by davido »

@holzhacker,
I now have tried AccordionGadget on Windows: Works great, thank you very much for sharing.

I have re-checked on my MacBook Pro and find that your revised code breaks on line 114: The specified #gadget is not initialised. I think this might be a PureBasic bug.
Could anyone confirm if this is a bug?
DE AA EB
User avatar
Mindphazer
Enthusiast
Enthusiast
Posts: 460
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: Module: AccordionGadget

Post by Mindphazer »

I don't know if it is a bug
But i have the same issue
MacBook Pro 16" M4 Pro - 24 Gb - MacOS 15.4.1 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4790
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Re: Module: AccordionGadget

Post by Fangbeast »

Holdzhacker, if you click on an arrow to maximise that accordion element, you have to click on another accordion element to minimise the previous one currently.

Could you make it behave like RASHAD'S example so that you can click on the same accordion element to maximise or minimise the others? This should work as his does.

I can beg if you like:):)

Also a stupid question, why are you using longs for procedures? If you use integer types, they should be x64 compatible.
Amateur Radio/VK3HAF, (D-STAR/DMR and more), Arduino, ESP32, Coding, Crochet
morosh
Enthusiast
Enthusiast
Posts: 329
Joined: Wed Aug 03, 2011 4:52 am
Location: Beirut, Lebanon

Re: Module: AccordionGadget

Post by morosh »

If EventType() = #PB_EventType_ReturnKey
this is the first time I noticed #PB_EventType_ReturnKey, it's not included in the help/doc, am i wrong?
PureBasic: Surprisingly simple, diabolically powerful
juror
Enthusiast
Enthusiast
Posts: 232
Joined: Mon Jul 09, 2007 4:47 pm
Location: Courthouse

Re: Module: AccordionGadget

Post by juror »

Very impressive.
Thanks for sharing :)
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Re: Module: AccordionGadget

Post by holzhacker »

davido wrote:@holzhacker,
I now have tried AccordionGadget on Windows: Works great, thank you very much for sharing.

I have re-checked on my MacBook Pro and find that your revised code breaks on line 114: The specified #gadget is not initialised. I think this might be a PureBasic bug.
Could anyone confirm if this is a bug?
Hello @davido,

Unfortunately I do not have a Mac to test :( ... if any lucky owner of a Mac can review the code and adapt and test all we would be very happy :D
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Re: Module: AccordionGadget

Post by holzhacker »

Fangbeast wrote:Holdzhacker, if you click on an arrow to maximise that accordion element, you have to click on another accordion element to minimise the previous one currently.

Could you make it behave like RASHAD'S example so that you can click on the same accordion element to maximise or minimise the others? This should work as his does.

I can beg if you like:):)
Hello Friend,

I do not know if it helps you, the next time I think about deploying is a scrolling animation in transition
Fangbeast wrote: Also a stupid question, why are you using longs for procedures? If you use integer types, they should be x64 compatible.
:oops: I guess because I did quickly module to fulfill an order and have not had time to optimize the code. So I invite all who wish to modify and share individual modifications ... :D
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
User avatar
holzhacker
Enthusiast
Enthusiast
Posts: 125
Joined: Mon Mar 08, 2010 9:14 pm
Location: "Mens sana in corpore sano"
Contact:

Re: Module: AccordionGadget

Post by holzhacker »

morosh wrote:
If EventType() = #PB_EventType_ReturnKey
this is the first time I noticed #PB_EventType_ReturnKey, it's not included in the help/doc, am i wrong?
Hello morosh,

I also looked and not found in the reference documentation.
Greetings and thanks!

Romerio Medeiros
romerio@gmail.com
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Module: AccordionGadget (crossplatform)

Post by Kwai chang caine »

Very nice effect !!! :shock:
Works great on W7 v5.23
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply