SideBarGadget

Share your advanced PureBasic knowledge/code with the community.
User avatar
idle
Always Here
Always Here
Posts: 5042
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

SideBarGadget

Post by idle »

SideBarGadget

A very early alpha version, no idea if it works nicely on Linux but seems to be OK on windows and OSX.

OSX, will look ok but needs a bit of work need to play with fonts and sizes
v1.0.1.7a
demo resize with splitter gadget
returns menu gadget id

v1.0.1.6a
Fixed major Flicker on resize, thanks Caronte3D

v1.0.1.3a
Added auto slide, hover activated by on mouse enter/ leave

V1.0.1.2b
Fixed a few bugs event are working now
changed it so you can set menu IDs and also fires click events for gadget in side bar
Added in the zorder so it can over lap windows only

Bugs:
[done]If we scale the window while the menu is hidden, the menu slide, but a glitch on the hide icon shows (slides) it again.
[done] Horrible Flickers on resize win11

Image
Image
osx tweaked
Image
Image

Code: Select all

;SideBarGadget v1.0.1.7a  PB 5.73 -PB 6.02
;Sliding SideBar Menu 
;Author Idle, slide in and out adapted from falsam (what me worry)  
;licence MIT 
;Windows DPI aware 

DeclareModule SideBarGadget 
  
  Enumeration 
    #Sidebar_Small
    #Sidebar_medium
    #Sidebar_large 
  EndEnumeration 
  
  Prototype pCBSlide()
  
  Declare SideBarGadget(GadgetNumber,window,w,h,FrontColor,BackColor,ActiveColor,bhover.i=#True,font.s="Tahoma",small=11,medium=20,large=36,statusbar=0) 
  Declare AddMenuItem(Gadget,lable.s,lable1.s,menuid.l=0,tooltip.s="",fontsize=#Sidebar_Small,ActiveColor=0,FrontColor=0,BackColor=0) 
  Declare SetMessage(Gadget,msg.s,color=0) 
  Declare.s StrChr(v.i) 
  Declare ForceGadgetZOrder(gadget, zorder = 0) 
  Declare SidebarGetMinWidth(gadget) 
  Declare SetSlideCallback(gadget,*pfn.pCBSlide)
  
EndDeclareModule 

Module SideBarGadget  
  
  EnableExplicit   
  
  #SideBar_Menuclose = -1
  #sideBar_menuOpened  = 0 
  #SideBar_MenuOpen = 1
  
  Structure sidebar_fonts
    font.i[3] 
    color.i
  EndStructure   
  
  Structure SideBar_ID 
    GadgetID.i
    ParentID.i
    Type.i         
    menuid.i
  EndStructure  
  
  Structure SideBar_Menuitems Extends SideBar_ID
    Lable.s 
    Tooltip.s 
    Font.i
    FrontColor.i
    BackColor.i 
    ActiveColor.i
  EndStructure   
  
  Structure SideBar_Gadget  Extends SideBar_ID
    width.i
    maxwidth.i
    height.i
    minHeight.i
    minWidth.i
    left.i
    MinLeft.i
    BackColor.i
    FrontColor.i
    ActiveColor.i 
    MenuState.i
    ShowArrow.s
    HideArrow.s 
    PinArrow.s
    showhidegad.i
    bHover.i 
    hovertime.i
    dwell.i 
    titlesize.i 
    bclick.i
    moving.i
    WindowStatusBar .i        ;window status bar number if any 
    SideMessageColor.i
    SideMessage.s
    *cbSlide.pCBSlide
    Fonts.sidebar_fonts
    List MenuItems.SideBar_Menuitems() 
  EndStructure  
  
  Declare Sidebar_StartSlide()
  Declare SideBar_EventMenu() 
  Declare SideBar_Event()  
  
  Global NewList SideBarGadgets()
  
  Procedure.s StrChr(v.i) 
    Protected high, low
    If v < $10000
      ProcedureReturn Chr(v)
    Else
      v - $10000
      high = (v >> 10) + $D800  
      low = (v & 1023) + $DC00  
      ProcedureReturn Chr(high) + Chr(low)
    EndIf
  EndProcedure
  
  Global sfx.d,sfy.d 
  
  sfx = DesktopResolutionX() 
  sfy = DesktopResolutionY() 
  
  Macro _GadgetWidth(gad) 
    (GadgetWidth(gad)*sfx) 
  EndMacro   
  
  Macro _GadgetHeight(gad) 
    (GadgetHeight(gad)*sfy) 
  EndMacro   
  
  CompilerIf #PB_Compiler_OS <> #PB_OS_Windows 
    Macro LockWindowUpdate_(ew) : EndMacro() 
    Macro UpdateWindow_(ew) : EndMacro()   
  CompilerEndIf  
  
  Procedure SideBar_Draw()   
    Protected timg,w,h,x,y,cy,ph =10
    Protected gadget,*sidebar.SideBar_Gadget=0
    Protected menuid,bfirst=1  
    Protected wid = WindowID(EventWindow())
    
    LockWindowUpdate_(wid)    
    
    gadget = EventGadget() 
    
    If IsGadget(gadget) 
      *sidebar = GetGadgetData(gadget)
      If *sidebar <> 0  
        ForEach *sidebar\MenuItems() 
          If (IsGadget(*sidebar\MenuItems()\ParentID) And GadgetWidth(*sidebar\MenuItems()\ParentID) = 0)  
            timg = CreateImage(#PB_Any,1,1)            
            StartDrawing(ImageOutput(timg))
            DrawingFont(FontID(*sidebar\MenuItems()\font))  
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS 
              w = DesktopUnscaledX(TextWidth(*sidebar\MenuItems()\lable)) *1.5
              h = DesktopUnscaledY(TextHeight(*sidebar\MenuItems()\lable)) * 1.5 
            CompilerElse 
              w = DesktopUnscaledX(TextWidth(*sidebar\MenuItems()\lable)) 
              h = DesktopUnscaledY(TextHeight(*sidebar\MenuItems()\lable))
            CompilerEndIf 
            
            StopDrawing()  
            FreeImage(timg)
            
            ResizeGadget(*sidebar\MenuItems()\ParentID,10,ph,w,h) 
            
            If *sidebar\MenuItems()\tooltip <> "" 
              GadgetToolTip(*sidebar\MenuItems()\ParentID, *sidebar\MenuItems()\tooltip) 
            EndIf   
            ph+h*1.5
            If w >= *sidebar\maxwidth 
              *sidebar\maxwidth = w 
            EndIf   
            SetGadgetColor(*sidebar\MenuItems()\ParentID,#PB_Gadget_FrontColor,*sidebar\MenuItems()\frontcolor)   
            SetGadgetColor(*sidebar\MenuItems()\ParentID,#PB_Gadget_BackColor,*sidebar\MenuItems()\BackColor)   
            SetGadgetFont(*sidebar\MenuItems()\ParentID,FontID(*sidebar\MenuItems()\font))
            SetGadgetData(*sidebar\MenuItems()\ParentID,*sidebar\MenuItems()) 
            BindEvent(#PB_Event_Gadget,@SideBar_EventMenu(),*sidebar\ParentId,*sidebar\MenuItems()\ParentID)  
            
          Else 
            w =  GadgetWidth(*sidebar\MenuItems()\ParentID) * 1.5
            If w >= *sidebar\maxwidth 
              *sidebar\maxwidth = w 
            EndIf  
            SetGadgetText(*sidebar\MenuItems()\ParentID,*sidebar\MenuItems()\lable)
          EndIf 
        Next 
        
        If Not IsGadget(*sidebar\ShowHideGad) 
          timg = CreateImage(#PB_Any,1,1)            
          StartDrawing(ImageOutput(timg))
          DrawingFont(FontID(*sidebar\fonts\font[1]))  
          
          If *sidebar\ShowArrow = "" 
            *sidebar\ShowArrow = strchr($25B6) 
          EndIf  
          If *sidebar\HideArrow = "" 
            *sidebar\HideArrow = strchr($25C0) 
          EndIf 
          If *sidebar\PinArrow = "" 
            *sidebar\pinArrow = strchr($23F8)  
          EndIf   
          
          CompilerIf #PB_Compiler_OS = #PB_OS_MacOS 
            w = TextWidth(*sidebar\ShowArrow) * 1.5
            h = TextHeight(*sidebar\ShowArrow)  * 1.5 
          CompilerElse 
            w = TextWidth(*sidebar\ShowArrow) 
            h = TextHeight(*sidebar\ShowArrow)  
          CompilerEndIf 
          
          StopDrawing()  
          FreeImage(timg)
          
          If bfirst  
            *sidebar\titlesize = h 
            bfirst = 0 
          EndIf   
          
          OpenGadgetList(*sidebar\gadgetID) 
          *sidebar\ShowHideGad = HyperLinkGadget(-1,*sidebar\maxwidth-w-5,0,w,h,*sidebar\showArrow,*sidebar\ActiveColor)
          CloseGadgetList() 
          SetGadgetColor(*sidebar\ShowHideGad,#PB_Gadget_FrontColor,*sidebar\FrontColor)   
          SetGadgetColor(*sidebar\ShowHideGad,#PB_Gadget_BackColor,*sidebar\BackColor)   
          SetGadgetFont(*sidebar\ShowHideGad,FontID(*sidebar\fonts\font[1]))
          SetGadgetData(*sidebar\ShowHideGad,*sidebar) 
          GadgetToolTip(*sidebar\ShowHideGad, "Close Sidebar")
          BindGadgetEvent(*sidebar\ShowHideGad,@Sidebar_StartSlide(),#PB_EventType_LeftClick)
        Else 
          
          *sidebar\minWidth = _GadgetWidth(gadget)+(*sidebar\left*sfx)+5
          *sidebar\minLeft = -(*sidebar\maxwidth-GadgetWidth(*sidebar\ShowHideGad)-10)
          ResizeGadget(*sidebar\ShowHideGad,*sidebar\maxwidth-GadgetWidth(*sidebar\ShowHideGad)-5,0,GadgetWidth(*sidebar\ShowHideGad),GadgetHeight(*sidebar\ShowHideGad))
          
        EndIf  
        
        Protected sh
        
        sh = *sidebar\WindowStatusBar 
        
        ResizeGadget(*sidebar\gadgetID,*sidebar\left,0,*sidebar\maxwidth,WindowHeight(*sidebar\ParentId)-sh)
        
        If *sidebar\SideMessage <> "" 
          If StartDrawing(CanvasOutput(*sidebar\gadgetID)) 
            DrawingFont(FontID(*sidebar\fonts\font[0]))  
            w = TextWidth(*sidebar\SideMessage) 
            h = TextHeight(*sidebar\SideMessage)
            cy = ((WindowHeight(*sidebar\ParentId)-sh) - DesktopUnscaledX(w)) * 0.5  
            If IsGadget(*sidebar\ShowHideGad) 
              y = GadgetY(*sidebar\ShowHideGad) + GadgetHeight(*sidebar\ShowHideGad) 
            EndIf    
            
            DrawingFont(FontID(*sidebar\fonts\font[0]))  
            x = DesktopScaledX(*sidebar\maxwidth-h)
            y = DesktopScaledY(y)
            h = DesktopScaledY(h) 
            w = DesktopScaledX(GadgetHeight(*sidebar\gadgetID))-y
            
            Box(x-5,y,h+5,w,*sidebar\BackColor)
            
            x = DesktopScaledX(*sidebar\maxwidth)
            y = DesktopScaledY(cy)  
            DrawRotatedText(x,y,*sidebar\SideMessage,-90,*sidebar\SideMessageColor) 
            
            StopDrawing() 
          EndIf 
        EndIf 
      EndIf 
    EndIf 
    
    LockWindowUpdate_(0)
    UpdateWindow_(wid)
    
  EndProcedure  
  
  Procedure SideBar_EventMenu() 
    Protected gadget,*menu.SideBar_Menuitems 
    gadget = EventGadget()     
    If IsGadget(gadget) 
      *menu = GetGadgetData(gadget)
      PostEvent(#PB_Event_Menu,EventWindow(),*menu\MenuID,#PB_All,*menu\ParentID)  
      PostEvent(#PB_Event_LeftClick,EventWindow(),*menu\ParentID) 
    EndIf 
  EndProcedure 
  
  Procedure SideBar_Event() 
    
    Protected window,Gadget,*sidebar.SideBar_Gadget
    Protected mx,my,sx.f 
    
    If EventType() = #PB_EventType_MouseEnter Or EventType() = #PB_EventType_MouseLeave Or EventType() = #PB_EventType_LeftClick
      
      gadget = EventGadget()
      If IsGadget(gadget)  
        *sidebar = GetGadgetData(Gadget)
        If *sidebar 
          If *sidebar\gadgetID = gadget 
            If *sidebar\bHover 
              mx = WindowMouseX(*sidebar\ParentId)
              my = WindowMouseY(*sidebar\ParentId)  
              If EventType() = #PB_EventType_MouseEnter  
                If (mx > ((*sidebar\left*sfx)+_GadgetWidth(gadget)-30*sfx) And my > (*sidebar\titleSize*sfy))                   
                  If ElapsedMilliseconds() > *sidebar\hovertime 
                    *sidebar\MenuState = 1   
                    If IsGadget(*sidebar\ShowHideGad)
                      SetGadgetText(*sidebar\ShowHideGad,*sidebar\HideArrow)
                      GadgetToolTip(*sidebar\ShowHideGad, "Close Sidebar")
                    EndIf 
                  Else 
                    *sidebar\hovertime  = ElapsedMilliseconds() + *sidebar\dwell 
                  EndIf
                EndIf 
              ElseIf EventType() = #PB_EventType_MouseLeave 
                If (mx > ((*sidebar\left*sfx)+(_GadgetWidth(gadget)-(30*sfx))) And my > (*sidebar\titleSize*sfy)) 
                  If ElapsedMilliseconds() > *sidebar\hovertime 
                    *sidebar\MenuState = -1   
                    If IsGadget(*sidebar\ShowHideGad)
                      SetGadgetText(*sidebar\ShowHideGad,*sidebar\ShowArrow) 
                      GadgetToolTip(*sidebar\ShowHideGad, "Open Sidebar")
                    EndIf 
                  Else 
                    *sidebar\hovertime  = ElapsedMilliseconds() + *sidebar\dwell 
                  EndIf   
                EndIf 
              EndIf 
            EndIf
          EndIf 
        EndIf 
      EndIf   
      
      ForEach SideBarGadgets() 
        *sidebar.SideBar_Gadget = SideBarGadgets()  
        gadget = *sidebar\gadgetID  
        window = EventWindow() 
        If (IsGadget(gadget) And IsWindow(window))
          If WindowWidth(window) < GadgetWidth(gadget)-60 
            Debug "Post Gadget"
            PostEvent(#PB_Event_Gadget,EventWindow(),gadget,#PB_EventType_Resize) 
          EndIf
          If WindowHeight(window)-*sidebar\WindowStatusBar < GadgetHeight(gadget) Or WindowHeight(window)-*sidebar\WindowStatusBar > GadgetHeight(gadget)
            Debug "post Wind"
            PostEvent(#PB_Event_Gadget,EventWindow(),gadget,#PB_EventType_Resize) 
          EndIf
        EndIf 
      Next 
    EndIf 
  EndProcedure   
  
  Procedure SideBar_OpenClose()
    Protected Gadget,*sidebar.SideBar_Gadget
    Static x 
    If Not x 
      x = 1 
    EndIf   
    gadget = EventTimer()
    If IsGadget(gadget) 
      *sidebar = GetGadgetData(gadget)
      If *sidebar\MenuState 
        If (*sidebar\left >= *sidebar\minLeft And *sidebar\MenuState = #SideBar_Menuclose) 
          If *sidebar\left < (*sidebar\minLeft+10) 
            *sidebar\left  - 1 
          Else   
            *sidebar\left - 10
          EndIf    
          ;ResizeGadget(gadget, *sidebar\left , #PB_Ignore, #PB_Ignore, #PB_Ignore) 
          ResizeWindow(*sidebar\ParentId,#PB_Ignore, #PB_Ignore, #PB_Ignore,WindowHeight(*sidebar\ParentId)+x)        
        EndIf
        
        If (*sidebar\left  <= 0 And *sidebar\MenuState = #SideBar_MenuOpen)
          If *sidebar\left > -10 
            *sidebar\left  + 1 
          Else   
            *sidebar\left + 10
          EndIf    
          ;ResizeGadget(gadget,*sidebar\left, #PB_Ignore, #PB_Ignore, #PB_Ignore)  
          ResizeWindow(*sidebar\ParentId, #PB_Ignore, #PB_Ignore, #PB_Ignore,WindowHeight(*sidebar\ParentId)+x)   
        EndIf   
        x*-1   
      EndIf   
    EndIf 
  EndProcedure
  
  Procedure Sidebar_StartSlide()
    Protected gadget, *sidebar.SideBar_Gadget
    
    gadget = EventGadget() 
    If IsGadget(gadget) 
      *sidebar = GetGadgetData(gadget)
      If *sidebar 
        *sidebar\MenuState * -1   
        If  *sidebar\MenuState = 0 
          *sidebar\MenuState = -1
        EndIf   
        If *sidebar\MenuState = -1
          SetGadgetText(*sidebar\ShowHideGad,*sidebar\ShowArrow) 
          GadgetToolTip(*sidebar\ShowHideGad, "Open Sidebar")
        Else
          SetGadgetText(*sidebar\ShowHideGad,*sidebar\HideArrow)
          GadgetToolTip(*sidebar\ShowHideGad, "Close Sidebar")
        EndIf
        SetActiveGadget(*sidebar\ShowHideGad)
      EndIf 
    EndIf 
  EndProcedure   
  
  Procedure SetMessage(gadget,msg.s,color=0) 
    Protected *sidebar.SideBar_Gadget
    
    If IsGadget(Gadget) 
      *sidebar = GetGadgetData(gadget)
      If *sidebar 
        *sidebar\SideMessage = msg
        If color = 0 
          *sidebar\SideMessageColor = *sidebar\FrontColor 
        Else 
          *sidebar\SideMessageColor = color 
        EndIf   
      EndIf 
    EndIf   
  EndProcedure   
  
  Procedure AddMenuItem(Gadget,lable.s,lable1.s,menuid.l=0,tooltip.s="",fontsize=#Sidebar_Small,ActiveColor=0,FrontColor=0,BackColor=0) 
    Protected *sidebar.SideBar_Gadget
    Static ct 
    If IsGadget(Gadget) 
      
      *sidebar = GetGadgetData(gadget)
      If *sidebar 
        AddElement(*sidebar\MenuItems()) 
        *sidebar\MenuItems()\Lable = lable 
        If lable1 <> ""  
          *sidebar\MenuItems()\Lable  + "  " +  lable1
        EndIf 
        
        If fontsize < 3 
          *sidebar\MenuItems()\Font = *sidebar\Fonts\font[fontsize]   
        EndIf    
        
        If menuid 
          *sidebar\MenuItems()\menuid = menuid 
        Else 
          *sidebar\MenuItems()\menuid = ct 
          ct+1 
        EndIf   
        If FrontColor
          *sidebar\MenuItems()\frontcolor = FrontColor  
        Else 
          *sidebar\MenuItems()\frontcolor  = *sidebar\FrontColor 
        EndIf 
        If BackColor
          *sidebar\MenuItems()\backcolor = BackColor 
        Else 
          *sidebar\MenuItems()\backcolor = *sidebar\BackColor
        EndIf   
        If ActiveColor 
          *sidebar\MenuItems()\activecolor = activecolor  
        Else 
          *sidebar\MenuItems()\activecolor = *sidebar\activecolor    
        EndIf   
        *sidebar\MenuItems()\tooltip = tooltip 
        
        OpenGadgetList(*sidebar\gadgetID) 
        *sidebar\MenuItems()\ParentID = HyperLinkGadget(#PB_Any,0,0,0,0,*sidebar\MenuItems()\lable,*sidebar\MenuItems()\activecolor)
        CloseGadgetList() 
        
        ProcedureReturn *sidebar\MenuItems()\ParentID 
        
      EndIf 
      
    EndIf 
    
    
  EndProcedure  
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows 
    
    Procedure ForceGadgetZOrder(gadget, zorder = 0)    
      If IsGadget(gadget)
        SetWindowLong_(GadgetID(gadget), #GWL_STYLE, GetWindowLong_(GadgetID(gadget), #GWL_STYLE) | #WS_CLIPSIBLINGS)
        If zorder = 1
          SetWindowPos_ (GadgetID (gadget), #HWND_BOTTOM, 0,0,0,0, #SWP_NOSIZE | #SWP_NOMOVE)
        Else
          SetWindowPos_ (GadgetID(gadget), #HWND_TOP, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE)
        EndIf
      EndIf
    EndProcedure
    
  CompilerElse 
    
    Procedure ForceGadgetZOrder(gadget, zorder = 0) 
      ProcedureReturn 1 
    EndProcedure 
    
  CompilerEndIf 
  
  Procedure SidebarGetMinWidth(gadget)  
    Protected *sidebar.SideBar_Gadget
    If IsGadget(gadget) 
      *sidebar = GetGadgetData(gadget) 
      If *sidebar 
        ProcedureReturn *sidebar\minWidth
      EndIf 
    EndIf 
  EndProcedure
  
  Procedure SetSlideCallback(gadget,*pfn.pCBSlide) 
    Protected *sidebar.SideBar_Gadget
    If IsGadget(gadget) 
      *sidebar = GetGadgetData(gadget) 
      If *sidebar
        *sidebar\cbSlide = *pfn 
      EndIf
    EndIf   
  EndProcedure   
  
  Procedure SideBarGadget(GadgetNumber,window,w,h,FrontColor,BackColor,ActiveColor,bhover.i=#True,font.s="Tahoma",small=11,medium=20,large=36,statusbar=0) 
    Protected *sidebar.SideBar_Gadget = AllocateStructure(SideBar_Gadget) 
    Protected res
    
    AddElement(SideBarGadgets()) 
    SideBarGadgets() = *sidebar
    
    If statusbar
      *sidebar\WindowStatusBar = StatusBarHeight(statusbar)  
    EndIf  
    
    res = CanvasGadget(GadgetNumber,0,0,w,h-*sidebar\WindowStatusBar,#PB_Canvas_Container)    
    
    CloseGadgetList() 
    
    If GadgetNumber = #PB_Any 
      *sidebar\gadgetID = res 
    Else 
      *sidebar\gadgetID = GadgetNumber
    EndIf 
    *sidebar\bHover = bhover 
    *sidebar\MenuState = #SideBar_Menuclose
    *sidebar\BackColor = BackColor
    *sidebar\FrontColor = FrontColor 
    *sidebar\ActiveColor = ActiveColor 
    *sidebar\ParentId = window 
    *sidebar\dwell = 0  ;hover time to use  
    *sidebar\fonts\font[0] = LoadFont(#PB_Any,font,small) 
    *sidebar\fonts\font[1] = LoadFont(#PB_Any,font,medium)
    *sidebar\fonts\font[2] = LoadFont(#PB_Any,font,large)
    
    SetGadgetData(*sidebar\gadgetID,*sidebar)
    SetGadgetColor(*sidebar\gadgetID, #PB_Gadget_BackColor,BackColor) 
    SetGadgetColor(*sidebar\gadgetID, #PB_Gadget_FrontColor,FrontColor)
    
    AddWindowTimer(window,*sidebar\gadgetID,2)
    BindEvent(#PB_Event_Timer,@SideBar_OpenClose())
    
    BindGadgetEvent(*sidebar\gadgetID,@SideBar_Draw(),#PB_EventType_Resize)
    
    BindGadgetEvent(*sidebar\gadgetID,@SideBar_Event())
    
    BindEvent(#PB_Event_SizeWindow,@SideBar_Event())  
    
    PostEvent(#PB_Event_Gadget,window,*sidebar\gadgetID,#PB_EventType_Resize) 
    
    ProcedureReturn *sidebar\gadgetID 
    
  EndProcedure 
  
  DisableExplicit 
  
EndModule 

CompilerIf #PB_Compiler_IsMainFile  
  
  UseModule SideBarGadget 
  
  #BlockListGadget = 301
  #AllowListGadget = 302
  #DataGadget =303
  #MainStatusBar = 304
  #SplitHoritontal = 305 
  #SplitVertical = 306 
  Global gwin,sb
  
  Procedure Resize() 
    Protected cw,bh,hh,pad 
    pad = 5
    
    gwx = WindowX(gwin) 
    gwy = WindowY(gwin)
    gww = WindowWidth(gwin)
    gwh = WindowHeight(gwin) 
    
    cw=gww/2 - pad 
    bh=gwh/2 
    hh = StatusBarHeight(#MainStatusBar) + (pad*2)
    
    gwx = SidebarGetMinWidth(sb)  
    If gwx = 0 
      gwx=30*DesktopResolutionX()
    EndIf   
    
    ResizeGadget(#SplitHoritontal,gwx,5,gwW-(gwx+5),gwh-hh) 
    
    SetGadgetItemAttribute(#DataGadget,0,#PB_Explorer_ColumnWidth,gww/4-2,0) 
    SetGadgetItemAttribute(#DataGadget,1,#PB_Explorer_ColumnWidth,gww/4-2,1) 
    SetGadgetItemAttribute(#DataGadget,2,#PB_Explorer_ColumnWidth,gww/4-2,2) 
    SetGadgetItemAttribute(#DataGadget,3,#PB_Explorer_ColumnWidth,gww/4-2,3) 
    SetGadgetItemAttribute(#DataGadget,4,#PB_Explorer_ColumnWidth,gww/4-6,4)
    
    
  EndProcedure  
  
  Global sb,event
  Global msg.s = "SideBarGadget v1.0.1.7a "
  
  gwin = OpenWindow(-1,0,0,640,480,msg, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget) 
  
  SetWindowColor(gwin,$FCFCFC) 
  
  CreateStatusBar(#MainStatusBar, WindowID(gwin))
  AddStatusBarField(#PB_Ignore)
  AddStatusBarField(#PB_Ignore)
  AddStatusBarField(#PB_Ignore)
  AddStatusBarField(#PB_Ignore) 
  
  w = WindowWidth(gwin) - 50
  h = WindowHeight(gwin)
  ListViewGadget(#BlockListGadget,5,5,w/2-5,h/2-10)
  ListViewGadget(#AllowListGadget,w/2+5,5,w/2-10,h/2-10)
  SetGadgetColor(#AllowListGadget, #PB_Gadget_FrontColor ,RGB(0,192,0))
  SetGadgetColor(#BlockListGadget,#PB_Gadget_FrontColor ,RGB(192,0,0))
  EnableGadgetDrop(#AllowListGadget,#PB_Drop_Text, #PB_Drag_Copy)
  EnableGadgetDrop(#BlockListGadget,#PB_Drop_Text, #PB_Drag_Copy)
  ListIconGadget(#DataGadget,5,h/2,w,h/2,"URL",w/2-8,#PB_ListIcon_FullRowSelect | #PB_ListIcon_CheckBoxes) 
  
  AddGadgetColumn(#DataGadget,1,"IP address",w/4) 
  AddGadgetColumn(#DataGadget,2,"Time",w/4) 
  AddGadgetColumn(#DataGadget,3,"Renew",w/4)
  
  ForceGadgetZOrder(#BlockListGadget,1)
  ForceGadgetZOrder(#AllowListGadget,1) 
  ForceGadgetZOrder(#DataGadget,1)
  
  StatusBarText(#MainStatusBar,0, "DNS 127.0.0.1 / 1.1.1.1")
  StatusBarText(#MainStatusBar,1, "Blocked 19710 Total 33246")
  StatusBarText(#MainStatusBar,2, "Allowed items 3127")
  StatusBarText(#MainStatusBar,3, "Denied items 641")
  
  SplitterGadget(#SplitVertical,0,0,w-50,h/2,#BlockListGadget,#AllowListGadget,#PB_Splitter_Vertical)
  SplitterGadget(#SplitHoritontal,0,0,w-50,h-60,#SplitVertical,#DataGadget)
  
  ForceGadgetZOrder(#SplitVertical,1)
  ForceGadgetZOrder(#SplitHoritontal,1) 
  
  AddGadgetItem(#AllowListGadget,-1,"fr.purebasic.www") 
  AddGadgetItem(#AllowListGadget,-1,"com.bing.www")
  AddGadgetItem(#BlockListGadget,-1,"com.windowsupdate.ctldl")
  AddGadgetItem(#BlockListGadget,-1,"com.live.login")
  AddGadgetItem(#BlockListGadget,-1,"com.microsoft.edge")
  AddGadgetItem(#BlockListGadget,-1,"com.skype.edge.config")
  
  
  sb = SideBarGadget(#PB_Any,gwin,200,600,$FCFCFC,$5C1200,$DA00,#True,"Segoe UI",11,24,36,#MainStatusBar)  
  AddMenuItem(sb,"  " + strchr($1F30E),"",1100,"Main Menu",#Sidebar_large)  
  AddMenuItem(sb,strChr($1F525),"Hot",1101,"hot stuff",#Sidebar_small)         
  AddMenuItem(sb,strchr($267E),"Info",1102)
  AddMenuItem(sb,strchr($26CF),"Tools",1103) 
  AddMenuItem(sb,strChr($2699),"Settings",1104)       
  AddMenuItem(sb,strchr($2712),"Contact",1105)  
  AddMenuItem(sb,strchr($1F30e),"Network",1106) 
  SetMessage(sb,msg,RGB(0,255,0)) 
    
  ForceGadgetZOrder(sb)
  
  Resize()
  
  BindEvent(#PB_Event_SizeWindow, @Resize(),gwin)
  
  Repeat 
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Menu 
        Debug "menu"
        Debug EventMenu() 
        If EventData()
          Debug GetGadgetText(EventData())
        EndIf   
      Case #PB_Event_Gadget 
        Select EventType()
          Case #PB_EventType_DragStart
            Text$ = GetGadgetItemText(EventGadget(), GetGadgetState(EventGadget()))
            DragText(Text$)
            RemoveGadgetItem(EventGadget(),GetGadgetState(EventGadget())) 
          Case #PB_EventType_LeftClick 
            Debug "click" 
            Debug GetGadgetText(EventGadget())
        EndSelect 
      Case #PB_Event_GadgetDrop         
        AddGadgetItem(EventGadget(), -1, EventDropText()) 
    EndSelect 
  Until Event = #PB_Event_CloseWindow 
  
CompilerEndIf 


BarryG
Addict
Addict
Posts: 3292
Joined: Thu Apr 18, 2019 8:17 am

Re: SideBarGadget

Post by BarryG »

Interesting. Thanks!
Amitris_de
User
User
Posts: 31
Joined: Wed Jan 06, 2021 2:53 pm

Re: SideBarGadget

Post by Amitris_de »

Beautiful,
Good luck.
User avatar
idle
Always Here
Always Here
Posts: 5042
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: SideBarGadget

Post by idle »

Updated It DPI aware 1.01 a

I need some advice for OSX, It might just be the font that's the problem.
dige
Addict
Addict
Posts: 1247
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Re: SideBarGadget

Post by dige »

Nice! It looks very promising. :D
"Daddy, I'll run faster, then it is not so far..."
Mindphazer
Enthusiast
Enthusiast
Posts: 340
Joined: Mon Sep 10, 2012 10:41 am
Location: Savoie

Re: SideBarGadget

Post by Mindphazer »

That's really nice ! I like it
I can't test on my Mac right now, i will do it tonight

Thanks
MacBook Pro 14" M1 Pro - 16 Gb - MacOS 14 - Iphone 15 Pro Max - iPad at home
...and unfortunately... Windows at work...
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4747
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Re: SideBarGadget

Post by Fangbeast »

Wot dis supposed to do like den?? (hehehehehe) Good old English speak.

I simply get a "The debugged executable quit unexpectedly"

Using PB 6.02LTS.

Funny thing, I also get the same error from the OpenFileRequester example from the help manual if used by itself and not in a program and I didn't think that need a gui or an event loop.?? Weird. That requester works fine in pb 5.71 as far as I know.

My 75, 352 line program works fine :):)
Amateur Radio, D-STAR/VK3HAF
User avatar
idle
Always Here
Always Here
Posts: 5042
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: SideBarGadget

Post by idle »

Fangbeast wrote: Thu May 25, 2023 8:34 am Wot dis supposed to do like den?? (hehehehehe) Good old English speak.

I simply get a "The debugged executable quit unexpectedly"

Using PB 6.02LTS.

Funny thing, I also get the same error from the OpenFileRequester example from the help manual if used by itself and not in a program and I didn't think that need a gui or an event loop.?? Weird. That requester works fine in pb 5.71 as far as I know.

My 75, 352 line program works fine :):)
Are you on some deceased, expired, gone, pushing daisies, windows OS, then? (hehehehehe) Good old English speak.
I'm on win 11 x64 pb 5,73 - 6.02 b4
I tested it as 150% 175% desktop scaled and unscaled but may be I need to do it again?
thanks
Bitblazer
Enthusiast
Enthusiast
Posts: 733
Joined: Mon Apr 10, 2017 6:17 pm
Location: Germany
Contact:

Re: SideBarGadget

Post by Bitblazer »

nice
webpage - discord chat links -> purebasic GPT4All
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: SideBarGadget

Post by mk-soft »

Looks very good,

but I am not happy the static gadget number is taken for the HyperLinkGadget (1 to ListSize). This leads to problems with other gadgets.
Better use #PB_Any for HyperLinkGadget and a parameter menu number and trigger the events as EventMenu.

Edit:
How to get window number for create own gadget

Code: Select all

Structure udtMyGadget
  Window.i
  Gadget.i
  ;
EndStructure


Procedure CreateMyGadget(Gadget) ;
  Protected *GadgetData.udtMyGadget
  
  *GadgetData = AllocateStructure(udtMyGadget)
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      *GadgetData\Window = GetProp_(UseGadgetList(0), "PB_WINDOWID") - 1
    CompilerCase #PB_OS_Linux
      *GadgetData\Window = g_object_get_data_(UseGadgetList(0), "pb_id" )
    CompilerCase #PB_OS_MacOS
      Import ""
        PB_Window_GetID(Object) 
      EndImport
      *GadgetData\Window = PB_Window_GetID(UseGadgetList(0))
    CompilerEndSelect
    
    Debug *GadgetData\Window
      
EndProcedure
Last edited by mk-soft on Thu May 25, 2023 9:46 am, edited 2 times in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
idle
Always Here
Always Here
Posts: 5042
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: SideBarGadget

Post by idle »

mk-soft wrote: Thu May 25, 2023 8:59 am Looks very good,

but I am not happy the static gadget number is taken for the HyperLinkGadget (1 to ListSize). This leads to problems with other gadgets.
Better use #PB_Any for HyperLinkGadget and a parameter menu number and trigger the events as EventMenu.
Good catch, thankyou, I will fix that in the morning, It should return the gadget ID and use PB any
I was having issues using bind event and I left some things be while I got the functionality working as gadget. There may well be other issues that might pop up adding more controls. I also need to Close the gadget list.
User avatar
mk-soft
Always Here
Always Here
Posts: 5335
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: SideBarGadget

Post by mk-soft »

Save the Menu number into HyperLinkGadget data and BindGadgetEvent to

Code: Select all

Procedure DoEvent_HyperLinkGadget()
  PostEvent(#PB_Event_Menu, GetActiveWindow(), GetGadgetData(EventGadget()))
EndProcedure
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
idle
Always Here
Always Here
Posts: 5042
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: SideBarGadget

Post by idle »

mk-soft wrote: Thu May 25, 2023 9:47 am Save the Menu number into HyperLinkGadget data and BindGadgetEvent to

Code: Select all

Procedure DoEvent_HyperLinkGadget()
  PostEvent(#PB_Event_Menu, GetActiveWindow(), GetGadgetData(EventGadget()))
EndProcedure
I will give it a go. I fixed the ID's closed the gadget list and now I've got no events triggered
AZJIO
Addict
Addict
Posts: 1313
Joined: Sun May 14, 2017 1:48 am

Re: SideBarGadget

Post by AZJIO »

Code: Select all

DestroyIcon_(ico) ; When it is no longer needed, you must destroy the icon handle returned by ExtractIcon by calling the DestroyIcon function.
Add to example
User avatar
Caronte3D
Addict
Addict
Posts: 1027
Joined: Fri Jan 22, 2016 5:33 pm
Location: Some Universe

Re: SideBarGadget

Post by Caronte3D »

Nice! :D

Bug:
If we scale the window while the menu is hidden, the menu slide, but a clich on the hide icon shows (slides) it again.
Post Reply