让CellDingbat记住Mathematica会话之间的状态

时间:2011-10-28 16:38:36

标签: wolfram-mathematica stylesheet

我修改了笔记本的样式表,以包含一个继承自StyleData["Todo"]的{​​{1}}。它将单元格dingbat更改为复选框。在样式表编辑器中:

StyleData["Item"]

问题是,当在笔记本中使用时,复选框的状态不会保存在Mathematica会话之间。我认为Cell[StyleData["ToDo", StyleDefinitions -> StyleData["Item"]], CellDingbat->DynamicModuleBox[{$CellContext`color$$}, CheckboxBox[ Dynamic[$CellContext`color$$], {RGBColor[1, 0.5, 0],RGBColor[0,Rational[2, 3], 0]}, Background -> Dynamic[$CellContext`color$$]], DynamicModuleValues :> {} ], ] 可以解决问题。如何让复选框记住其状态?

修改

Simon的解决方案确实保存了复选框的状态,但是当用作CellDingbat(MacOS X)时复选框被剪裁。将Simon的代码放在CellFrameLabels选项中可以解决问题,并保留默认的“Item”CellDingbat。这就是我的成就:

DynamicModule[]

1 个答案:

答案 0 :(得分:3)

您的代码问题(我认为)是每次创建新的“ToDo”单元格时都不会创建新的DynamicModule。因此,无处可以保存每个Checkbox的状态。

我能想到的为每个“ToDo”单元存储Checkbox状态的最简单的解决方案是在第一次激活CellDingbat时覆盖Checkbox。 (我玩的其他选项是使用TaggingRules, 在“ToDo”和“ToDone”风格等之间切换......)

但是,即使Checkbox中的普通CellDingbat未存储其状态 - 请尝试运行以下内容,然后循环输出Show Expression周期。

CellPrint[Cell["test", "Text", CellDingbat -> ToBoxes[Checkbox[]]]]

为了解决这个问题,我使用Checkbox将明确的参数TrueFalse包含在一个改变状态的按钮中。这是愚蠢而低效的,但它确实有效!

所以,我的细胞样式代码

Cell[StyleData["ToDo", StyleDefinitions -> StyleData["Item"]],
 CellDingbat -> ButtonBox[CheckboxBox[False], 
   ButtonFunction :> (SelectionMove[ButtonNotebook[], All, ButtonCell]; 
     With[{$CellContext`new = ReplaceAll[
          Options[NotebookSelection[ButtonNotebook[]], CellDingbat], 
          CheckboxBox[Pattern[$CellContext`x, Alternatives[True, False]]] :> CheckboxBox[Not[$CellContext`x]]]}, 
        SetOptions[NotebookSelection[ButtonNotebook[]], $CellContext`new]]; 
      SelectionMove[ButtonNotebook[], After, CellContents]), 
    Appearance -> None, Method -> "Preemptive", Evaluator -> Automatic]]

Screenshota

我对这个解决方案不满意,但这是我提出的最好的解决方案。改进之处在于将按钮功能代码移出单元格,以便不对每个已检查的ToDo单元重复该功能代码。也是为了让它在没有ReplaceAll的情况下运行,这样就不需要内核了,只需要使用前端即可运行该函数。