Отримання CellDingbat для запам'ятовування його стану між сесіями Mathematica

Я змінив таблицю стилів мого ноутбука, включивши StyleData ["Todo"] , який успадковує від StyleData ["Item"] . Це змінює клітинку dingbat на прапорець. У редакторі стилів таблиці:

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 (MacOS 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]
8
Коли я вставив код вище, я отримав повідомлення «невірно отформатированную директиву з головою Symbol зустрічалися.» Це очікується?
додано Автор Mr.Wizard, джерело
Важко До того ж, ви можете замінити $ CellContext`color $$ лише за допомогою colors , якщо ви встановили опцію Cell CellContext-> Cell
додано Автор Sjoerd C. de Vries, джерело
@Містер. Я теж це отримав.
додано Автор JxB, джерело

1 Відповіді

Проблема з вашим кодом (я думаю) в тому, що новий DynamicModule не створюється кожного разу при створенні нової комірки "ToDo". Отже, ніде неможливо зберегти стан кожного коду Checkbox .

Найпростіше рішення, яке я міг би придумати для зберігання стану Checkbox для кожної комірки "ToDo", перезаписати CellDingbat в перший раз, коли Checkbox активовано. (Інші параметри, з якими я грав, використовували TaggingRules перемикання між стилями "ToDo" і "ToDone" тощо ...)

Проте навіть поле Checkbox в CellDingbat не зберігає його стан - спробуйте виконати наступне, а потім циклізуйте вихід через посилання Показати вираз .

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

Я не задоволений цим рішенням, але це найкраще, з яким я прийшов. Поліпшенням буде переміщення коду функції кнопки з комірки, щоб вона не повторювалася для кожної перевіреної комірки ToDo. Також, щоб він працював без ReplaceAll , так що ядро ​​не потрібне, і цю функцію можна запустити, використовуючи лише інтерфейс.

3
додано
@ JxB: це добре для мене - але різні операційні системи відображають ці речі по-різному. Я опублікував знімок екрана в моїй системі (Ubuntu 11.10, Mathematica 8.01)
додано Автор Simon, джерело
Це близько. Кнопка прапорця обрізана у верхній частині, і тому є прапорець. Я спробував багато варіантів заповнення, маржі та розміру як для кнопки, так і для комірки, і прапорець, безрезультатно.
додано Автор JxB, джерело
Використання CellFrameLabels працює. Див. Редагування вище.
додано Автор JxB, джерело