Module BindEvent with EventData
Posted: Sat Oct 07, 2017 12:42 pm
A solution from features request... Link http://www.purebasic.fr/english/viewtop ... =3&t=69342
Update v1.03
- Added MySetGadgetEventData(...)
Update v1.04
- Change: previous_eventdata = MySetGadgetEventData(...)
Update v1.05
- Added MyBindWindowEvent(...), MyUnbindWindowEvent(...), MySetWindowEventData(...)
Update v1.06
- Optimize code
Update v1.03
- Added MySetGadgetEventData(...)
Update v1.04
- Change: previous_eventdata = MySetGadgetEventData(...)
Update v1.05
- Added MyBindWindowEvent(...), MyUnbindWindowEvent(...), MySetWindowEventData(...)
Update v1.06
- Optimize code
Code: Select all
;-TOP
; Comment : Module MyBindEvent with EventData
; Author : mk-soft
; Version : v1.06
; Created : 07.10.2017
; Updated : 08.10.2017
; Gadget callback syntax : BindGadgetCB(EventData)
; Window callback syntax : BindWindowCB(EventData)
DeclareModule MyBindEvent
Declare MyBindGadgetEvent(Gadget, *Callback, EventType = #PB_All, EventData = 0)
Declare MyUnbindGadgetEvent(Gadget, *Callback, EventType = #PB_All)
Declare MySetGadgetEventData(Gadget, *Callback, EventType = #PB_All, EventData = 0)
Declare MyBindWindowEvent(Window, *Callback, Event = #PB_All, EventData = 0)
Declare MyUnbindWindowEvent(Window, *Callback, Event = #PB_All)
Declare MySetWindowEventData(Window, *Callback, Event = #PB_All, EventData = 0)
EndDeclareModule
Module MyBindEvent
EnableExplicit
Prototype protoBindGadgetCB(EventData)
Prototype protoBindWindowCB(EventData)
Structure udtGadgetEvent
Gadget.i
EventType.i
EventData.i
*Callback.protoBindGadgetCB
EndStructure
Structure udtWindowEvent
Window.i
Event.i
EventData.i
*Callback.protoBindWindowCB
EndStructure
Global NewList GadgetEventList.udtGadgetEvent()
Global NewList WindowEventList.udtWindowEvent()
Global ActiveGadgetEvent
Global ActiveWindowEvent
Declare BindWindowEvent(*Callback)
Declare UnbindWindowEvent(*Callback)
; ---------------------------------------------------------------------------
Procedure MyEventHandlerGadget()
Protected Gadget = EventGadget()
Protected EventType = EventType()
ForEach GadgetEventList()
With GadgetEventList()
If \Gadget = Gadget
If \EventType = EventType Or \EventType = #PB_All
\Callback(\EventData)
EndIf
EndIf
EndWith
Next
EndProcedure
; ---------------------------------------------------------------------------
Procedure MyBindGadgetEvent(Gadget, *Callback, EventType = #PB_All, EventData = 0)
LastElement(GadgetEventList())
AddElement(GadgetEventList())
With GadgetEventList()
\Gadget = Gadget
\EventType = EventType
\EventData = EventData
\Callback = *Callback
EndWith
If Not ActiveGadgetEvent
ActiveGadgetEvent = #True
BindEvent(#PB_Event_Gadget, @MyEventHandlerGadget())
EndIf
EndProcedure
; ---------------------------------------------------------------------------
Procedure MyUnbindGadgetEvent(Gadget, *Callback, EventType = #PB_All)
ForEach GadgetEventList()
With GadgetEventList()
If \Gadget = Gadget
If \Callback = *Callback
If \EventType = EventType
DeleteElement(GadgetEventList())
EndIf
EndIf
EndIf
EndWith
Next
If ListSize(GadgetEventList()) = 0
ActiveGadgetEvent = #False
UnbindEvent(#PB_Event_Gadget, @MyEventHandlerGadget())
EndIf
EndProcedure
; ---------------------------------------------------------------------------
Procedure MySetGadgetEventData(Gadget, *Callback, EventType = #PB_All, EventData = 0)
Protected old_eventdata
ForEach GadgetEventList()
With GadgetEventList()
If \Gadget = Gadget
If \Callback = *Callback
If \EventType = EventType
old_eventdata = \EventData
\EventData = EventData
Break
EndIf
EndIf
EndIf
EndWith
Next
ProcedureReturn old_eventdata
EndProcedure
; ---------------------------------------------------------------------------
Procedure MyEventHandlerWindow()
Protected Window = EventWindow()
Protected Event = Event()
ForEach WindowEventList()
With WindowEventList()
If \Window = Window
If \Event = Event Or \Event = #PB_All
\Callback(\EventData)
EndIf
EndIf
EndWith
Next
EndProcedure
; ---------------------------------------------------------------------------
Procedure MyBindWindowEvent(Window, *Callback, Event = #PB_All, EventData = 0)
LastElement(WindowEventList())
AddElement(WindowEventList())
With WindowEventList()
\Window = Window
\Event = Event
\EventData = EventData
\Callback = *Callback
EndWith
If Not ActiveWindowEvent
ActiveWindowEvent = #True
BindWindowEvent(@MyEventHandlerWindow())
EndIf
EndProcedure
; ---------------------------------------------------------------------------
Procedure MyUnbindWindowEvent(Window, *Callback, Event = #PB_All)
ForEach WindowEventList()
With WindowEventList()
If \Window = Window
If \Callback = *Callback
If \Event = Event
DeleteElement(WindowEventList())
EndIf
EndIf
EndIf
EndWith
Next
If ListSize(WindowEventList()) = 0
ActiveWindowEvent = #False
UnbindWindowEvent(@MyEventHandlerWindow())
EndIf
EndProcedure
; ---------------------------------------------------------------------------
Procedure MySetWindowEventData(Window, *Callback, Event = #PB_All, EventData = 0)
Protected old_eventdata
ForEach WindowEventList()
With WindowEventList()
If \Window = Window
If \Callback = *Callback
If \Event = Event
old_eventdata = \EventData
\EventData = EventData
Break
EndIf
EndIf
EndIf
EndWith
Next
ProcedureReturn old_eventdata
EndProcedure
; ---------------------------------------------------------------------------
Procedure BindWindowEvent(*Callback)
BindEvent(#PB_Event_Menu, *Callback)
BindEvent(#PB_Event_Gadget, *Callback)
BindEvent(#PB_Event_SysTray, *Callback)
BindEvent(#PB_Event_Timer, *Callback)
BindEvent(#PB_Event_CloseWindow, *Callback)
BindEvent(#PB_Event_Repaint, *Callback)
BindEvent(#PB_Event_SizeWindow, *Callback)
BindEvent(#PB_Event_MoveWindow, *Callback)
BindEvent(#PB_Event_MinimizeWindow, *Callback)
BindEvent(#PB_Event_MaximizeWindow, *Callback)
BindEvent(#PB_Event_RestoreWindow, *Callback)
BindEvent(#PB_Event_ActivateWindow, *Callback)
BindEvent(#PB_Event_DeactivateWindow, *Callback)
BindEvent(#PB_Event_GadgetDrop, *Callback)
BindEvent(#PB_Event_WindowDrop, *Callback)
BindEvent(#PB_Event_LeftClick, *Callback)
BindEvent(#PB_Event_LeftDoubleClick, *Callback)
BindEvent(#PB_Event_RightClick, *Callback)
EndProcedure
; ---------------------------------------------------------------------------
Procedure UnbindWindowEvent(*Callback)
UnbindEvent(#PB_Event_Menu, *Callback)
UnbindEvent(#PB_Event_Gadget, *Callback)
UnbindEvent(#PB_Event_SysTray, *Callback)
UnbindEvent(#PB_Event_Timer, *Callback)
UnbindEvent(#PB_Event_CloseWindow, *Callback)
UnbindEvent(#PB_Event_Repaint, *Callback)
UnbindEvent(#PB_Event_SizeWindow, *Callback)
UnbindEvent(#PB_Event_MoveWindow, *Callback)
UnbindEvent(#PB_Event_MinimizeWindow, *Callback)
UnbindEvent(#PB_Event_MaximizeWindow, *Callback)
UnbindEvent(#PB_Event_RestoreWindow, *Callback)
UnbindEvent(#PB_Event_ActivateWindow, *Callback)
UnbindEvent(#PB_Event_DeactivateWindow, *Callback)
UnbindEvent(#PB_Event_GadgetDrop, *Callback)
UnbindEvent(#PB_Event_WindowDrop, *Callback)
UnbindEvent(#PB_Event_LeftClick, *Callback)
UnbindEvent(#PB_Event_LeftDoubleClick, *Callback)
UnbindEvent(#PB_Event_RightClick, *Callback)
EndProcedure
; ---------------------------------------------------------------------------
EndModule
;- Example
CompilerIf #PB_Compiler_IsMainFile
UseModule MyBindEvent
Procedure WindowHandler(EventData)
Select Event()
Case #PB_Event_MoveWindow
Debug "Event MoveWindow on Window #" + EventWindow() + "; EventData = " + EventData
Case #PB_Event_CloseWindow
Debug "Event CloseWindow on Window #" + EventWindow() + "; EventData = " + EventData
EndSelect
EndProcedure
Procedure ButtonHandler(EventData)
Debug "Button click event on gadget #" + EventGadget() + "; EventData = " + EventData
EndProcedure
OpenWindow(0, 100, 100, 200, 90, "Click test", #PB_Window_SystemMenu)
MyBindWindowEvent(0, @WindowHandler(), #PB_Event_MoveWindow, 1)
MyBindWindowEvent(0, @WindowHandler(), #PB_Event_CloseWindow, 2)
ButtonGadget(0, 10, 10, 180, 30, "Click me")
MyBindGadgetEvent(0, @ButtonHandler(), #PB_EventType_LeftClick, 100)
ButtonGadget(1, 10, 50, 180, 30, "Click me")
MyBindGadgetEvent(1, @ButtonHandler(), #PB_EventType_LeftClick, 200)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
CompilerEndIf