MaxGui Program Flow

BlitzMax Forums/BlitzMax Programming/MaxGui Program Flow

I have been tinkering with a way of breaking up large programs up into neat little chucks. Here is what i have come up with so far;

This method uses one master hook, to send events to the correct place depending on the source of the event.

'
' Main program flow : work in progress
'

SuperStrict


Type TMasterEventHook

  'Master sub hook list of intrested gadgets
  Global tSubHookIntrestedList:TList=Null    'Starts off empty

  Method New()
    If tSubHookIntrestedList:TList=Null
      Print "Sub hook list created"
      tSubHookIntrestedList:TList=CreateList()
      EndIf
    End Method

  'Add the master hooking method in
  Function InstallMasterHook()
    Print "Hook installed"
    AddHook EmitEventHook,TMasterEventHook.ProcessEvents
    End Function


  'All events pass to here
  Function ProcessEvents:Object(iId:Int,tData:Object,tContext:Object)

    If tData=Null Then Return Null     'Nothing here to work on
    Local tEv:TEvent=TEvent(tData)     'Convert into an event
    
    'Scan the list, see if we have a source
    For Local tSH:TSubEventHook = EachIn tSubHookIntrestedList:TList
      If tSH.pWidget = tEv.Source 
        tSH.OnEvent(tEv)    'Send the event to the proper place
        Return Null
        EndIf
      Next
'    Print tEv.Source.tostring()+" -> "+tEv.tostring()

    Return Null     'Presume we want to capture events!
    End Function


  End Type



Type TSubEventHook Extends TMasterEventHook

  Method New()
    Print "Sub hook in"
    ListAddLast TMasterEventHook.tSubHookIntrestedList,Self
    End Method

  Field pWidget:TGadget=Null             'Events of this gadget needed

  Method OnEvent(tEv:TEvent) Abstract    '----> coded someplace else

  End Type




'_/ code \____________________________________________________________________________________________________



Type TWin1Code Extends TSubEventHook  

  'Register a gadget to this code lump ....
  Function RegisterGadget:TWin1Code(tG:TGadget)
    Local tSH:TWin1Code = New TWin1Code
    tSH.pWidget = tG
    Return tSH:TWin1Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TWin 1 Code -> "+tEv.tostring()

    'Event handle...
    Select tEv.Id
      Case EVENT_WINDOWCLOSE
      End    'Quit this program on window close
      End Select

    End Method

  End Type





Type TBut1Code Extends TSubEventHook  

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut1Code(tG:TGadget)
    Local tSH:TBut1Code = New TBut1Code
    tSH.pWidget = tG
    Return tSH:TBut1Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 1 Code -> "+tEv.tostring()
    End Method

  End Type






Type TBut2Code Extends TSubEventHook  

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut2Code(tG:TGadget)
    Local tSH:TBut2Code = New TBut2Code
    tSH.pWidget = tG
    Return tSH:TBut2Code
    End Function


  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 2 Code -> "+tEv.tostring()
    End Method

  End Type





Type TBut3Code Extends TSubEventHook  

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut3Code(tG:TGadget)
    Local tSH:TBut3Code = New TBut3Code
    tSH.pWidget = tG
    Return tSH:TBut3Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 3 Code -> "+tEv.tostring()
    End Method

  End Type






Type TBut4Code Extends TSubEventHook  

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut4Code(tG:TGadget)
    Local tSH:TBut4Code = New TBut4Code
    tSH.pWidget = tG
    Return tSH:TBut4Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 4 Code -> "+tEv.tostring()
    End Method

  End Type




Type TBut5Code Extends TSubEventHook  

  'Register a gadget to this code lump ....
  Function RegisterGadget:TBut5Code(tG:TGadget)
    Local tSH:TBut5Code = New TBut5Code
    tSH.pWidget = tG
    Return tSH:TBut5Code
    End Function

  'Event processing for this gadget
  Method OnEvent(tEv:TEvent)
    Print "TBut 5 Code -> "+tEv.tostring()
    End Method

  End Type





'Gui building ...
Global pWin1:TGadget=CreateWindow("Supersize me!",500,100,400,400,Null,WINDOW_TITLEBAR|WINDOW_RESIZABLE|WINDOW_CLIENTCOORDS)
Global pBut1:TGadget=CreateButton("But1",40,40,80,26,pWin1)
Global pBut2:TGadget=CreateButton("But2",40,120,80,26,pWin1)
Global pPan1:TGadget=CreatePanel(180,50,200,200,pWin1,PANEL_BORDER)
Global pBut3:TGadget=CreateButton("But3",40,10,80,26,pPan1)
Global pPan2:TGadget=CreatePanel(20,300,240,80,pWin1,PANEL_BORDER)
Global pBut4:TGadget=CreateButton("But4",40,20,80,26,pPan2)
Global pBut5:TGadget=CreateButton("But5",140,40,80,26,pPan2)
SetMinWindowSize pWin1,200,200


'Install sub event hooks for given gadgets ....
Local tWin1Logic:TWin1Code = TWin1Code.RegisterGadget( pWin1 )
Local tBut1Logic:TBut1Code = TBut1Code.RegisterGadget( pBut1 )
Local tBut2Logic:TBut2Code = TBut2Code.RegisterGadget( pBut2 )
Local tBut3Logic:TBut3Code = TBut3Code.RegisterGadget( pBut3 )
Local tBut4Logic:TBut4Code = TBut4Code.RegisterGadget( pBut4 )
Local tBut5Logic:TBut5Code = TBut5Code.RegisterGadget( pBut5 )


'Master hook routine install
TMasterEventHook.InstallMasterHook()

'Main loopage
Repeat
  WaitEvent
  Forever
End


Anyone got a better way of looking after program flow in Blitzmax gui mod?.

Now im just waiting for flameduck to get medievil on my ass now, telling me a better OOP way of doing it! :D

As i do this, i have a program split into;

[Codelump] extends ..
[hook (sub)] extends ..
[logic] extends ..
[data] extends ..
[ui] (base)

Now as long as the data held in logic, data and ui (user interface) remains global then all codelumps can access what they need :).

All is looking well so far.

Now after a spot of "RTFM" i have found a command called ...
"SetGadgetTarget" Now this could be usefull!