Получение CellDingbat, чтобы запомнить его состояние между сессиями Mathematica - PullRequest
8 голосов
/ 28 октября 2011

Я изменил таблицу стилей моего ноутбука, добавив StyleData["Todo"], который наследуется от StyleData["Item"].Изменяет ячейку дингбат на флажок.В редакторе таблиц стилей:

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 :> {}
  ],
]

Проблема в том, что состояние флажка при использовании в записной книжке не сохраняется между сеансами Mathematica.Я думал, что DynamicModule[] поможет.Как заставить флажок запомнить его состояние?

EDIT

Решение Саймона сохраняет состояние флажка, но флажок обрезается при использовании в качестве CellDingbat(Mac OS X).Помещение кода Саймона в опции CellFrameLabels делает свое дело, а также сохраняет по умолчанию «Item» CellDingbat.Вот что я сделал:

Cell[StyleData["ToDo", StyleDefinitions -> StyleData["Item"]],
 CellFrameLabels->{{
    ButtonBox[
     CheckboxBox[False], ButtonFunction :> (SelectionMove[
        ButtonNotebook[], All, ButtonCell]; 
      With[{$CellContext`new = ReplaceAll[
           Options[
            NotebookSelection[
             ButtonNotebook[]], CellFrameLabels], 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], None}, {
   None, None}},
 MenuSortingValue->1621]

1 Ответ

3 голосов
/ 29 октября 2011

Проблема с вашим кодом (я думаю) заключается в том, что новый DynamicModule не создается каждый раз, когда вы создаете новую ячейку «ToDo».Таким образом, нигде не может быть сохранено состояние каждого Checkbox.

Самое простое решение, которое я мог бы придумать для сохранения состояния Checkbox для каждой ячейки "ToDo", - это перезаписать CellDingbat при первом включении Checkbox.(Другие варианты, с которыми я играл, использовали TaggingRules, переключение между стилями «ToDo» и «ToDone» и т. Д.) *

Однако даже обычный Checkbox в CellDingbat не сохраняетего состояние - попробуйте выполнить следующее, затем циклически выводите через цикл Show Expression .

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

Чтобы обойти это, я использовал Checkbox с определенным аргументом True илиFalse завернут в кнопку, которая меняет состояние.Это глупо и неэффективно, но работает!

Итак, мой код для стиля ячейки

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

Я не доволен этим решением, но это лучшее, что я придумал.Улучшение будет заключаться в перемещении кода функции кнопки из ячейки, чтобы он не повторялся для каждой проверенной ячейки задачи.Кроме того, чтобы он работал без ReplaceAll, чтобы ядро ​​не требовалось и функцию можно было запустить, используя только внешний интерфейс.

...