S.F.Tracker(46)

公開:2005-06-09 21:54
更新:2020-02-15 04:36
カテゴリ:sftracker,windows,audio,tracker

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が使われていた。