Undo Redoについて解説しているページを探してみた。
ViViエディタの解説ページ
これが基本的なUndo・Redoの実装なのだろう。
とてもわかりやすく解説されていた。
Undo・Redoについて検索すると「Commandパターン云々」という記述をよく見かける。
MCDでも、CommandパターンとUndo Redoに関しての記述が見受けられた。
いろいろ考えた結果、下の図のような形で実装しようと思う。
┌────────┐
┌───────┐ │ │
│ │ │モデル │
│ビュー │?? ┌──────┐ ?? │ │
│ │ │コマンド │ │ │
│ ├───→┤ ├──→┤ │
│ │ │ │ │ │
│ │ └──┬───┘ │ │
└───────┘ │ └────────┘
│??
│
│
┌───↓────┐ ┌────────┐
│ │ │ │
│UNDOスタック│ ?? │Redoスタック│
│ ├───→┤ │
│ │ │ │
│ │ │ │
│ │ │ │
└────────┘ └────────┘
??ビューは、ユーザの操作に応じて、コマンドオブジェクトを生成する。
??コマンドは、モデルに対し、ユーザ操作を実行する。
??コマンドは、操作を取り消せるようUndoスタックにUndo操作を積む。
??Undoを行うと??のユーザ操作をRedoスタックに積む。
??もし、Undo後、新規操作が行われたら、??、??の操作を行い、Redoスタックはクリアする。
実装で参考になりそうなのが、下記のページだ。
http://www.codeguru.com/Cpp/Cpp/algorithms/general/article.php/c6361/
LokiのFunctorが使われていた。