Re: Question on Dynamic with "DockedCell"
- To: mathgroup at smc.vnet.net
- Subject: [mg104164] Re: [mg104137] Question on Dynamic with "DockedCell"
- From: Jason Ledbetter <jasonbrent at gmail.com>
- Date: Wed, 21 Oct 2009 06:32:16 -0400 (EDT)
- References: <200910200854.EAA06280@smc.vnet.net> <4ADDFCBD.1080103@wolfram.com>
Adam, Thank you- that actually helped a lot. I've got something passible, albeit hard coded at the moment that works as I was hoping. Going through and looking at low-level constructs helped a ton in comprehending what was going on here. That said, one question I'm hoping someone can answer. How can this be cleaned up (current code below) so that I'm not reusing the "topMenu" code on both sides of a Dynamic[If[...]? I previously just wrapped the secondMenu Row[..] in the Dynamic[If[...] but that resulted in "Null" being printed in the docked cell until a top level menu item was selected. --snip-- Module[ {topMenu, secondMenu, secondEnable}, secondEnable = False; topMenu = {"option1", "option2"}; menuChoice[choice_] := Module[{}, Switch[choice, "option1", (secondEnable = True; secondMenu = {"one", "selected"}), "option2", (secondEnable = True; secondMenu = {"two", "selected"}), _, Print[choice] ]]; CreateWindow[DockedCells -> Cell[BoxData[ToBoxes@DynamicModule[{}, Dynamic[If[secondEnable == True, Column[{ Row[{ Style["Top:", Bold], ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu] }], Row[{ Style["Second:", Bold], ButtonBar[ ToString[#] :> menuChoice[#] & /@ secondMenu] }] }](*endColumn*), Row[{ Style["Top:", Bold], ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu] }] ]] ](*endDynamicModule*) ](*endBoxData*) , "DockedCell"], TextAlignment -> Left](*endCreateWindow*) ]; --snip-- Thanks again for everyone's helpful responses to date. -jbl On Tue, Oct 20, 2009 at 4:57 PM, Adam Griffith <adamg at wolfram.com> wrote: > Hi Jason, > > Yes, the documentation on these topics is in the works for a future > Mathematica release. > > The trick here is to notice that the option DockedCells takes low-level > cell expressions. So anything that is included must be written in the > low-level box structure of the front end. For example, type something into > an input cell, run it, and then choose Cell>Show Cell Expression on the > output cell to view the low-level code. > > So what I did here: > Notebook[........ , DockedCells->Cell[BoxData[ToBoxes at DynamicModule[..... > all code.....]], "DockedCell"]] > > was to let the front end generate the necessary box structure for the > DynamicModule by using ToBoxes[] since I didn't want to have to write it > myself. For example, > > In[1]:= ToBoxes[a + b^2] > > Out[1]= RowBox[{"a", "+", SuperscriptBox["b", "2"]}] > > Then since we are dealing with boxes, the contents are wrapped in > BoxData[]. > > Hope this helps, > -Adam > > Jason Ledbetter wrote: > >> Hmm. That organizational structure is different than what I'm using. I >> guess I need to comprehend the box structure of mathematica... for example >> "BoxData" doesn't seem to be a documented primitive (It is referenced >> inside the Cell[] documentation as a one-liner). >> >> Is there a how-to or otherwise some documentation that describes when to >> use BoxData vs. ToBoxes vs. whatever or is it one of those "It depends and >> it's complicated" things? >> >> -jbl >> >> On Tue, Oct 20, 2009 at 2:09 PM, Adam Griffith <adamg at wolfram.com<mailto: >> adamg at wolfram.com>> wrote: >> >> I would suggest placing the code for the menus in a DynamicModule. >> >> >> Notebook[........ , >> DockedCells->Cell[BoxData[ToBoxes at DynamicModule[..... all >> code.....], "DockedCell"]] >> >> -Adam >> >> >> Jason Ledbetter wrote: >> >> Folk, >> I'm attempting to create a dynamically-appearing set of >> choices/menus using >> ButtonBar in a notebook window but I've been unable to get the >> desired >> affect to date. I've cobbled together the following code which >> almost does >> what I'm looking for but I could use some pointers in getting >> the rest of >> the way. >> >> The goal here is for the "topMenu" items to appear when the >> notebook is >> first instantiated and for the "secondMenu" option to appear >> when a >> "topMenu" option is selected. As it stands now, I'm having to >> start with the >> "secondMenu" option pre-defined to a bogus value. >> >> If I were to abstract my goal some more, I'm trying to figure >> out how to >> dynamically add/remove RowBox items that include ButtonBars >> from the >> notebook based on options that are selected. >> >> I'm guessing that I somehow need to programmatically generate >> the contents >> of a Dynamically wrapped RowBox (e.g., Dynamic[RowBox[...]]) >> but I'm not >> quite sure how to go about that just yet. >> >> Any help is greatly appreciated... >> >> Here's what I have thus far: >> >> --snip-- >> Module[ >> >> {topMenu, secondMenu}, >> >> topMenu = {"option1", "option2"}; >> secondMenu = {"No option selected"}; >> >> menuChoice[choice_] := Module[{}, >> Switch[choice, >> "option1", secondMenu = {"one", "selected"}, >> "option2", secondMenu = {"two", "selected"}, _, Print[choice] >> ]]; >> >> CreateWindow[DockedCells -> Cell[ >> RowBox[ >> { >> ToBoxes[ >> ButtonBar[ToString[#] :> menuChoice[#] & /@ topMenu] >> ], >> ToBoxes[ >> Dynamic[ >> ButtonBar[ToString[#] :> menuChoice[#] & /@ secondMenu] >> ] >> ] >> } >> ], >> "DockedCell"], >> TextAlignment -> Center >> ] >> ]; >> >> --snip-- >> >> >> thanks, >> >> >> -jbl >> >> >>
- References:
- Question on Dynamic with "DockedCell"
- From: Jason Ledbetter <jasonbrent@gmail.com>
- Question on Dynamic with "DockedCell"