Re: Use of RuleDelayed in PaneSelector
- To: mathgroup at smc.vnet.net
- Subject: [mg91146] Re: Use of RuleDelayed in PaneSelector
- From: Albert Retey <awnl at gmx-topmail.de>
- Date: Thu, 7 Aug 2008 04:41:22 -0400 (EDT)
- References: <g7bqtd$mrh$1@smc.vnet.net>
Hi,
> I'm trying to implement a potentially infinite GUI tree control using
> PaneSelector's and Opener's.
> The issue is that I use RuleDelayed in the PaneSelector's first
> argument to make the contents of panels lazy, so that the contents
> would be constructed only when the corresponding panel is activated.
> For example:
>
> {Toggler[Dynamic[x]], PaneSelector[{False -> "Inactive", True :>
> Print["Activated!"]}, Dynamic[x]]}
>
> I want this to produce a widget that prints "Activated!" each time x
> transitions to True. However, all I get is an expression
> Print["Activated!"].
> If I wrap it into Evaluate[], I get "Activated!" printed immediately
> and only once.
>
> How should this code be written to satisfy the condition above?
The following works, although I'm not sure whether I would recommend to
build on it. The trick is to use Dynamic in the content of the pane
selector and make x appear within that dynamic, so we use x as a dummy
argument for the activate function. There are of course other
possibilities to achieve the above but having an extra activate function
might be a good idea anyway. With these changes, "Activated!" will be
printed if the pane becomes visible _and_ x changes, which in this case
always happens when pane becomes visible by toggling the Toggler, but
not if e.g. the pane selector is scrolled out of sight and back.
ClearAll[activate]
activate[x_] := Print["Activated!"]
{
Toggler[Dynamic[x]],
PaneSelector[
{False -> "Inactive", True -> Dynamic[activate[x]]}, Dynamic[x]
]
}
> ....OK, perhaps is a 'potentially infinite GUI tree control' already
> written somewhere in the standard library? :)
honestly, I have problems to imagine what a potentially infinity GUI
would look like on my 1280x1024 pixel screen :-).
hth,
albert