Re: Dependent dynamic controls

• To: mathgroup at smc.vnet.net
• Subject: [mg100749] Re: Dependent dynamic controls
• From: István <replicatorzed at gmail.com>
• Date: Fri, 12 Jun 2009 05:47:06 -0400 (EDT)
• References: <h02vfq\$863\$1@smc.vnet.net> <h0l49i\$oq2\$1@smc.vnet.net>

Thank you all for your answers, the solution - as I now realize - is
pretty simple, I should have fiddled a bit more with the code.
Thanks again.
Istvan

On Jun 9, 12:37 pm, Albert Retey <a... at gmx-topmail.de> wrote:
> Hi,
>
> I think you can understand what happens when using some extra prints:
>
> Module[{sw = True, a, b, c, n, assign},
>
>  assign[switch_, x_] := If[switch,
>    a = x; c = f@x; n = Position[aSet, x][[1, 1]],
>    b = x; c = g@x; n = Position[bSet, x][[1, 1]]
>    ];
>
>  assign[sw, First@If[sw, aSet, bSet]];
>  Print[{a, b, c, n}];
>  Panel@Column@{
>     Dynamic@Column@{sw, If[sw, a, b], c, n},
>     Grid[{{
>        "a",
>        RadioButton[Dynamic[sw, (sw = #; assign[#, First@aSet]) =
&],
>         True],
>        PopupMenu[Dynamic[a, assign[sw, #] &], aSet,
>         Enabled -> Dynamic[sw]]
>        }, {
>        "b",
>        RadioButton[Dynamic[sw, (sw = #; assign[#, First@bSet]) =
&],
>         False],
>        PopupMenu[Dynamic[b, (Print[{sw, #}]; assign[sw, #]) &], b=
Set,
>         Enabled -> Dynamic[! sw]]
>        }}]
>     }
>
>  ]
>
> so what we learn is that actually everything works as intended, but then
> in the end the initialization of the PopupMenu calls the setter function
> once because b has no value yet. Whether this is what one should expect
> or not I don't know, maybe you can find something in the documentation.
> It is very easy to correct, though, by initializing b (in case sw is
> initialized to False you might want to also initialize a):
>
> Module[{sw = True, a = aSet[[1]], b = bSet[[1]], c, n, assign},
>
>  assign[switch_, x_] := If[switch,
>    a = x; c = f@x; n = Position[aSet, x][[1, 1]],
>    b = x; c = g@x; n = Position[bSet, x][[1, 1]]
>    ];
>
>  assign[sw, First@If[sw, aSet, bSet]];
>
>  Panel@Column@{
>     Dynamic@Column@{sw, If[sw, a, b], c, n},
>     Grid[{{
>        "a",
>        RadioButton[Dynamic[sw, (sw = #; assign[#, First@aSet]) =
&],
>         True],
>        PopupMenu[Dynamic[a, assign[sw, #] &], aSet,
>         Enabled -> Dynamic[sw]]
>        }, {
>        "b",
>        RadioButton[Dynamic[sw, (sw = #; assign[#, First@bSet]) =
&],
>         False],
>        PopupMenu[Dynamic[b, assign[sw, #] &], bSet,
>         Enabled -> Dynamic[! sw]]
>        }}]
>     }
>
>  ]
>
> I have also rearranged some Dynamics since the controls need not be
> recreated every time one of the variables changes.
> Another suggestion would be to use DynamicModule instead of just Module,
> but that depends also on what you really try to achieve. With Module you
> will create a set of variables at each call, and they will persist for
> the rest of the session.
>
> hth,
>
> albert

• Prev by Date: Re: Correction to "Fundamental Theorem of Calculus and
• Next by Date: Re: Re: Draw a 3D surface
• Previous by thread: Re: Dependent dynamic controls
• Next by thread: Speeding up code