C++ Undo入門

はじめに

どのようなアプリケーションでも Undo 機能はぜひとも欲しい機能の一つだと思いますが、残念ながら Undo を実現するための標準的なフレームワークというようなものは存在しません
ですからアプリケーションに Undo の機能を追加しようとすれば一から自分で書く必要があります

ここではコマンドリスト形式の Undo の実装について説明しましょう

Undo の仕組み

Undo の仕組み自体は実はとても簡単です
Undo マネージャはコマンドの中身は関知せず、ただコマンドのリストを管理しているだけです
コマンドのリストで現在注目しているところを前に戻すのが Undo、先へ進めるのが Redo です
注目している位置より前に変わったコマンドには Redo の通知を送り、先に変わったコマンドには Undo の通知を送ります
ただそれだけです

コマンドのリストとその注目位置が Undo/Redo によってどのように変わるかを見てみましょう

注目位置
コマンド1


コマンド2を追加

注目位置
コマンド1 コマンド2


コマンド3を追加

注目位置
コマンド1 コマンド2 コマンド3


ここで Undo をすると注目位置が1つ前に戻ります

注目位置

コマンド1 コマンド2 コマンド3


Undoを通知

(コマンド3 に Undo を通知)

また Undo をすると注目位置がさらに1つ前に戻ります

注目位置

コマンド1 コマンド2 コマンド3


Undoを通知

(コマンド2 に Undo を通知)

Redo をすると注目位置が1つ先に進みます

注目位置

コマンド1 コマンド2 コマンド3


Redoを通知

(コマンド2 に Redo を通知)

また Redo をすると注目位置がさらに1つ先に進みます

注目位置
コマンド1 コマンド2 コマンド3


Redoを通知

(コマンド3 に Redo を通知)

注目している位置がリストの終端でないときに、新たにコマンドを追加されると、注目している位置より先にあるコマンドは破棄します

Undo

注目位置

コマンド1 コマンド2 コマンド3


Undoを通知

(コマンド3 に Undo を通知)

Undo

注目位置

コマンド1 コマンド2 コマンド3


Undoを通知

(コマンド2 に Undo を通知)

コマンド4を追加

注目位置
コマンド1 コマンド4

(コマンド2 とコマンド3 を破棄)

とても単純ですね
あんまり単純なのでこれ以上特に説明することもなくなってしまいました
そこでこの入門では簡単な実装例の紹介をするだけにしたいと思います