Cross-platform custom gadgets framework
Posted: Wed Sep 24, 2014 12:41 am
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
), 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:
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
If you find bugs in the library itself (and there are surely quite a few) please say so
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

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
