Module BindEvent with EventData

Share your advanced PureBasic knowledge/code with the community.
User avatar
mk-soft
Always Here
Always Here
Posts: 6209
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Module BindEvent with EventData

Post by mk-soft »

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

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
Last edited by mk-soft on Sun Oct 08, 2017 2:10 pm, edited 3 times in total.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 6209
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BindEvent with EventData

Post by mk-soft »

Update v1.05
- Added MyBindWindowEvent(...), MyUnbindWindowEvent(...), MySetWindowEventData(...)

Is like BindGadgetEvent. :wink:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
mk-soft
Always Here
Always Here
Posts: 6209
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Module BindEvent with EventData

Post by mk-soft »

Update v1.06
- Optimize code

Now all window events ...
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Post Reply