menu events

BlitzMax Forums/MaxGUI Module/menu events

CloseToPerfect(Posted 2009) [#1]
I have multiple windows and potentially multiple menus. I am trying to capture menu events from the specific window but it doesn't catch the EVENT_MENU ACTION.

Code 1
Repeat
	WaitEvent()
	Select EventSource()
	Case mainWindow
		Select EventID()
		Case EVENT_WINDOWCLOSE
			End
		Case EVENT_MENUACTION
			Print "menu action"
			Select EventData()
			Case MENU_EXIT
				End
			EndSelect
		End Select
	End Select
Forever


I can only capture the menu actions from outside the SourceID() like this
Repeat
	WaitEvent()
	Select EventSource()
	Case mainWindow
		Select EventID()
		Case EVENT_WINDOWCLOSE
			End
		End Select
	End Select
	Select EventID()
	Case EVENT_MENUACTION
		Select EventData()
		Case MENU_EXIT
			End
		EndSelect
	End Select
Forever


So am I right in thinking that if I have multiple menus in multiple windows that I have to check all the menus in one EventID() outside of specific EventSource() for local windows?

This isn't a problem if this is the way it works, I was just assuming that a menu tied to a window would generate EventID() under the EventSource of the window it is in.

John


skidracer(Posted 2009) [#2]
The source I think is the menu gadget handle returned by CreateMenu not the parent window gadget.

CreateMenu example modified with extra logging:
' createmenu.bmx

Import MaxGui.Drivers

Strict 

Local window:TGadget
Local filemenu:TGadget
Local editmenu:TGadget
Local helpmenu:TGadget

Const MENU_NEW=101
Const MENU_OPEN=102
Const MENU_SAVE=103
Const MENU_CLOSE=104
Const MENU_EXIT=105

Const MENU_CUT=106
Const MENU_COPY=107
Const MENU_PASTE=108

Const MENU_ABOUT=109

window=CreateWindow("My Window",40,40,320,240)

filemenu=CreateMenu("&File",0,WindowMenu(window))
CreateMenu"&New",MENU_NEW,filemenu,KEY_N,MODIFIER_COMMAND
CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
CreateMenu"&Close",MENU_CLOSE,filemenu,KEY_W,MODIFIER_COMMAND
CreateMenu"",0,filemenu
CreateMenu"&Save",MENU_SAVE,filemenu,KEY_S,MODIFIER_COMMAND
CreateMenu"",0,filemenu
CreateMenu"E&xit",MENU_EXIT,filemenu,KEY_F4,MODIFIER_COMMAND

editmenu=CreateMenu("&Edit",0,WindowMenu(window))
CreateMenu "Cu&t",MENU_CUT,editmenu,KEY_X,MODIFIER_COMMAND
CreateMenu "&Copy",MENU_COPY,editmenu,KEY_C,MODIFIER_COMMAND
CreateMenu "&Paste",MENU_PASTE,editmenu,KEY_V,MODIFIER_COMMAND

helpmenu=CreateMenu("&Help",0,WindowMenu(window))
CreateMenu "&About",MENU_ABOUT,helpmenu

UpdateWindowMenu window

While True
	WaitEvent 
	If CurrentEvent.source
	 DebugLog CurrentEvent.ToString()+" src="+CurrentEvent.source.tostring()
	EndIf
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
		Case EVENT_MENUACTION
			Select EventData()
				Case MENU_EXIT
					End
				Case MENU_ABOUT
					Notify "Incrediabler~n(C)2005 Incredible Software"
			End Select
	End Select
Wend



CloseToPerfect(Posted 2009) [#3]
I think I get it now, the menu event doesn't come from a window source.

Which is why this code doesn't work.
Import MaxGui.Drivers

Strict 
Local window1:TGadget=CreateWindow("Window 1",0,0,200,200)
Local window2:TGadget=CreateWindow("Window 2",250,0,200,200)

Local menu1:TGadget=CreateMenu("Menu 1",0,WindowMenu(window1))
Const item1=100
Local menuItem1:TGadget=CreateMenu("Item 1",item1,menu1)
UpdateWindowMenu window1

Local menu2:TGadget=CreateMenu("Menu 2",0,WindowMenu(window2))
Const item2=200
Local menuItem2:TGadget=CreateMenu("Item 2",item2,menu2)
UpdateWindowMenu window2

Repeat 
WaitEvent
Select EventSource()
Case window1
	Select EventID()
	Case EVENT_WINDOWCLOSE
		End
	Case EVENT_MENUACTION
		Print"Menu 1 action"
	End Select
Case window2
	Select EventID()
	Case EVENT_WINDOWCLOSE
		End
	Case EVENT_MENUACTION
		Print"Menu 2 action"
	End Select
End Select
Forever


But then you would think that you could source a menu but this doesn't work either?
Repeat 
WaitEvent
Select EventSource()
Case window1
	Select EventID()
	Case EVENT_WINDOWCLOSE
		End
	End Select
Case window2
	Select EventID()
	Case EVENT_WINDOWCLOSE
		End
	End Select	
Case menu1
	Select EventID()
	Case EVENT_MENUACTION
		Print"Menu 1 action"
	End Select
Case menu2
	Select EventID()
	Case EVENT_MENUACTION
		Print"Menu 2 action"
	End Select	
End Select
Forever


so I guess not all TGadets generate SourceID information.


SebHoll(Posted 2009) [#4]
Menus with children don't generate events. If you, however, replace menu1 with menuItem1, you should find that the sub-menu generates an event.