Responding to a choice in a Window menu

This lesson demonstrates how to respond to a choice in a Window menu.

The menuPick message

The menuPick message is sent when the user chooses a menu item from the menu. Remember that in LiveCode, menus are usually implemented as buttons:  the button's style and menuMode properties control how it is displayed, and the button's text property is used as the list of menu items. When the menuPick message is sent to the button, it triggers this handler.

The menuPick handler

In the mouseDown handler described in "Updating a menu with a list of open Windows", we placed the title of each open stack in the menu, and set a custom property called cCurrentStacksList containing the corresponding stack names. If that mouseDown handler is in the menu button's script (or the script of the menu bar group that contains the button), the property has already been set when the user clicked the menu, so it's ready when our menuPick handler is executed. This property is needed because the menu displays titles, not the actual stack names; the cCurrentStacksList property lets us figure out the name corresponding to the stack label the user chose.

The menuHistory property

The menuHistory property of a button menu is the number of the last-chosen menu item. Each line of the button contents becomes a separate menu item when the menu is displayed, so the menuHistory is also the line number of the menu item.

The menuPick handler also gets the text of the chosen menu item as a parameter. However, in this example, we don't really care what the text of the chosen menu item is: it's a stack title, and you can't specify a stack by its title in order to bring it to the front. Instead, we need the stack name stored in the button's cCurrentStacksList custom property.

The names were stored in the cCurrentStacksList property in the same order as the labels in the menu itself, so if we know the menu item's number, and get that line number of the cCurrentStacksList property, we have the name of the stack. The menuHistory gives us this number.

Once we've retrieved the stack's name from the cCurrentStacksList property, we use the go command to bring the stack window to the front. If there is some problem and the go command can't find the stack, it sets the result function to empty. The last thing we do is check the result, and beep if it's not empty.

The menuPick handler code

on menuPick 
	local tChosenStackName
	## goes in the menu button script
	## This handler assumes the button has a custom property
	## named "cCurrentStacksList" that contains the names of
	## the stacks listed in the menu
	put line (the menuHistory of me) of the cCurrentStacksList of me into tChosenStackName
	go stack tChosenStackName
	if the result is not empty then beep ## couldn't find stack
end menuPick 

An alternative

The cCurrentStacksList custom property is needed because the Window menu displays a list of the titles of open stacks instead of their names, for better readability, but you need the name, not the label, to refer to a stack. There's a simpler way to do this, if you don't mind displaying the name of each stack instead of its label in the Window menu. If the Window menu consists of a list of stack names, a handler to choose one of them looks like this:

on menuPick theStackName
	go stack theStackName
end menuPick


Andrew Taylor

As shown the code in this lesson does not work.
First, the Lesson that creates the list of stack names (and the text in this lesson) refer to cCurrentStacksList while the code uses cStackNamesList. But even if you fix that, it still does not work. (and oh, by the way, there is a bug reported in the lesson to create the stacks list as well - will somebody please update these lessons to be correct! What is the point of having lessons that do not work?) AND it would be useful to show where this code actually goes - as presented you have no idea. And no, the user guide does not show this information either.

Panos Merakos

Hello Andrew,

Thank you for the feedback - we will update this lesson (and the previous one) asap.

Kind regards,

Add your comment

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.