Re: Creating a simple state inspector for Mathematica
- To: mathgroup at smc.vnet.net
- Subject: [mg111853] Re: Creating a simple state inspector for Mathematica
- From: "Sjoerd C. de Vries" <sjoerd.c.devries at gmail.com>
- Date: Sun, 15 Aug 2010 07:38:44 -0400 (EDT)
- References: <i45rgt$g5a$1@smc.vnet.net>
Hi Jason,
Nice idea and programming. It is always surprising how succinct a
reasonable complex idea can be programmed in Mathematica.
I changed the code a bit and it seems to work now, but I have not done
deep debugging.
My changes:
1. Ariel ==> Arial
2. I remove the symbol in the inspector context as well if it is
removed from the Global context. If you don't do that the line (#1 =
#2) &[Symbol["inspector`" <> #1], False] part yields False=False
(i.e., Set, not Equal) when you re-create a variable you have Removed
before. This happens because the evaluation cycle of Mathematica first
replaces the Symbol part with the corresponding variable and then with
its value.
The code:
Dynamic@Refresh[
Grid[Partition[(OpenerView[{Row[{Style[#, FontFamily -> "Arial"],
Spacer[6],
Button[Style["Clear", 10],
ToExpression["Clear[" <> # <> "]"],
Appearance -> "Palette"], Spacer[6],
Button[Style["Remove", 10],
ToExpression[
"Remove[" <> # <> "," <> "inspector`" <> # <> "]"],
Appearance -> "Palette"]}
],
Framed[Dynamic[Symbol[#]], ImageSize -> Scaled[1],
Background -> White]
},
ToExpression["Dynamic[inspector`" <> # <> "]"]] &) /@
Names["Global`*"],
3, 3, {1, 1}, {}
], Alignment -> {Left, Baseline},
Background -> {Automatic, {{RGBColor[0.98996, 0.950057, 0.785382],
RGBColor[1, 0.983169, 0.877287]}}}, ItemSize -> Scaled[.333]],
UpdateInterval -> 1]
(*Whenever a new symbol is created in the Global` context,create a \
shadow symbol in the inspector` context to track whether or not the \
value of the symbol is shown.*)
$NewSymbol = (If[#2 == "Global`", (#1 = #2) &[
Symbol["inspector`" <> #1], False]] &);
Cheers -- Sjoerd
On Aug 14, 12:35 pm, "J. McKenzie Alexander" <ja... at lse.ac.uk> wrote:
> Hi,
>
> I'm trying to create a simple "state inspector" for Mathematica. Ideally,
> I'd like to have a dynamically updated list of all the symbols in Global`=
,
> with the option of displaying their values, and the ability to Clear o=
r Remove symbols by clicking on a button. Now, I've managed to put together=
something which *almost* does what I want, but it has a slight bug. What's=
the bug? You can Clear a symbol by clicking on the button named "Clear", b=
ut clicking on the button named "Remove" generates an error. I don't unders=
tand why.
>
> Here's the code:
>
> (*
> The following creates a 3-column Grid of OpenerViews. The
> first entry in the OpenerView is the name of the symbol. If the disclosur=
e
> triangle of the OpenerView is toggled, it shows the current value of that
> symbol (using Dynamic). If you read the code closely, you will see that
> the state of the OpenerView for symbol X - either True or False - is stor=
ed
> in a symbol named inspector`X. This is done so that the value of the symb=
ol
> is consistently shown or hidden as the Grid is redrawn (which happens
> whenever new symbols are added or removed from the Global context).
> *)
> Dynamic@Refresh[
> Grid[
> Partition[
> (OpenerView[
> {
> Row[{
> Style[#, FontFamily -> "Ariel"],
> Spacer[6],
> Button[Style["Clear", 10],
> ToExpression["Clear[" <> # <> "]"],
> Appearance -> "Palette"],
> Spacer[6],
> Button[Style["Remove", 10],
> ToExpression["Remove[" <> # <> "]"],
> Appearance -> "Palette"]
> }],
> Framed[Dynamic[Symbol[#]], ImageSize -> Scaled[1],
> Background -> White]
> }, ToExpression["Dynamic[inspector`" <> # <> "]"]
> ] &) /@ Names["Global`*"], 3, 3, {1, 1}, {}
> ],
> Alignment -> {Left, Baseline},
> Background -> {Automatic, {{RGBColor[0.98996, 0.950057, 0.785382],
> RGBColor[1, 0.983169, 0.877287]}}},
> ItemSize -> Scaled[.333]
> ],
> UpdateInterval -> 1
> ]
>
> (*
> Whenever a new symbol is created in the Global` context, create
> a shadow symbol in the inspector` context to track whether
> or not the value of the symbol is shown.
> *)
> $NewSymbol = (If[#2 == "Global`",
> (#1 = #2) &[Symbol["inspector`" <> #1], False]
> ] &);
>
> Any help would be greatly appreciated!
>
> I know the above code is probably horribly inefficient and might not scal=
e well if a lot of symbols are present. But it does seem to work pretty wel=
l so far. I was pleased to note that if a symbol contains a Graphics object=
, the OpenerView correctly displays the graphic. And if a symbol has a 3D g=
raphics object, you can rotate the graphic inside the toggled OpenerView!
>
> Cheers,
>
> Jason
>
> --
> Dr J. McKenzie Alexander
> Department of Philosophy, Logic and Scientific Method
> London School of Economics and Political Science
> Houghton Street, London WC2A 2AE
>
> Please access the attached hyperlink for an important electronic communic=
ations disclaimer:http://www.lse.ac.uk/collections/planningAndCorporatePoli=
cy/legalandC...