How to poll all controls when interacting with any control?

I have a panel that pulls data from about a dozen experiments, each using two probes that have three probe modes and various replicate data files per experiment per mode. The goal is to choose where the wavelength region that each probe is sensitive to overlaps to tease out some fine features of the system. An image of the panel is attached.

The way I understand building panels is that each control has a proc that does a thing based on the control. For example, a slider proc starts out:

Function SliderProc(sa) : SliderControl
    STRUCT WMSliderAction &sa
 
    switch( sa.eventCode )
        case -3: // Control received keyboard focus
        case -2: // Control lost keyboard focus
        case -1: // Control being killed
            break
        default:
            if( sa.eventCode & 1 ) // value set
                Variable curval = sa.curval
            endif
            break
    endswitch
 
    return 0
End

and we can do stuff based on the value of the slider by using the variable curval.

Now: looking at my panel, I have four controls that determine which waves get put into the main graph, and one slider control that determines how they're graphed. The specific combination of the three drop-down menus and the radio buttons determines which two waves I use. I would like to update the waves in the graph when any of the controls are interacted with, but I don't know how to access the state of all controls when I can only interact with one control at a time. I'd like to avoid polluting my experiment file with global variables, but I suppose that's one way to accomplish this. Are there better, more robust ways?

pic of my panel

You can use the ControlInfo operation to get state of any control.  Consider creating one function that is called by your various control specific functions.  This "master" function can poll the other controls for their current state and then decide what wave to plot.

Hi,

You could create a master wave that holds all the values with a function attached to each control to update the particular value when changed. I have always been a big fan/user of dim labels and I could see a 1-D wave with the control name as the dim label and the value stored there.  The beauty of this is that you can look at the wave and seen the current values all in one place.  Typically I use two waves on for numeric values and the second, a text wave, for strings.

Andy

Consider the approach below using a Structure. The disadvantage is that any change carries the overhead to query the state of all controls. The advantage is having a "structured" way to retrieve values without using globals.

Structure panelStructure
    variable expnum
    variable mode
    variable probe1run
    variable probe2run
    variable umbondary
endStructure
 
Function get_PanelValues(pS)
    STRUCT panelStructure &pS
    
    ControlInfo/W=... puexpnum
    ps.expnum = v_value
    ControlInfo/W=... cbmode
    ps.mode = v_value
    ...
    ControlInfo/W=... svum
    ps.umboundary = v_value
end
 
Function update_waves()
 
    STRUCT panelStructure &pS
    get_PanelValues(pS)
    apply_changes(pS)
    
    return 0
end
 
Function apply_changes(pS)
    STRUCT panelStructure &pS
 
    switch(pS.mode)
        case 1:
            ...
    endswitch
    return 0
end
 
Function SliderProc(sa) : SliderControl
    STRUCT WMSliderAction &sa
 
    switch( sa.eventCode )
        case -3: // Control received keyboard focus
        case -2: // Control lost keyboard focus
        case -1: // Control being killed
            break
        default:
            update_waves()
            break
    endswitch
 
    return 0
End

The expansive approach can be narrowed through selective elimination of what is required as "global" content for any given change in any given control.

Hope this gives you some insights.