Cross-platform custom gadgets framework

Share your advanced PureBasic knowledge/code with the community.
empty
User
User
Posts: 27
Joined: Sat Apr 12, 2014 11:31 am

Cross-platform custom gadgets framework

Post by empty »

While working on a project that requires a few custom controls, I found out that the most obvious solution, namely, writing the controls in PB and compile them with Tailbite doesn't seem to work on OSX. At least I couldn't get it to work.
So I tried to find another way to integrate custom or combined gadgets in our project so that they react on all the standard Gadget library functions, like HideGadget, FreeGadget, ResizeGadget, GetGadget..., SetGadget... and so on.
I did a very brief search on the internet (admittedly VERY brief :D), so my solution might be one among many, or even similar to many.

Anyway. Using the amazing magic of macros I found a solution for our project. It didn't break anything when we included it, so that's a good start ;).
And again: you can use the standard function set that Purebasic provides.
Here's the source:

Code: Select all

; Library for Crossplatform Custom Gadgets
; version 0.01 Sep/14
; (c) 2014 by Malte Twarloh
; Free to use and modify but I shall not held responsible for any damages


EnableExplicit

Structure s_GadgetStackElement
  Gadget.i
  Item.i
EndStructure

Structure s_WindowStackElement
  Window.i
  List GadgetStack.s_GadgetStackElement()
EndStructure

Global NewList WindowStack.s_WindowStackElement()


Prototype AddGadgetColumn_CB(Gadget, Position, Title$, Width)            
Prototype AddGadgetItem_CB(Gadget, Position, Text$, ImageId=0, Flags=0)  
Prototype BindGadgetEvent_CB(Gadget, *Callback, EventType = 0)           
Prototype ClearGadgetItems_CB(Gadget)                                    
Prototype CountGadgetItems_CB(Gadget)       
Prototype DisableGadget_CB(Gadget, State)
Prototype FreeGadget_CB(Gadget)
Prototype GadgetHeight_CB(Gadget, Mode)
Prototype GadgetID_CB(Gadget)
Prototype GadgetItemID_CB(Gadget, Item)
Prototype GadgetToolTip_CB(Gadget, Text$)                               
Prototype GadgetType_CB(Gadget)
Prototype GadgetWidth_CB(Gadget, Mode)
Prototype GadgetX_CB(Gadget)
Prototype GadgetY_CB(Gadget)
Prototype GetGadgetAttribute_CB(Gadget, Attribute)                       
Prototype GetGadgetColor_CB(Gadget, ColorType)
Prototype GetGadgetData_CB(Gadget)
Prototype GetGadgetFont_CB(Gadget)
Prototype GetGadgetItemAttribute_CB(Gadget, Item, Attribute, Column = 0) 
Prototype GetGadgetItemColor_CB(Gadget, Item, ColorType, Column = 0)
Prototype GetGadgetItemData_CB(Gadget, Item)
Prototype GetGadgetItemState_CB(Gadget, Item)
Prototype.s GetGadgetItemText_CB(Gadget, Item)
Prototype GetGadgetState_CB(Gadget)
Prototype.s GetGadgetText_CB(Gadget)
Prototype HideGadget_CB(Gadget, State)
Prototype IsGadget_CB(Gadget)
Prototype RemoveGadgetColumn_CB(Gadget, Column)
Prototype RemoveGadgetItem_CB(Gadget, Position)
Prototype ResizeGadget_CB(Gadget, x, y, Width, Height)
Prototype SetActiveGadget_CB(Gadget) 
Prototype SetGadgetAttribute_CB(Gadget, Attribute, Value)
Prototype SetGadgetColor_CB(Gadget, ColorType, Color)
Prototype SetGadgetData_CB(Gadget, Value)
Prototype SetGadgetFont_CB(Gadget, FontId)
Prototype SetGadgetItemAttribute_CB(Gadget, Item, Attribute, Value, Column=0)
Prototype SetGadgetItemColor_CB(Gadget, Item, ColorType, Color, Column=0)
Prototype SetGadgetItemData_CB(Gadget, Item, Value)
Prototype SetGadgetItemImage_CB(Gadget, Item, ImageID)
Prototype SetGadgetItemState_CB(Gadget, Item, State)
Prototype SetGadgetItemText_CB(Gadget, Item, Text$, Column=0)
Prototype SetGadgetState_CB(Gadget, State)
Prototype SetGadgetText_CB(Gadget, Text$)
Prototype UnbindGadgetEvent_CB(Gadget, *CallBack, EventType = 0)



Structure s_RegisteredGadget
  Gadget.i
  AddGadgetColumn_CB.AddGadgetColumn_CB
  AddGadgetItem_CB.AddGadgetItem_CB
  BindGadgetEvent_CB.BindGadgetEvent_CB
  ClearGadgetItems_CB.ClearGadgetItems_CB
  CountGadgetItems_CB.CountGadgetItems_CB
  DisableGadget_CB.DisableGadget_CB
  FreeGadget_CB.FreeGadget_CB
  GadgetHeight_CB.GadgetHeight_CB
  GadgetID_CB.GadgetID_CB
  GadgetItemID_CB.GadgetItemID_CB
  GadgetToolTip_CB.GadgetToolTip_CB
  GadgetType_CB.GadgetType_CB
  GadgetWidth_CB.GadgetWidth_CB
  GadgetX_CB.GadgetX_CB
  GadgetY_CB.GadgetY_CB
  GetGadgetAttribute_CB.GetGadgetAttribute_CB
  GetGadgetColor_CB.GetGadgetColor_CB
  GetGadgetData_CB.GetGadgetData_CB
  GetGadgetFont_CB.GetGadgetFont_CB
  GetGadgetItemAttribute_CB.GetGadgetItemAttribute_CB
  GetGadgetItemColor_CB.GetGadgetItemColor_CB
  GetGadgetItemData_CB.GetGadgetItemData_CB
  GetGadgetItemState_CB.GetGadgetItemState_CB
  GetGadgetItemText_CB.GetGadgetItemText_CB
  GetGadgetState_CB.GetGadgetState_CB
  GetGadgetText_CB.GetGadgetText_CB
  HideGadget_CB.HideGadget_CB
  IsGadget_CB.IsGadget_CB
  RemoveGadgetColumn_CB.RemoveGadgetColumn_CB
  RemoveGadgetItem_CB.RemoveGadgetItem_CB
  ResizeGadget_CB.ResizeGadget_CB
  SetActiveGadget_CB.SetActiveGadget_CB
  SetGadgetAttribute_CB.SetGadgetAttribute_CB
  SetGadgetColor_CB.SetGadgetColor_CB
  SetGadgetData_CB.SetGadgetData_CB
  SetGadgetFont_CB.SetGadgetFont_CB
  SetGadgetItemAttribute_CB.SetGadgetItemAttribute_CB
  SetGadgetItemColor_CB.SetGadgetItemColor_CB
  SetGadgetItemData_CB.SetGadgetItemData_CB
  SetGadgetItemImage_CB.SetGadgetItemImage_CB
  SetGadgetItemState_CB.SetGadgetItemState_CB
  SetGadgetItemText_CB.SetGadgetItemText_CB
  SetGadgetState_CB.SetGadgetState_CB
  SetGadgetText_CB.SetGadgetText_CB
  UnbindGadgetEvent_CB.UnbindGadgetEvent_CB
EndStructure



Global NewList *GadgetExList.s_RegisteredGadget()



Procedure OpenWindowEx(Window, X, Y, InnerWidth, InnerHeight, Title$, Flags=0, ParentID=0)
  Protected result 
  result = OpenWindow(Window, X, Y, InnerWidth, InnerHeight, Title$, Flags, ParentID)
  AddElement(WindowStack())
  If Window = #PB_Any
    WindowStack()\Window = result
  Else
    WindowStack()\Window = Window
  EndIf
  ProcedureReturn result
EndProcedure

; ---------------------------------------------------------------------------------------------------------------------

Procedure CloseWindowEx(Window)
  ForEach WindowStack()
    If WindowStack()\Window = Window
      FreeList(WindowStack()\GadgetStack())
      DeleteElement(WindowStack())
      SelectElement(WindowStack(), ListSize(WindowStack()))
    EndIf
  Next
  ProcedureReturn CloseWindow(Window)
EndProcedure

; ---------------------------------------------------------------------------------------------------------------------

Procedure ContainerGadgetEx(Gadget, x, y, Width, Height, Flags)
  Protected result
  result = ContainerGadget(Gadget, x, y, Width, Height, Flags)
  AddElement(WindowStack()\GadgetStack())
  If Gadget = #PB_Any
    WindowStack()\GadgetStack()\Gadget = result
    WindowStack()\GadgetStack()\Item = -1
  Else
    WindowStack()\GadgetStack()\Gadget = Gadget
    WindowStack()\GadgetStack()\Item = -1
  EndIf
  ProcedureReturn result  
EndProcedure


Procedure PanelGadgetEx(Gadget, x, y, Width, Height) 
  Protected result
  result = PanelGadget(Gadget, x, y, Width, Height) 
  AddElement(WindowStack()\GadgetStack())
  If Gadget = #PB_Any
    WindowStack()\GadgetStack()\Gadget = result
    WindowStack()\GadgetStack()\Item = -1
  Else
    WindowStack()\GadgetStack()\Gadget = Gadget
    WindowStack()\GadgetStack()\Item = -1
  EndIf
  ProcedureReturn result  
EndProcedure


Procedure ScrollAreaGadgetEx(Gadget, x, y, Width, Height, ScrollAreaWidth, ScrollAreaHeight, ScrollStep, Flags) 
  Protected result
  result = ScrollAreaGadget(Gadget, x, y, Width, Height, ScrollAreaWidth, ScrollAreaHeight, ScrollStep, Flags) 
  AddElement(WindowStack()\GadgetStack())
  If Gadget = #PB_Any
    WindowStack()\GadgetStack()\Gadget = result
    WindowStack()\GadgetStack()\Item = -1
  Else
    WindowStack()\GadgetStack()\Gadget = Gadget
    WindowStack()\GadgetStack()\Item = -1
  EndIf
  ProcedureReturn result  
EndProcedure


; ---------------------------------------------------------------------------------------------------------------------
Procedure CloseGadgetListEx()
  If ListSize(WindowStack()\GadgetStack()) > 0
    DeleteElement(WindowStack()\GadgetStack())
  EndIf
  CloseGadgetList()
EndProcedure



; ---------------------------------------------------------------------------------------------------------------------

Procedure OpenGadgetListEx(Gadget, Item=-1)
  If Item >= 0
    OpenGadgetList(Gadget, Item)
  Else
    OpenGadgetList(gadget)
  EndIf
  AddElement(WindowStack()\GadgetStack())
  WindowStack()\GadgetStack()\Gadget = Gadget
  WindowStack()\GadgetStack()\Item = Item
EndProcedure

; ---------------------------------------------------------------------------------------------------------------------

Procedure FreeGadgetEx(Gadget)
  ForEach WindowStack()
    ForEach WindowStack()\GadgetStack()
      If WindowStack()\GadgetStack() = Gadget
        DeleteElement(WindowStack()\GadgetStack())
        SelectElement(WindowStack()\GadgetStack(), ListSize(WindowStack()\GadgetStack()))
      EndIf
    Next
  Next
  ;TODO Call Custom
  ProcedureReturn FreeGadget(Gadget)
EndProcedure






Procedure AddGadgetColumn_PB(Gadget, Position, Title$, Width)   
  ProcedureReturn AddGadgetColumn(Gadget, Position, Title$, Width)   
EndProcedure

Procedure AddGadgetItem_PB(Gadget, Position, Text$, ImageId=0, Flags=0)  
  ProcedureReturn 
EndProcedure

Procedure BindGadgetEvent_PB(Gadget, *Callback, EventType = 0)           
  ProcedureReturn BindGadgetEvent(Gadget, *Callback, EventType)  
EndProcedure    

Procedure ClearGadgetItems_PB(Gadget)
  ProcedureReturn ClearGadgetItems(Gadget)
EndProcedure    

Procedure CountGadgetItems_PB(Gadget)       
  ProcedureReturn CountGadgetItems(Gadget) 
EndProcedure

Procedure DisableGadget_PB(Gadget, State)
  ProcedureReturn DisableGadget(Gadget, State)
EndProcedure

Procedure FreeGadget_PB(Gadget)
  ProcedureReturn FreeGadget(Gadget)
EndProcedure

Procedure GadgetHeight_PB(Gadget, Mode = #PB_Gadget_ActualSize)
  ProcedureReturn GadgetHeight(Gadget, Mode)
EndProcedure

Procedure GadgetID_PB(Gadget)
  ProcedureReturn GadgetID(Gadget)
EndProcedure

Procedure GadgetItemID_PB(Gadget, Item)
  ProcedureReturn GadgetItemID(Gadget, Item)
EndProcedure

Procedure GadgetToolTip_PB(Gadget, Text$)                               
  ProcedureReturn GadgetToolTip(Gadget, Text$)
EndProcedure

Procedure GadgetType_PB(Gadget)
  ProcedureReturn GadgetType(Gadget)
EndProcedure

Procedure GadgetWidth_PB(Gadget, Mode = #PB_Gadget_ActualSize)
  ProcedureReturn GadgetWidth(Gadget, Mode)
EndProcedure

Procedure GadgetX_PB(Gadget)
  ProcedureReturn GadgetX(Gadget)
EndProcedure

Procedure GadgetY_PB(Gadget)
  ProcedureReturn GadgetY(Gadget)
EndProcedure

Procedure GetGadgetAttribute_PB(Gadget, Attribute)                       
  ProcedureReturn GetGadgetAttribute(Gadget, Attribute)
EndProcedure

Procedure GetGadgetColor_PB(Gadget, ColorType)
  ProcedureReturn GetGadgetColor(Gadget, ColorType)
EndProcedure

Procedure GetGadgetData_PB(Gadget)
  ProcedureReturn GetGadgetData(Gadget)
EndProcedure

Procedure GetGadgetFont_PB(Gadget)
  ProcedureReturn GetGadgetFont(Gadget)
EndProcedure

Procedure GetGadgetItemAttribute_PB(Gadget, Item, Attribute, Column = 0) 
  ProcedureReturn GetGadgetItemAttribute(Gadget, Item, Attribute, Column) 
EndProcedure

Procedure GetGadgetItemColor_PB(Gadget, Item, ColorType, Column = 0) 
  ProcedureReturn GetGadgetItemColor(Gadget, Item, ColorType, Column) 
EndProcedure

Procedure GetGadgetItemData_PB(Gadget, Item)
  ProcedureReturn GetGadgetItemData(Gadget, Item)
EndProcedure

Procedure GetGadgetItemState_PB(Gadget, Item)
  ProcedureReturn GetGadgetItemState(Gadget, Item)
EndProcedure

Procedure.s GetGadgetItemText_PB(Gadget, Item)
  ProcedureReturn GetGadgetItemText(Gadget, Item)
EndProcedure

Procedure GetGadgetState_PB(Gadget)
  ProcedureReturn GetGadgetState(Gadget)
EndProcedure

Procedure.s GetGadgetText_PB(Gadget)
  ProcedureReturn GetGadgetText(Gadget)
EndProcedure

Procedure HideGadget_PB(Gadget, State)
  ProcedureReturn HideGadget(Gadget, State)
EndProcedure

Procedure IsGadget_PB(Gadget)
  ProcedureReturn IsGadget(Gadget)
EndProcedure

Procedure RemoveGadgetColumn_PB(Gadget, Column)
  ProcedureReturn RemoveGadgetColumn(Gadget, Column)
EndProcedure

Procedure RemoveGadgetItem_PB(Gadget, Position)
  ProcedureReturn RemoveGadgetItem(Gadget, Position)
EndProcedure

Procedure ResizeGadget_PB(Gadget, x, y, Width, Height)
  ProcedureReturn ResizeGadget(Gadget, x, y, Width, Height)
EndProcedure

Procedure SetActiveGadget_PB(Gadget) 
  ProcedureReturn SetActiveGadget(Gadget)
EndProcedure

Procedure SetGadgetAttribute_PB(Gadget, Attribute, Value)
  ProcedureReturn SetGadgetAttribute(Gadget, Attribute, Value)
EndProcedure

Procedure SetGadgetColor_PB(Gadget, ColorType, Color)
  ProcedureReturn SetGadgetColor(Gadget, ColorType, Color)
EndProcedure

Procedure SetGadgetData_PB(Gadget, Value)
  ProcedureReturn SetGadgetData(Gadget, Value)
EndProcedure

Procedure SetGadgetFont_PB(Gadget, FontId)
  ProcedureReturn SetGadgetFont(Gadget, FontID)
EndProcedure

Procedure SetGadgetItemAttribute_PB(Gadget, Item, Attribute, Value, Column=0)
  ProcedureReturn SetGadgetItemAttribute(Gadget, Item, Attribute, Value, Column)
EndProcedure

Procedure SetGadgetItemColor_PB(Gadget, Item, ColorType, Color, Column=0)
  ProcedureReturn SetGadgetItemColor(Gadget, Item, ColorType, Color ,Column)
EndProcedure

Procedure SetGadgetItemData_PB(Gadget, Item, Value)
  ProcedureReturn SetGadgetItemData(Gadget, Item, Value)
EndProcedure

Procedure SetGadgetItemImage_PB(Gadget, Item, ImageID)
  ProcedureReturn SetGadgetItemImage(Gadget, Item, ImageId)
EndProcedure

Procedure SetGadgetItemState_PB(Gadget, Item, State)
  ProcedureReturn SetGadgetItemState(Gadget, Item, State)
EndProcedure

Procedure SetGadgetItemText_PB(Gadget, Item, Text$, Column=0)
  ProcedureReturn SetGadgetItemText(Gadget, Item, Text$, Column)
EndProcedure

Procedure SetGadgetState_PB(Gadget, State)
  ProcedureReturn SetGadgetState(Gadget, State)
EndProcedure

Procedure SetGadgetText_PB(Gadget, Text$)
  ProcedureReturn SetGadgetText(Gadget, Text$)
EndProcedure

Procedure UnbindGadgetEvent_PB(Gadget, *CallBack, EventType = 0)
  ProcedureReturn UnbindGadgetEvent(Gadget, *CallBack, EventType)
EndProcedure











; ---------------------------------------------------------------------------------------------------------------------
Macro CallGadgetEx_I0(Result, Gadget, Function)
  Protected Result
  Protected b = 0
  ForEach *GadgetExList()
    If *GadgetExList()\Gadget = Gadget
      b = 1
      If *GadgetExList()\Function#_CB <> 0
        result = *GadgetExList()\Function#_CB()
      Else 
        result = Function()
      EndIf
      Break
    EndIf
  Next
  If Not b
    result = Function()
  EndIf    
EndMacro

Macro CallGadgetEx_I1(Result, Gadget, Function, Data1)
  Protected Result
  Protected b = 0
  ForEach *GadgetExList()
    If *GadgetExList()\Gadget = Gadget
      b = 1
      If *GadgetExList()\Function#_CB <> 0
        result = *GadgetExList()\Function#_CB(Data1)
      Else 
        result = Function(Data1)
      EndIf
      Break
    EndIf
  Next
  If Not b
    result = Function(Data1)
  EndIf    
EndMacro

Macro CallGadgetEx_I2(Result, Gadget, Function, Data1, Data2)
  Protected Result
  Protected b = 0
  ForEach *GadgetExList()
    If *GadgetExList()\Gadget = Gadget
      b = 1
      If *GadgetExList()\Function#_CB <> 0
        result = *GadgetExList()\Function#_CB(Data1, Data2)
      Else 
        result = Function(Data1, Data2)
      EndIf
      Break
    EndIf
  Next
  If Not b
    result =  Function(Data1, Data2)
  EndIf    
EndMacro

Macro CallGadgetEx_I3(Result, Gadget, Function, Data1, Data2, Data3)
  Protected Result
  Protected b = 0
  ForEach *GadgetExList()
    If *GadgetExList()\Gadget = Gadget
      b = 1
      If *GadgetExList()\Function#_CB <> 0
        result = *GadgetExList()\Function#_CB(Data1, Data2, Data3)
      Else 
        result = Function(Data1, Data2, Data3)
      EndIf
      Break
    EndIf
  Next
  If Not b
    result = Function(Data1, Data2, Data3)
  EndIf    
EndMacro


Macro CallGadgetEx_I4(Result, Gadget, Function, Data1, Data2, Data3, Data4)
  Protected Result
  Protected b = 0
  ForEach *GadgetExList()
    If *GadgetExList()\Gadget = Gadget
      b = 1
      If *GadgetExList()\Function#_CB <> 0
        result = *GadgetExList()\Function#_CB(Data1, Data2, Data3, Data4)
      Else 
        result = Function(Data1, Data2, Data3, Data4)
      EndIf
      Break
    EndIf
  Next
  If Not b
    result = Function(Data1, Data2, Data3, Data4)
  EndIf    
EndMacro

Macro CallGadgetEx_I5(Result, Gadget, Function, Data1, Data2, Data3, Data4, Data5)
  Protected Result
  Protected b = 0
  ForEach *GadgetExList()
    If *GadgetExList()\Gadget = Gadget
      b = 1
      If *GadgetExList()\Function#_CB <> 0
        result = *GadgetExList()\Function#_CB(Data1, Data2, Data3, Data4, Data5)
      Else 
        result = Function(Data1, Data2, Data3, Data4, Data5)
      EndIf
      Break
    EndIf
  Next
  If Not b
    result = Function(Data1, Data2, Data3, Data4, Data5)
  EndIf    
EndMacro

Procedure AddGadgetColumnEx(Gadget, Position, Title$, Width)   
  CallGadgetEx_I4(result, Gadget, AddGadgetColumn, Gadget, Position, Title$, Width)
  ProcedureReturn result
EndProcedure

Procedure AddGadgetItemEx(Gadget, Position, Text$, ImageId=0, Flags=0) 
  CallGadgetEx_I5(result, Gadget, AddGadgetItem, Gadget, Position, Text$, ImageId, Flags)
  ProcedureReturn result
EndProcedure



Procedure BindGadgetEventEx(Gadget, *Callback, EventType = 0)           
  CallGadgetEx_I3(result, Gadget, BindGadgetEvent, Gadget, *Callback, EventType)
  ProcedureReturn result
EndProcedure    

Procedure ClearGadgetItemsEx(Gadget)
  CallGadgetEx_I1(result, Gadget, ClearGadgetItems, Gadget)
  ProcedureReturn result
EndProcedure    

Procedure CountGadgetItemsEx(Gadget)       
  CallGadgetEx_I1(result, Gadget, CountGadgetItems, Gadget)
  ProcedureReturn result
EndProcedure

Procedure DisableGadgetEx(Gadget, State)
  CallGadgetEx_I2(result, Gadget, DisableGadget, Gadget, State)
  ProcedureReturn result
EndProcedure

Procedure GadgetHeightEx(Gadget, Mode=#PB_Gadget_ActualSize)
  CallGadgetEx_I2(result, Gadget, GadgetHeight, Gadget, Mode)
  ProcedureReturn result
EndProcedure

Procedure GadgetIDEx(Gadget)
  CallGadgetEx_I1(result, Gadget, GadgetID, Gadget)
  ProcedureReturn result
EndProcedure

Procedure GadgetItemIDEx(Gadget, Item)
  CallGadgetEx_I2(result, Gadget, GadgetItemID, Gadget, Item)
  ProcedureReturn result
EndProcedure

Procedure GadgetToolTipEx(Gadget, TExt$)                               
  CallGadgetEx_I2(result, Gadget, GadgetToolTip, Gadget, Text$)
  ProcedureReturn result
EndProcedure

Procedure GadgetTypeEx(Gadget)
  CallGadgetEx_I1(result, Gadget, GadgetType, Gadget)
  ProcedureReturn result
EndProcedure

Procedure GadgetWidthEx(Gadget, Mode = #PB_Gadget_ActualSize)
  CallGadgetEx_I2(result, Gadget, GadgetWidth, Gadget, Mode)
  ProcedureReturn result
EndProcedure

Procedure GadgetXEx(Gadget)
  CallGadgetEx_I1(result, Gadget, GadgetX, Gadget)
  ProcedureReturn result
EndProcedure

Procedure GadgetYEx(Gadget)
  CallGadgetEx_I1(result, Gadget, Gadgety, Gadget)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetAttributeEx(Gadget, Attribute)                       
  CallGadgetEx_I2(result, Gadget, GetGadgetAttribute, Gadget, Attribute)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetColorEx(Gadget, ColorType)
  CallGadgetEx_I2(result, Gadget, GetGadgetColor, Gadget, ColorType)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetDataEx(Gadget)
  CallGadgetEx_I1(result, Gadget, GetGadgetData, Gadget)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetFontEx(Gadget)
  CallGadgetEx_I1(result, Gadget, GetGadgetFont, Gadget)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetItemAttributeEx(Gadget, Item, Attribute, Column = 0) 
  CallGadgetEx_I4(result, Gadget, GetGadgetItemAttribute, Gadget, Item, Attribute, Column)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetItemColorEx(Gadget, Item, ColorType, Column = 0) 
  CallGadgetEx_I4(result, Gadget, GetGadgetItemColor, Gadget, Item, ColorType, Column)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetItemDataEx(Gadget, Item)
  CallGadgetEx_I2(result, Gadget, GetGadgetItemData, Gadget, Item)
  ProcedureReturn result
EndProcedure

Procedure GetGadgetItemStateEx(Gadget, Item)
  CallGadgetEx_I2(result, Gadget, GetGadgetItemState, Gadget, Item)
  ProcedureReturn result
EndProcedure

Procedure.s GetGadgetItemTextEx(Gadget, Item)
  CallGadgetEx_I2(result$, Gadget, GetGadgetItemText, Gadget, Item)
  ProcedureReturn result$
EndProcedure

Procedure GetGadgetStateEx(Gadget)
  CallGadgetEx_I1(result, Gadget, GetGadgetState, Gadget)
  ProcedureReturn result
EndProcedure

Procedure.s GetGadgetTextEx(Gadget)
  CallGadgetEx_I1(result$, Gadget, GetGadgetText, Gadget)
  ProcedureReturn result$
EndProcedure

Procedure HideGadgetEx(Gadget, State)
  CallGadgetEx_I2(result, Gadget, HideGadget, Gadget, State)
  ProcedureReturn result
EndProcedure

Procedure IsGadgetEx(Gadget)
  CallGadgetEx_I1(result, Gadget, IsGadget, Gadget)
  ProcedureReturn result
EndProcedure

Procedure RemoveGadgetColumnEx(Gadget, Column)
  CallGadgetEx_I2(result, Gadget, RemoveGadgetColumn, Gadget, Column)
  ProcedureReturn result
EndProcedure

Procedure RemoveGadgetItemEx(Gadget, Position)
  CallGadgetEx_I2(result, Gadget, RemoveGadgetItem, Gadget, Position)
  ProcedureReturn result
EndProcedure

Procedure ResizeGadgetEx(Gadget, x, y, Width, Height)
  CallGadgetEx_I5(result, Gadget, ResizeGadget, Gadget, x, y, Width, Height)
  ProcedureReturn result
EndProcedure

Procedure SetActiveGadgetEx(Gadget) 
  CallGadgetEx_I1(result, Gadget, SetActiveGadget, Gadget)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetAttributeEx(Gadget, Attribute, Value)
  CallGadgetEx_I3(result, Gadget, SetGadgetAttribute, Gadget, Attribute, Value)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetColorEx(Gadget, ColorType, Color)
  CallGadgetEx_I3(result, Gadget, SetGadgetColor, Gadget, ColorType, Color)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetDataEx(Gadget, Value)
  CallGadgetEx_I2(result, Gadget, SetGadgetData, Gadget, Value)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetFontEx(Gadget, FontId)
  CallGadgetEx_I2(result, Gadget, SetGadgetFont, Gadget, FontID)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetItemAttributeEx(Gadget, Item, Attribute, Value, Column=0)
  CallGadgetEx_I5(result, Gadget, SetGadgetItemAttribute, Gadget, Item, Attribute, Value, Column)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetItemColorEx(Gadget, Item, ColorType, Color, Column=0)
  CallGadgetEx_I5(result, Gadget, SetGadgetItemColor, Gadget, Item, ColorType, Color, Column)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetItemDataEx(Gadget, Item, Value)
  CallGadgetEx_I3(result, Gadget, SetGadgetItemData, Gadget, Item, Value)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetItemImageEx(Gadget, Item, ImageID)
  CallGadgetEx_I3(result, Gadget, SetGadgetItemImage, Gadget, Item, ImageID)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetItemStateEx(Gadget, Item, State)
  CallGadgetEx_I3(result, Gadget, SetGadgetItemState, Gadget, Item, State)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetItemTExtEx(Gadget, Item, Text$, Column=0)
  CallGadgetEx_I4(result, Gadget, SetGadgetItemText, Gadget, Item, Text$, Column)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetStateEx(Gadget, State)
  CallGadgetEx_I2(result, Gadget, SetGadgetState, Gadget, State)
  ProcedureReturn result
EndProcedure

Procedure SetGadgetTextEx(Gadget, Text$)
  CallGadgetEx_I2(result, Gadget, SetGadgetText, Gadget, Text$)
  ProcedureReturn result
EndProcedure

Procedure UnbindGadgetEventEx(Gadget, *CallBack, EventType = 0)
  CallGadgetEx_I3(result, Gadget, UnbindGadgetEvent, Gadget, *Callback, EventType)
  ProcedureReturn result
EndProcedure



;- Public ******************

Procedure GetCurrentWindow()
  If ListSize(WindowStack()) = 0
    ProcedureReturn -1
  Else
    ProcedureReturn WindowStack()\Window
  EndIf
EndProcedure

Procedure GetCurrentGadget()
  Protected CurrentWindow.s_WindowStackElement = WindowStack()
  If ListSize(CurrentWindow\GadgetStack()) = 0
    ProcedureReturn -1
  Else
    ProcedureReturn CurrentWindow\GadgetStack()\Gadget
  EndIf
EndProcedure

Procedure GetCurrentGadgetItem()
  Protected CurrentWindow.s_WindowStackElement = WindowStack()
  If ListSize(CurrentWindow\GadgetStack()) = 0
    ProcedureReturn -1
  Else
    ProcedureReturn CurrentWindow\GadgetStack()\Item
  EndIf
EndProcedure

Procedure RegisterGadget(*Gadget.s_RegisteredGadget)
  AddElement(*GadgetExList())
  *GadgetExList() = *Gadget
EndProcedure



Macro AddGadgetColumn(Gadget, Position, Title, Width)   
  AddGadgetColumnEx(Gadget, Position, Title, Width)   
EndMacro

Macro AddGadgetItem(Gadget, Position, Text, ImageId=0, Flags=0)  
  AddGadgetItemEx(Gadget, Position, Text, ImageId, Flags)  
EndMacro

Macro BindGadgetEvent(Gadget, Callback, EventType = 0)           
  BindGadgetEventEx(Gadget, Callback, EventType)           
EndMacro

Macro ClearGadgetItems(Gadget)
  ClearGadgetItemsEx(Gadget)
EndMacro

Macro CountGadgetItems(Gadget)       
  CountGadgetItemsEx(Gadget)       
EndMacro

Macro DisableGadget(Gadget, State)
  DisableGadgetEx(Gadget, State)
EndMacro

Macro GadgetHeight(Gadget, Mode=0)
  GadgetHeightEx(Gadget, Mode)
EndMacro

Macro GadgetID(Gadget)
  GadgetIDEx(Gadget)
EndMacro

Macro GadgetItemID(Gadget, Item)
  GadgetItemIDEx(Gadget, Item)
EndMacro

Macro GadgetToolTip(Gadget, TExt)                               
  GadgetToolTipEx(Gadget, TExt)                               
EndMacro

Macro GadgetType(Gadget)
  GadgetTypeEx(Gadget)
EndMacro

Macro GadgetWidth(Gadget, Mode = #PB_Gadget_ActualSize)
  GadgetWidthEx(Gadget, Mode)
EndMacro

Macro GadgetX(Gadget)
  GadgetXEx(Gadget)
EndMacro

Macro GadgetY(Gadget)
  GadgetYEx(Gadget)
EndMacro

Macro GetGadgetAttribute(Gadget, Attribute)                       
  GetGadgetAttributeEx(Gadget, Attribute)                       
EndMacro

Macro GetGadgetColor(Gadget, ColorType)
  GetGadgetColorEx(Gadget, ColorType)
EndMacro

Macro GetGadgetData(Gadget)
  GetGadgetDataEx(Gadget)
EndMacro

Macro GetGadgetFont(Gadget)
  GetGadgetFontEx(Gadget)
EndMacro

Macro GetGadgetItemAttribute(Gadget, Item, Attribute, Column = 0) 
  GetGadgetItemAttributeEx(Gadget, Item, Attribute, Column ) 
EndMacro

Macro GetGadgetItemColor(Gadget, Item, ColorType, Column = 0)     
  GetGadgetItemColorEx(Gadget, Item, ColorType, Column  )     
EndMacro

Macro GetGadgetItemData(Gadget, Item)
  GetGadgetItemDataEx(Gadget, Item)
EndMacro

Macro GetGadgetItemState(Gadget, Item)
  GetGadgetItemStateEx(Gadget, Item)
EndMacro

Macro GetGadgetItemText(Gadget, Item)
  GetGadgetItemTextEx(Gadget, Item)
EndMacro

Macro GetGadgetState(Gadget)
  GetGadgetStateEx(Gadget)
EndMacro

Macro GetGadgetText(Gadget)
  GetGadgetTextEx(Gadget)
EndMacro

Macro HideGadget(Gadget, State)
  HideGadgetEx(Gadget, State)
EndMacro

Macro IsGadget(Gadget)
  IsGadgetEx(Gadget)
EndMacro

Macro RemoveGadgetColumn(Gadget, Column)
  RemoveGadgetColumnEx(Gadget, Column)
EndMacro

Macro RemoveGadgetItem(Gadget, Position)
  RemoveGadgetItemEx(Gadget, Position)
EndMacro

Macro ResizeGadget(Gadget, x, y, Width, Height)
  ResizeGadgetEx(Gadget, x, y, Width, Height)
EndMacro

Macro SetActiveGadget(Gadget) 
  SetActiveGadgetEx(Gadget) 
EndMacro

Macro SetGadgetAttribute(Gadget, Attribute, Value)
  SetGadgetAttributeEx(Gadget, Attribute, Value)
EndMacro

Macro SetGadgetColor(Gadget, ColorType, Color)
  SetGadgetColorEx(Gadget, ColorType, Color)
EndMacro

Macro SetGadgetData(Gadget, Value)
  SetGadgetDataEx(Gadget, Value)
EndMacro

Macro SetGadgetFont(Gadget, FontId)
  SetGadgetFontEx(Gadget, FontId)
EndMacro

Macro SetGadgetItemAttribute(Gadget, Item, Attribute, Value, Column=0)
  SetGadgetItemAttributeEx(Gadget, Item, Attribute, Value, Column )
EndMacro

Macro SetGadgetItemColor(Gadget, Item, ColorType, Color, Column=0)
  SetGadgetItemColorEx(Gadget, Item, ColorType, Color, Column )
EndMacro

Macro SetGadgetItemData(Gadget, Item, Value)
  SetGadgetItemDataEx(Gadget, Item, Value)
EndMacro

Macro SetGadgetItemImage(Gadget, Item, ImageID)
  SetGadgetItemImageEx(Gadget, Item, ImageID)
EndMacro

Macro SetGadgetItemState(Gadget, Item, State)
  SetGadgetItemStateEx(Gadget, Item, State)
EndMacro

Macro SetGadgetItemText(Gadget, Item, Text, Column=0)
  SetGadgetItemTExtEx(Gadget, Item, Text, Column )
EndMacro

Macro SetGadgetState(Gadget, State)
  SetGadgetStateEx(Gadget, State)
EndMacro

Macro SetGadgetText(Gadget, Text)
  SetGadgetTextEx(Gadget, Text)
EndMacro

Macro UnbindGadgetEvent(Gadget, CallBack, EventType = 0)
  UnbindGadgetEventEx(Gadget, CallBack, EventType )
EndMacro



Macro OpenWindow(Window, X, Y, InnerWidth, InnerHeight, Title, Flags=0, ParentID=0)
  OpenWindowEx(Window, X, Y, InnerWidth, InnerHeight, Title, Flags, ParentID)
EndMacro

Macro CloseWindow(Window)
  CloseWindowEx(Window)
EndMacro

Macro ContainerGadget(Gadget, x, y, Width, Height, Flags=0)
  ContainerGadgetEx(Gadget, x, y, Width, Height, Flags)
EndMacro

Macro PanelGadget(Gadget, x, y, Width, Height) 
  PanelGadgetEx(Gadget, x, y, Width, Height) 
EndMacro

Macro ScrollAreaGadget(Gadget, x, y, Width, Height, ScrollAreaWidth, ScrollAreaHeight, ScrollStep=1, Flags=0) 
  ScrollAreaGadgetEx(Gadget, x, y, Width, Height, ScrollAreaWidth, ScrollAreaHeight, ScrollStep, Flags) 
EndMacro

Macro CloseGadgetList()
  CloseGadgetListEx()
EndMacro

Macro OpenGadgetList(Gadget, Item=-1)
  OpenGadgetListEx(Gadget, Item)
EndMacro

Macro FreeGadget(Gadget)
  FreeGadgetEx(Gadget)
EndMacro





It lacks documentation at this point, but basically it "captures" the PB Library functions with macros and sends them to our own Callbacks. If the gadget is not one of ours it will automatically call the originalPB functions. However, from with our callbacks we can't call these directly without risking an endless loop and eventually a stack overflow. Therefore we need to add a _PB suffix to the end of the original functionnames.

Here is a quick and dirty example of a simple ButtonRow Gadget. It consist of a container and you can add/set/remove buttons to it using the PB functions AddGadgetItem/RemoveGadgetItem and so on. It also shows the basic usage of the above library

Code: Select all

XIncludeFile "GadgetEx.pbi"



Declare AddGadgetColumn_CB(Gadget, Position, Title$, Width)            
Declare AddGadgetItem_CB(Gadget, Position, Text$, ImageId=0, Flags=0)  
Declare BindGadgetEvent_CB(Gadget, *Callback, EventType = 0)           
Declare ClearGadgetItems_CB(Gadget)                                    
Declare CountGadgetItems_CB(Gadget)       
Declare DisableGadget_CB(Gadget, State)
Declare FreeGadget_CB(Gadget)
Declare GadgetHeight_CB(Gadget, Mode)
Declare GadgetID_CB(Gadget)
Declare GadgetItemID_CB(Gadget, Item)
Declare GadgetToolTip_CB(Gadget, Text$)                               
Declare GadgetType_CB(Gadget)
Declare GadgetWidth_CB(Gadget, Mode)
Declare GadgetX_CB(Gadget)
Declare GadgetY_CB(Gadget)
Declare GetGadgetAttribute_CB(Gadget, Attribute)                       
Declare GetGadgetColor_CB(Gadget, ColorType)
Declare GetGadgetData_CB(Gadget)
Declare GetGadgetFont_CB(Gadget)
Declare GetGadgetItemAttribute_CB(Gadget, Item, Attribute, Column = 0) 
Declare GetGadgetItemColor_CB(Gadget, Item, ColorType, Column = 0)
Declare GetGadgetItemData_CB(Gadget, Item)
Declare GetGadgetItemState_CB(Gadget, Item)
Declare.s GetGadgetItemText_CB(Gadget, Item)
Declare GetGadgetState_CB(Gadget)
Declare.s GetGadgetText_CB(Gadget)
Declare HideGadget_CB(Gadget, State)
Declare IsGadget_CB(Gadget)
Declare RemoveGadgetColumn_CB(Gadget, Column)
Declare RemoveGadgetItem_CB(Gadget, Position)
Declare ResizeGadget_CB(Gadget, x, y, Width, Height)
Declare SetActiveGadget_CB(Gadget) 
Declare SetGadgetAttribute_CB(Gadget, Attribute, Value)
Declare SetGadgetColor_CB(Gadget, ColorType, Color)
Declare SetGadgetData_CB(Gadget, Value)
Declare SetGadgetFont_CB(Gadget, FontId)
Declare SetGadgetItemAttribute_CB(Gadget, Item, Attribute, Value, Column=0)
Declare SetGadgetItemColor_CB(Gadget, Item, ColorType, Color, Column=0)
Declare SetGadgetItemData_CB(Gadget, Item, Value)
Declare SetGadgetItemImage_CB(Gadget, Item, ImageID)
Declare SetGadgetItemState_CB(Gadget, Item, State)
Declare SetGadgetItemText_CB(Gadget, Item, T_CBt$, Column=0)
Declare SetGadgetState_CB(Gadget, State)
Declare SetGadgetText_CB(Gadget, T_CBt$)
Declare UnbindGadgetEvent_CB(Gadget, *CallBack, EventType = 0)


;- Internal Data
Structure s_ButtonData
  Gadget.i
  iData.i
EndStructure


Structure s_MyGadgetInternals
  *Register.s_RegisteredGadget
  List Buttons.s_ButtonData()
  Width.i
  Height.i
  x.i
  y.i
EndStructure


Global NewList MyGadgetList.s_MyGadgetInternals()

Procedure BR_SetGadgetList(Gadget)
  Protected i = 0
  ForEach  MyGadgetList()
    If MyGadgetList()\Register\Gadget = Gadget
      SelectElement(MyGadgetList(), i)
      Break
    EndIf
    i + 1
  Next
EndProcedure

  

Procedure BR_CalculateButtonSize()
  Protected btncount = ListSize(MyGadgetList()\Buttons())
  If btncount > 0
    ProcedureReturn MyGadgetList()\Width / btncount
  EndIf
EndProcedure

Procedure BR_EventHandler()
  Protected Item = EventGadget()
  Protected Gadget = GetGadgetData(Item)
  Protected i, edata
  BR_SetGadgetList(Gadget)
  ForEach MyGadgetList()\Buttons()
    If MyGadgetList()\Buttons()\Gadget = Item
      Break
    EndIf
    i + 1 
  Next
 
  PostEvent(#PB_Event_Gadget, EventWindow(), Gadget, 0, i)
EndProcedure

  
;- Callbacks
Procedure AddGadgetColumn_CB(Gadget, Position, Title$, Width)
  ProcedureReturn 0
EndProcedure

Procedure AddGadgetItem_CB(Gadget, Position, Text$, ImageId=0, Flags=0)  
  BR_SetGadgetList(Gadget)
  OpenGadgetList(Gadget)
  
  If Position = - 1 Or Position >= ListSize(MyGadgetList()\Buttons())
    AddElement(MyGadgetList()\Buttons())
  Else
    SelectElement(MyGadgetList()\Buttons(), Position+1)
    InsertElement(MyGadgetList()\Buttons())
  EndIf
  MyGadgetList()\Buttons()\Gadget = ButtonGadget(#PB_Any, 0, 0, 100, 25, Text$)
  SetGadgetData(MyGadgetList()\Buttons()\Gadget, Gadget)
  BindGadgetEvent_PB(MyGadgetList()\Buttons()\Gadget, @BR_EventHandler())
  Protected awidth = BR_CalculateButtonSize(), offset = 0
 
  ForEach MyGadgetList()\Buttons()
    ResizeGadget(MyGadgetList()\Buttons()\Gadget, offset * awidth, 0, awidth, MyGadgetList()\Height)
    offset + 1
  Next 
  CloseGadgetList()
EndProcedure

Procedure BindGadgetEvent_CB(Gadget, *Callback, EventType = 0)           
  BindGadgetEvent_PB(Gadget, *Callback, EventType)
EndProcedure

Procedure ClearGadgetItems_CB(Gadget)     
  BR_SetGadgetList(Gadget)
  ForEach MyGadgetList()\Buttons()
    FreeGadget_PB(MyGadgetList()\Buttons()\Gadget)
  Next
  FreeList(MyGadgetList()\Buttons())
  
EndProcedure

Procedure CountGadgetItems_CB(Gadget)       
  BR_SetGadgetList(Gadget)
  ProcedureReturn ListSize(MyGadgetList()\Buttons())
EndProcedure

Procedure DisableGadget_CB(Gadget, State)
  BR_SetGadgetList(Gadget)
  ProcedureReturn DisableGadget_PB(Gadget, State)
EndProcedure

Procedure FreeGadget_CB(Gadget)
  BR_SetGadgetList(Gadget)
  
  ; Free the allocated memory and remove gadget from our list
  FreeGadget_PB(Gadget)
  ForEach MyGadgetList()
    If MyGadgetList()\Register\Gadget = Gadget
      FreeList(MyGadgetList()\Buttons())
      FreeMemory(MyGadgetList()\Register)
      DeleteElement(MyGadgetList(), 1)
      Break
    EndIf
  Next
  
EndProcedure

Procedure GadgetHeight_CB(Gadget, Mode)
  If mode = #PB_Gadget_ActualSize  
    BR_SetGadgetList(Gadget)
    ProcedureReturn MyGadgetList()\Height
  Else
    ProcedureReturn 20
  EndIf
EndProcedure

Procedure GadgetID_CB(Gadget)
  BR_SetGadgetList(Gadget)
  ProcedureReturn GadgetID_PB(MyGadgetList()\Register\Gadget)
EndProcedure

Procedure GadgetItemID_CB(Gadget, Item)
  BR_SetGadgetList(Gadget)
  SelectElement(MyGadgetList()\Buttons(), Item)
  ProcedureReturn GadgetID_PB(MyGadgetList()\Buttons()\Gadget)
EndProcedure

Procedure GadgetToolTip_CB(Gadget, Text$)                               
  GadgetToolTip_PB(Gadget,Text$)
  BR_SetGadgetList(Gadget)
  ForEach MyGadgetList()\Buttons()
    GadgetToolTip_PB(MyGadgetList()\Buttons()\Gadget, Text$)
  Next
EndProcedure

Procedure GadgetType_CB(Gadget)
  ProcedureReturn  #PB_GadgetType_Unknown 
EndProcedure

Procedure GadgetWidth_CB(Gadget, Mode)
  If Mode = #PB_Gadget_ActualSize
    BR_SetGadgetList(Gadget)
    ProcedureReturn MyGadgetList()\Width
  Else
    ProcedureReturn 20
  EndIf
EndProcedure

Procedure GadgetX_CB(Gadget)
  BR_SetGadgetList(Gadget)
  ProcedureReturn MyGadgetList()\x  
EndProcedure

Procedure GadgetY_CB(Gadget)
  BR_SetGadgetList(Gadget)
  ProcedureReturn MyGadgetList()\y
EndProcedure

Procedure GetGadgetAttribute_CB(Gadget, Attribute)                       
  ProcedureReturn 0
EndProcedure

Procedure GetGadgetColor_CB(Gadget, ColorType)
  ProcedureReturn 0
EndProcedure

Procedure GetGadgetData_CB(Gadget)
  ProcedureReturn GetGadgetData_PB(Gadget)
EndProcedure

Procedure GetGadgetFont_CB(Gadget)
  ProcedureReturn #PB_Default
EndProcedure

Procedure GetGadgetItemAttribute_CB(Gadget, Item, Attribute, Column = 0) 
  ProcedureReturn 0
EndProcedure

Procedure GetGadgetItemColor_CB(Gadget, Item, ColorType, Column = 0)
  ProcedureReturn 0
EndProcedure

Procedure GetGadgetItemData_CB(Gadget, Item)
  BR_SetGadgetList(Gadget)
  SelectElement(MyGadgetList()\Buttons(), Item)
  ProcedureReturn MyGadgetList()\Buttons()\iData
EndProcedure

Procedure GetGadgetItemState_CB(Gadget, Item)
  ProcedureReturn 0
EndProcedure

Procedure.s GetGadgetItemText_CB(Gadget, Item)
  BR_SetGadgetList(Gadget)
  SelectElement(MyGadgetList()\Buttons(), Item)
  ProcedureReturn GetGadgetText_PB(MyGadgetList()\Buttons()\Gadget)
EndProcedure

Procedure GetGadgetState_CB(Gadget)
  ProcedureReturn 0
EndProcedure

Procedure.s GetGadgetText_CB(Gadget)
  ProcedureReturn ""
EndProcedure

Procedure HideGadget_CB(Gadget, State)
  ProcedureReturn HideGadget_PB(Gadget, State)
EndProcedure

Procedure IsGadget_CB(Gadget)
  ProcedureReturn IsGadget_PB(Gadget)
EndProcedure

Procedure RemoveGadgetColumn_CB(Gadget, Column)
  ProcedureReturn 0
EndProcedure

Procedure RemoveGadgetItem_CB(Gadget, Position)
  BR_SetGadgetList(Gadget)
  SelectElement(MyGadgetList()\Buttons(), Position)
  FreeGadget(MyGadgetList()\Buttons()\Gadget)
  FreeGadget(MyGadgetList()\Buttons())
  Protected w = BR_CalculateButtonSize(), offset = 0
  ForEach MyGadgetList()\Buttons()
    ResizeGadget_PB(MyGadgetList()\Buttons()\Gadget, offset * w, 0, w, MyGadgetList()\Height)
    offset + 1
  Next
EndProcedure

Procedure ResizeGadget_CB(Gadget, x, y, Width, Height)
  BR_SetGadgetList(Gadget)
  MyGadgetList()\x = x
  MyGadgetList()\y = y
  MyGadgetList()\Width = Width
  MyGadgetList()\Height = Height
  
  ResizeGadget_PB(Gadget, x, y, Width, height)
  
  Protected w = BR_CalculateButtonSize(), offset = 0
  ForEach MyGadgetList()\Buttons()
    ResizeGadget_PB(MyGadgetList()\Buttons()\Gadget, offset * w, 0, w, MyGadgetList()\Height)
    offset + 1
  Next
    
EndProcedure

Procedure SetActiveGadget_CB(Gadget) 
  ProcedureReturn SetActiveGadget_PB(Gadget)
EndProcedure

Procedure SetGadgetAttribute_CB(Gadget, Attribute, Value)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetColor_CB(Gadget, ColorType, Color)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetData_CB(Gadget, Value)
  ProcedureReturn SetGadgetData_PB(Gadget, Value)
EndProcedure

Procedure SetGadgetFont_CB(Gadget, FontId)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetItemAttribute_CB(Gadget, Item, Attribute, Value, Column=0)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetItemColor_CB(Gadget, Item, ColorType, Color, Column=0)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetItemData_CB(Gadget, Item, Value)
  BR_SetGadgetList(Gadget)
  SelectElement(MyGadgetList()\Buttons(), Item)  
  MyGadgetList()\Buttons()\iData = Value
EndProcedure

Procedure SetGadgetItemImage_CB(Gadget, Item, ImageID)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetItemState_CB(Gadget, Item, State)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetItemText_CB(Gadget, Item, Text$, Column=0)
  BR_SetGadgetList(Gadget)
  SelectElement(MyGadgetList()\Buttons(), Item)
  SetGadgetText_PB(MyGadgetList()\Buttons()\Gadget, Text$)
EndProcedure

Procedure SetGadgetState_CB(Gadget, State)
  ProcedureReturn 0
EndProcedure

Procedure SetGadgetText_CB(Gadget, T_CBt$)
  ProcedureReturn 0
EndProcedure

Procedure UnbindGadgetEvent_CB(Gadget, *CallBack, EventType = 0)  
  UnBindGadgetEvent_PB(Gadget, *Callback, EventType)
EndProcedure




Procedure MyGadgetCallbacks(*L.s_RegisteredGadget)
  *L\AddGadgetColumn_CB = @AddGadgetColumn_CB()
  *L\AddGadgetItem_CB = @AddGadgetItem_CB()
  *L\BindGadgetEvent_CB = @BindGadgetEvent_CB()
  *L\ClearGadgetItems_CB = @ClearGadgetItems_CB()
  *L\CountGadgetItems_CB = @CountGadgetItems_CB()
  *L\DisableGadget_CB = @DisableGadget_CB()
  *L\FreeGadget_CB = @FreeGadget_CB()
  *L\GadgetHeight_CB = @GadgetHeight_CB()
  *L\GadgetID_CB = @GadgetID_CB()
  *L\GadgetItemID_CB = @GadgetItemID_CB()
  *L\GadgetToolTip_CB = @GadgetToolTip_CB()
  *L\GadgetType_CB = @GadgetType_CB()
  *L\GadgetWidth_CB = @GadgetWidth_CB()
  *L\GadgetX_CB = @GadgetX_CB()
  *L\GadgetY_CB = @GadgetY_CB()
  *L\GetGadgetAttribute_CB = @GetGadgetAttribute_CB()
  *L\GetGadgetColor_CB = @GetGadgetColor_CB()
  *L\GetGadgetData_CB = @GetGadgetData_CB()
  *L\GetGadgetFont_CB = @GetGadgetFont_CB()
  *L\GetGadgetItemAttribute_CB = @GetGadgetItemAttribute_CB()
  *L\GetGadgetItemColor_CB = @GetGadgetItemColor_CB()
  *L\GetGadgetItemData_CB = @GetGadgetItemData_CB()
  *L\GetGadgetItemState_CB = @GetGadgetItemState_CB()
  *L\GetGadgetItemText_CB = @GetGadgetItemText_CB()
  *L\GetGadgetState_CB = @GetGadgetState_CB()
  *L\GetGadgetText_CB = @GetGadgetText_CB()
  *L\HideGadget_CB = @HideGadget_CB()
  *L\IsGadget_CB = @IsGadget_CB()
  *L\RemoveGadgetColumn_CB = @RemoveGadgetColumn_CB()
  *L\RemoveGadgetItem_CB = @RemoveGadgetItem_CB()
  *L\ResizeGadget_CB = @ResizeGadget_CB()
  *L\SetActiveGadget_CB = @SetActiveGadget_CB()
  *L\SetGadgetAttribute_CB = @SetGadgetAttribute_CB()
  *L\SetGadgetColor_CB = @SetGadgetColor_CB()
  *L\SetGadgetData_CB = @SetGadgetData_CB()
  *L\SetGadgetFont_CB = @SetGadgetFont_CB()
  *L\SetGadgetItemAttribute_CB = @SetGadgetItemAttribute_CB()
  *L\SetGadgetItemColor_CB = @SetGadgetItemColor_CB()
  *L\SetGadgetItemData_CB = @SetGadgetItemData_CB()
  *L\SetGadgetItemImage_CB = @SetGadgetItemImage_CB()
  *L\SetGadgetItemState_CB = @SetGadgetItemState_CB()
  *L\SetGadgetItemText_CB = @SetGadgetItemText_CB()
  *L\SetGadgetState_CB = @SetGadgetState_CB()
  *L\SetGadgetText_CB = @SetGadgetText_CB()
  *L\UnbindGadgetEvent_CB = @UnbindGadgetEvent_CB()
EndProcedure


Procedure.i ButtonRowGadget(Gadget, x, y, Width, Height, Flags=0)
  Protected result, g
  ; Create Container
   result = ContainerGadget(Gadget, x, y, Width, Height, Flags)
   CloseGadgetList()
  
  If Gadget = #PB_Any
    g = result
  Else
    g = Gadget
  EndIf
  AddElement(MyGadgetList())
  MyGadgetList()\Register = AllocateMemory(SizeOf(s_RegisteredGadget))
  MyGadgetCallbacks(MyGadgetList()\Register)
  MyGadgetList()\Register\Gadget = g
  MyGadgetList()\Height = Height
  MyGadgetList()\Width = Width
  MyGadgetList()\y = y
  MyGadgetList()\x = x
 
  Registergadget(MyGadgetList()\Register)
  ProcedureReturn result
EndProcedure




  



; ------------------ TEST

Procedure EventHandler()
  Debug "EventGadget = " + Str(EventGadget())
  Debug "Button " + Str(EventData()) + " clicked"
EndProcedure


OpenWindow(0, 0, 0, 400, 300, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonRowGadget(12, 10, 0, 200, 30)
Define BtnRow =  ButtonRowGadget(#PB_Any, 10, 25, 200, 30)
AddGadgetItem(12, 0, "Test 1")
AddGadgetItem(12, 1, "Test2")
AddGadgetItem(12, 2, "Test3")
AddGadgetItem(BtnRow, 0, "Button 1")
AddGadgetItem(BtnRow, 1, "Button 2")
AddGadgetItem(BtnRow, 2, "Button 3")
Debug btnrow 
ResizeGadget(BtnRow, 0, 50, 400, 150)

BindGadgetEvent(12, @EventHandler())
 
 
 Repeat 
 Define event = WaitWindowEvent()
 
 If event = #PB_Event_Gadget
   Debug EventGadget()
   Debug EventData()
 EndIf
  
 
 Until event = #PB_Event_CloseWindow



If you find bugs in the library itself (and there are surely quite a few) please say so :)
User avatar
Derren
Enthusiast
Enthusiast
Posts: 316
Joined: Sat Jul 23, 2011 1:13 am
Location: Germany

Re: Cross-platform custom gadgets framework

Post by Derren »

Hm, a nice demo of its full potential would be nice :)
IndigoFuzz

Re: Cross-platform custom gadgets framework

Post by IndigoFuzz »

Hi there :)

I've done a similar thing in the past, and can say that this is absolutely useful, and a lot more feature-filled than the implementation I conjured up. Thanks for sharing :)
empty
User
User
Posts: 27
Joined: Sat Apr 12, 2014 11:31 am

Re: Cross-platform custom gadgets framework

Post by empty »

Thank you for your comments! :)

I've posted one of the Custom Gadget we're using on this board.
It makes use of the GadgetEx library.
Post Reply