Detecting which subpanel & control was target of interaction
rhjpires
With the great help of some of you I have made a panel with different subpanels, all with the same set of controls.
I would now need to know the subpanel the user interacted with upon pressing a button, a checkbox or a popupmenu.
Using the Proc associated with checkboxes, I have been testing several operations to print to the console the results of my tests, but I don't seem to be able to print more than the name of the parent panel, instead of the subpanel.
Could anyone help?
Thanks in advance!
R.
The Panel looks like this:
Function MakePanel()
NewPanel /W=(0,0,1200,600) /N=MyFunnyPanel/k=1
//Define Vertical guides
DefineGuide UGV0={FL,200},UGV1={UGV0,0.33333333,FR},UGV2={UGV0,0.66666666, FR}
//Define Horizonzal guides
DefineGuide UGH0={FB,0.5,FT}
string quote = "\""
String DataTypeList = quote + "Alpha;Beta;Delta;Gamma;Theta" + quote
String SectionList = quote + "First;Second;Third;Fourth;" + quote
//Create subpanels/subwindows where data will be displayed according to user input on controls
Variable i
for(i = 0; i < 6; i += 1)
switch(i)
case 0:
NewPanel/FG=(UGV0,FT,UGV1,UGH0)/HOST=MyFunnyPanel
break
case 1:
NewPanel/FG=(UGV1,FT,UGV2,UGH0)/HOST=MyFunnyPanel
break
case 2:
NewPanel/FG=(UGV2,FT,FR,UGH0)/HOST=MyFunnyPanel
break
case 3:
NewPanel/FG=(UGV0,UGH0,UGV1,FB)/HOST=MyFunnyPanel
break
case 4:
NewPanel/FG=(UGV1,UGH0,UGV2,FB)/HOST=MyFunnyPanel
break
case 5:
NewPanel/FG=(UGV2,UGH0,FR,FB)/HOST=MyFunnyPanel
break
endswitch
//Names of Controls
String SelectData = "SelectData"+num2str(i)
String Selectsection = "SelectSection"+num2str(i)
String CheckTS = "CheckTS"+num2str(i)
String CheckHist = "CheckHist"+num2str(i)
String CheckBar = "CheckBar"+num2str(i)
String PopButton = "PopButton"+num2str(i)
//Indicate controls needed
PopupMenu $SelectData, title="Data Type", bodyWidth=110, value=#DataTypeList, pos={120,10}
PopupMenu $SelectSection, title="Section", bodyWidth=100, value=#SectionList, pos={270,10}
CheckBox $CheckTS,pos={5,30},size={75,15},title="Time Series",value=1,mode=1, proc=CheckPlotTypeProc
CheckBox $CheckHist,pos={95,30},size={75,15},title="Histogram",value=0,mode=1, proc=CheckPlotTypeProc
CheckBox $CheckBar,pos={185,30},size={75,15},title="Average",value=0,mode=1, proc=CheckPlotTypeProc
Button $PopButton,title="pop",size={30,20}, pos={280,30}
// add more controls here...
RenameWindow #,$("P" + num2istr(i)) //Each subwindow has a name
endfor
SetActiveSubwindow ## //Go back to parent window
String/G ListOFSubWindows = ChildWindowList("MYFunnyPanel")
End
NewPanel /W=(0,0,1200,600) /N=MyFunnyPanel/k=1
//Define Vertical guides
DefineGuide UGV0={FL,200},UGV1={UGV0,0.33333333,FR},UGV2={UGV0,0.66666666, FR}
//Define Horizonzal guides
DefineGuide UGH0={FB,0.5,FT}
string quote = "\""
String DataTypeList = quote + "Alpha;Beta;Delta;Gamma;Theta" + quote
String SectionList = quote + "First;Second;Third;Fourth;" + quote
//Create subpanels/subwindows where data will be displayed according to user input on controls
Variable i
for(i = 0; i < 6; i += 1)
switch(i)
case 0:
NewPanel/FG=(UGV0,FT,UGV1,UGH0)/HOST=MyFunnyPanel
break
case 1:
NewPanel/FG=(UGV1,FT,UGV2,UGH0)/HOST=MyFunnyPanel
break
case 2:
NewPanel/FG=(UGV2,FT,FR,UGH0)/HOST=MyFunnyPanel
break
case 3:
NewPanel/FG=(UGV0,UGH0,UGV1,FB)/HOST=MyFunnyPanel
break
case 4:
NewPanel/FG=(UGV1,UGH0,UGV2,FB)/HOST=MyFunnyPanel
break
case 5:
NewPanel/FG=(UGV2,UGH0,FR,FB)/HOST=MyFunnyPanel
break
endswitch
//Names of Controls
String SelectData = "SelectData"+num2str(i)
String Selectsection = "SelectSection"+num2str(i)
String CheckTS = "CheckTS"+num2str(i)
String CheckHist = "CheckHist"+num2str(i)
String CheckBar = "CheckBar"+num2str(i)
String PopButton = "PopButton"+num2str(i)
//Indicate controls needed
PopupMenu $SelectData, title="Data Type", bodyWidth=110, value=#DataTypeList, pos={120,10}
PopupMenu $SelectSection, title="Section", bodyWidth=100, value=#SectionList, pos={270,10}
CheckBox $CheckTS,pos={5,30},size={75,15},title="Time Series",value=1,mode=1, proc=CheckPlotTypeProc
CheckBox $CheckHist,pos={95,30},size={75,15},title="Histogram",value=0,mode=1, proc=CheckPlotTypeProc
CheckBox $CheckBar,pos={185,30},size={75,15},title="Average",value=0,mode=1, proc=CheckPlotTypeProc
Button $PopButton,title="pop",size={30,20}, pos={280,30}
// add more controls here...
RenameWindow #,$("P" + num2istr(i)) //Each subwindow has a name
endfor
SetActiveSubwindow ## //Go back to parent window
String/G ListOFSubWindows = ChildWindowList("MYFunnyPanel")
End
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
October 26, 2017 at 04:55 pm - Permalink
As an example, see below:
NewPanel /W=(0,0,1200,600) /N=MyFunnyPanel//k=1
//Define Vertical guides
DefineGuide UGV0={FL,200},UGV1={UGV0,0.33333333,FR},UGV2={UGV0,0.66666666, FR}
//Define Horizonzal guides
DefineGuide UGH0={FB,0.5,FT}
string quote = "\""
String DataTypeList = quote + "Alpha;Beta;Delta;Gamma;Theta" + quote
String SectionList = quote + "First;Second;Third;Fourth;" + quote
String sSubPanelName
//Create subpanels/subwindows where data will be displayed according to user input on controls
Variable i
for(i = 0; i < 6; i += 1)
switch(i)
case 0:
NewPanel/FG=(UGV0,FT,UGV1,UGH0)/HOST=MyFunnyPanel
break
case 1:
NewPanel/FG=(UGV1,FT,UGV2,UGH0)/HOST=MyFunnyPanel
break
case 2:
NewPanel/FG=(UGV2,FT,FR,UGH0)/HOST=MyFunnyPanel
break
case 3:
NewPanel/FG=(UGV0,UGH0,UGV1,FB)/HOST=MyFunnyPanel
break
case 4:
NewPanel/FG=(UGV1,UGH0,UGV2,FB)/HOST=MyFunnyPanel
break
case 5:
NewPanel/FG=(UGV2,UGH0,FR,FB)/HOST=MyFunnyPanel
break
endswitch
sSubPanelName = "P" + num2istr(i)
RenameWindow #,$sSubPanelName //Each subwindow has a name
//Names of Controls
//Indicate controls needed
PopupMenu SelectData, title="Data Type", bodyWidth=110, value=#DataTypeList, pos={120,10}
PopupMenu SelectSection, title="Section", bodyWidth=100, value=#SectionList, pos={270,10}
CheckBox CheckTS,pos={5,30},size={75,15},title="Time Series",value=1,mode=1, proc=CheckPlotTypeProc
CheckBox CheckHist,pos={95,30},size={75,15},title="Histogram",value=0,mode=1, proc=CheckPlotTypeProc
CheckBox CheckBar,pos={185,30},size={75,15},title="Average",value=0,mode=1, proc=CheckPlotTypeProc
Button PopButton,title="pop",size={30,20}, pos={280,30}, proc=MyPopButtonProc
// add more controls here...
SetActiveSubwindow ## //Go back to parent window
endfor
String/G ListOFSubWindows = ChildWindowList("MYFunnyPanel")
End
Function MyPopButtonProc(B_Struct) : ButtonControl
STRUCT WMButtonAction &B_Struct
if(B_Struct.eventCode != 2) // ignore everything except mouse up
return 0
endif
String sWin = B_Struct.win
String sSubPanelNumber
SplitString/E=("#P([[:digit:]]+)") sWin, sSubPanelNumber
Variable vSubPanelNumber = str2num(sSubPanelNumber)
String sSelectDataValue, sSelectSectionValue
ControlInfo /W=$sWin SelectData
sSelectDataValue = S_Value
ControlInfo /W=$sWin SelectSection
sSelectSectionValue = S_Value
printf "Panel = %g, DataValue = %s, SectionValue = %s\r", vSubPanelNumber, sSelectDataValue, sSelectSectionValue
return 0
End
Hope this helps,
Kurt
October 26, 2017 at 11:42 pm - Permalink
From
DisplayHelpTopic "WMButtonAction"
i saw this: "char win[MAX_WIN_PATH+1] // Host window or subwindow name" sort of matching what you say but I have no idea of what to do with it.I guess that I could use a swich-case-endswich approach combined with eventcode numbering (Case 2) to detect mouse click on control, but how do I go from that to extracting the subwindow name and control name is not entirely clear to me.
Thanks for the help!
October 26, 2017 at 11:45 pm - Permalink
I'll have a look. As you can see your previous example for the overall panel design was very helpful.
Many thanks again!
Cheers,
R.
October 26, 2017 at 11:49 pm - Permalink
It looks like you are already doing it:
So maybe I misunderstood what the present problem is. In my testing, bstruc.win contains the full subwindow path to the subwindow that owns the button that triggered your action proc.
John Weeks
WaveMetrics, Inc.
support@wavemetrics.com
October 27, 2017 at 10:52 am - Permalink
Cheers,
R.
October 30, 2017 at 01:10 pm - Permalink