Re: DynamicModule values not saved correctly in "docked" cells?
- To: mathgroup at smc.vnet.net
- Subject: [mg131577] Re: DynamicModule values not saved correctly in "docked" cells?
- From: Chris Osborn <chrisosb at gmail.com>
- Date: Sat, 7 Sep 2013 06:03:52 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-outx@smc.vnet.net
- Delivered-to: mathgroup-newsendx@smc.vnet.net
- References: <20130902064730.41C8E6A02@smc.vnet.net> <l09s4f$ja7$1@smc.vnet.net>
Hi John,
Thanks very much for your very thorough answer; it is quite helpful.
Chris
On Thursday, September 5, 2013 5:06:39 AM UTC-7, John Fultz wrote:
> Yes, it is expected. Docked cells are built from the expression on the
>
> rhs of the DockedCells option, and this option only changes when you
>
> explicitly set the option. So, the in-memory docked cell may have
>
> updated values, but these values will not be written to disk or MathLink
>
> because doing so would require rewriting the rhs of the DockedCells
>
> option (which might be impossible to do with full fidelity).
>
>
>
> One easy way to deal with this issue is to use TaggingRules at the
>
> notebook level as a sort of notebook-level DynamicModule variable.
>
> Here's an example function to replace your content[] function for docked
>
> cells:
>
>
>
> dockedCellContent[] :=
>
> Button[Dynamic[
>
> CurrentValue[EvaluationNotebook[], {TaggingRules, "x"},
>
> RandomReal[]]],
>
> CurrentValue[EvaluationNotebook[], {TaggingRules, "x"}]++]
>
>
>
> The technique is documented in the help system. Look up the topic
>
> tutorial/StoringAndTrackingPaletteStates. However, I'm adding one novel
>
> thing here which isn't documented there, which is the third argument of
>
> CurrentValue. I could have initialized the CurrentValue[] by doing
>
> something like:
>
>
>
> DynamicModule[{}, (* body *), =
>
> Initialization:>If[CurrentValue[EvaluationNotebook[], {TaggingRules,
>
> "x"}]===Inherited,CurrentValue[EvaluationNotebook[],
>
> {TaggingRules, "x"}]=RandomReal[]]]
>
>
>
> but this undocumented third argument does exactly that much more
>
> conveniently, and the format is unlikely to change (and probably will
>
> get documented in a future version).
>
>
>
> John Fultz
>
> jfultz at wolfram.com
>
> User Interface Group
>
> Wolfram Research, Inc.
>
>
>
>
>
>
>
> On Sep 2, 2013, at 1:47 AM, Chris Osborn <chrisosb at gmail.com> wrote:
>
>
>
> > It appears that for a DynamicModule expression in a "docked" cell,
>
> symbol assignments are not correctly saved when saving the associated
>
> notebook.
>
> >
>
> > In particular, when I save, close, and then reopen such a notebook, I
>
> find that the value assigned to each DynamicModule symbol is the initial
>
> value assigned to it, and not the value it had when the notebook was
>
> saved.
>
> >
>
> > Is this behavior expected?
>
> >
>
> >
>
> > I have written some code, included below, to demonstrate this issue
>
> (tested on Mathematica 9.0.1.0). The code creates a new notebook with
>
> one docked cell and one non-docked cell. Both cells have DynamicModule
>
> expressions with a single variable in them, and have buttons that
>
> increment the value of their respective variables. To reproduce my
>
> issue:
>
> >
>
> > 1. Execute the code I give below
>
> > 2. In that notebook that is created, click the button in each cell a
>
> few times, causing the values displayed in the buttons to increase by 1
>
> each time
>
> > 3. Save the notebook and close it
>
> > 4. Re-open the notebook
>
> >
>
> > The value in the non-docked cell will be as expected; the value in the
>
> docked cell will be the original value (before clicking the button.)
>
> Here is the code:
>
> >
>
> > ClearAll[content];
>
> > content[] :=
>
> > DynamicModule[{x},
>
> > x = Random[];
>
> > Button[Dynamic[x], x++]
>
> > ];
>
> >
>
> > CreateDocument[
>
> > {content[]},
>
> > DockedCells -> Cell[BoxData@ToBoxes@content[], "DockedCell"]
>
> > ];
>
> >
>
> >
>
> >
>
> > Much thanks in advance for any suggestions!
>
> >
>
> >
>
> > Thanks,
>
> > Chris
>
> >
- References:
- DynamicModule values not saved correctly in "docked" cells?
- From: Chris Osborn <chrisosb@gmail.com>
- DynamicModule values not saved correctly in "docked" cells?