Panel Size Menus

Average rating
(0 votes)
Panel Size Menu.png

This procedure adds a Size submenu to the Panel menu so you can make an existing panel bigger or smaller.
It makes the controls bigger or smaller, too.
It unfortunately does this by killing and recreating the window, so don't be surprised when the window goes away.

#pragma TextEncoding = "UTF-8"
#pragma rtGlobals=3		// Use modern global access method and strict wave access.
#pragma ModuleName=PanelSizes
#pragma version=7	// circa Igor 7
 
#if IgorVersion() >= 7
Menu "Panel", dynamic
	"-"
	Submenu "Size"
		"Make Panel Bigger",/Q, PanelSizes#MakeTopPanelBigger()
		"Make Panel Smaller",/Q, PanelSizes#MakeTopPanelSmaller()
		"Make Panel Normal Size",/Q, PanelSizes#MakeTopPanelNormal()
		"\\M1:(:Panel Resolution = "+num2str(PanelResolution(WinName(0,64)))
		"\\M1:(:Screen Resolution = "+num2str(ScreenResolution)
	End
	"-"
End
#endif
 
static Function MakeTopPanelBigger()
 
	String panel= WinName(0,64)
	if( strlen(panel) )
		Variable currentRes= PanelResolution(panel)
		Variable newRes= BiggerResolution(currentRes)
		String newCode= RewritePanelCodeResolution(panel, newRes)
		KillWindow/Z $panel
		Execute/Q/Z newCode
		DoIgorMenu "Control", "Retrieve Window"
	endif	
End
 
static Function MakeTopPanelSmaller()
 
	String panel= WinName(0,64)
	if( strlen(panel) )
		Variable currentRes= PanelResolution(panel)
		Variable newRes= SmallerResolution(currentRes)
		String newCode= RewritePanelCodeResolution(panel, newRes)
		KillWindow/Z $panel
		Execute/Q/Z newCode
	endif	
End
 
static Function MakeTopPanelNormal()
 
	String panel= WinName(0,64)
	if( strlen(panel) )
		Variable newRes= 1 // This is the default setting in effect when Igor starts.
		String newCode= RewritePanelCodeResolution(panel, newRes)
		KillWindow/Z $panel
		Execute/Q/Z newCode
		DoIgorMenu "Control", "Retrieve Window"
	endif	
End
 
 
static StrConstant ksResolutions= "72;96;120;144;192;240;288;384;480;"
 
static Function BiggerResolution(currentRes)
	Variable currentRes
 
	Variable nextRes= ActualResolution(currentRes)
	String strRes= num2istr(nextRes)
	Variable whichOne = WhichListItem(strRes, ksResolutions)
	Variable numItems= ItemsInList(ksResolutions)
	if( whichOne >= 0 && whichOne < numItems-1)
		nextRes = str2num(StringFromList(whichOne+1, ksResolutions))
	else
		nextRes = str2num(StringFromList(numItems-1, ksResolutions))
	endif
	return nextRes
End
 
static Function SmallerResolution(currentRes)
	Variable currentRes
 
	Variable nextRes= ActualResolution(currentRes)
	String strRes= num2istr(nextRes)
	Variable whichOne = WhichListItem(strRes, ksResolutions)
	if( whichOne > 0 )
		nextRes = str2num(StringFromList(whichOne-1, ksResolutions))
	else
		nextRes = 72
	endif
	return nextRes
End
 
static Function ActualResolution(currentRes)
	Variable currentRes
 
	Variable actualRes= currentRes
	Variable screenRes= ScreenResolution // On Macintosh this was always 72 before Retina displays. On Windows it is usually 96 (small fonts) or 120 (large fonts).
	if( actualRes == 0 ) // points
		actualRes = screenRes
	elseif( actualRes == 1 )
		if( screenRes == 96 )
			actualRes = 72
		else
			actualRes = screenRes
		endif
	endif
	return actualRes
End
 
 
static Function/S RewritePanelCodeResolution(panel, newRes)
	String panel
	Variable newRes
 
	String code= WinRecreation(panel, 4)
	Wave/T tw = ListToTextWave(code, "\r")
 
	// insert three lines of code before line 2 (line 0 is Macro... and line 1 is PauseUpdate...)
	InsertPoints 2,3, tw
	tw[2]= "	SetIgorOption PanelResolution=?"
	tw[3]= "	Variable oldResolution = V_Flag"
	tw[4]= "	SetIgorOption PanelResolution="+num2istr(newRes)
 
 
	Variable lines= numpnts(tw)
 
	// insert SetIgorOption PanelResolution=oldResolution
	// before EndMacro (line lines-1)
	InsertPoints lines-1, 1, tw
	tw[lines-1]= "	SetIgorOption PanelResolution=oldResolution"
 
	// convert back to code
	String list
	wfprintf list, "%s\r", tw
 
	return list
End

Back to top