popupmenus in Igor7

The list that "pops up" from a Popupmenus in Igor7 has a vertical bar down it, with an empty space on the left side. For color table popup menu (and possibly other popup modes), this space contains a checkmark for the currently selected item. Are there any (perhaps undocumented) hooks to use this left side space with user defined menu list popup menus? Like being able to populate it with checks or bullets for selected items? I currently do something like this:


function/S NQ_ChanSelectList (chanVarStr, nChans)
	string chanVarStr
	variable nChans
	
	NVAR chanVar = $"root:Packages:twoP:Acquire:" + chanVarStr
	string chanSelList = ""
	variable iChan
	for (ichan =0; iChan < nChans; iChan +=1)
		if ((2^ichan) & chanVar) 
		chanSelList += "\\M1" + num2char(7) + " "
		else
			chanSelList += "   "
		endif
		chanSelList +=  num2str (iCHan) + ";"
	endfor
	return chanSelList
end


Function testChan_PopMenuProc(pa) : PopupMenuControl
	STRUCT WMPopupAction &pa

	switch( pa.eventCode )
		case 2: // mouse up
			
			NVAR chanVar = root:Packages:twoP:Acquire:scanChans
			String popStr = pa.popStr
			if (char2num (popStr[0]) != 7) // adding a new channel
				chanVar+= 2^(pa.popNum -1)
			else
				chanVar -=2^(pa.popNum -1)
			endif
			Variable popNum = pa.popNum
			
			break
		case -1: // control being killed
			break
	endswitch
	//print chanVar
	return 0
End

DisplayHelpTopic "Special Characters in Menu Item Strings"

But be aware that a PopupMenu control requires that special character interpretation be enabled, so you need to add "\\M1" to your menu items. DisplayHelpTopic "Enabling and Disabling Special Character Interpretation".

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
johnweeks wrote: DisplayHelpTopic "Special Characters in Menu Item Strings"

But be aware that a PopupMenu control requires that special character interpretation be enabled, so you need to add "\\M1" to your menu items. DisplayHelpTopic "Enabling and Disabling Special Character Interpretation".

John Weeks
WaveMetrics, Inc.
support@wavemetrics.com


Thanks John, that works, puts the checkmark in the intended location. It looks so much better.
Note that with this method of marking selections you can't use something like

if (char2num (popStr[0]) != 7)

to see if an item is selected; the checkmarks are not part of the string. It is easy to redo the functions so they work properly, though.

This code uses a variable for a bitwise channel selection (0 =1, 1-2, 2=4, 3=8, etc) and a string containing the list of channels. The popmenu shows the list of channels with selected channels checked. Selecting a currently unselected channel from the popmenu selects it, selecting a selected channel deselects it.


	PopupMenu popup0,pos={1.00,1.00},size={135.00,23.00},proc=ChanPopMenuProc,title="Selected Channels"
	PopupMenu popup0,mode=0,value= #"ChanSelectList ()"
	string/G root:chanStr =  "ch0-test1;ch1-test2;ch2-test3;ch3-test4;"
	variable/G root:chanVar = 0
	
	PopupMenu popup0,pos={1.00,1.00},size={135.00,23.00},proc=ChanPopMenuProc,title="Selected Channels"
	PopupMenu popup0,mode=0,value= #"ChanSelectList ()"

function/S ChanSelectList ()
 
	SVAR chanStr = root:chanStr
	NVAR chanVar = root:chanVar
	string chanSelList = ""
	variable iChan, nchans = ItemsInList(chanStr, ";") 
	for (ichan =0; iChan < nChans; iChan +=1)
		if ((2^ichan) & chanVar) 
			chanSelList += "\\M1" + StringFromList(iChan, chanStr, ";")  + "!*;"
		else
			chanSelList += StringFromList(iChan, chanStr, ";")  + ";"
		endif
	endfor
	return chanSelList
end
 
 
Function ChanPopMenuProc(pa) : PopupMenuControl
	STRUCT WMPopupAction &pa
 
	switch( pa.eventCode )
		case 2: // mouse up
 
			NVAR chanVar = root:chanVar
			variable chanPos = 2^(pa.popnum-1)
			if (chanPos & chanVar) // deselecting a new channel
				chanVar-= chanPos
			else // selecting a channel
				chanVar += chanPos
			endif 
			break
		case -1: // control being killed
			break
	endswitch
	return 0
End