Undo/Redoに対応したMachine Viewの編集コマンドを作成中。
作成しなくてはいけないコマンド
・マシンの移動...Complete
・ケーブル接続点の移動..Complete
・マシンの除去
・マシンの追加
・ケーブルの接続
・ケーブルの除去
・マシンの範囲選択
・選択範囲の移動
思いつくものは今のところこれだけ。
MachineViewの編集機能で必要なものは
・マシンのグルーピング編集
・・グルーピングしたときの入力ポート・出力ポートの編集
・マシンの編集
・ケーブルの編集
・サンプルの編集
順次作成していく。
今気にしている部分は、Undo情報の保持方法だ。
たとえばMachineViewからMachineを除去コマンドを実行することを考える。
Machineはコンテナに保存されている。除去コマンドを実行するとコンテナよりMachineオブジェクトが除去される。
現在の実装では、除去コマンドのUndo情報は除去したときのMachineオブジェクトを保持することで行っている。
要するにコンテナからはずすだけで実体はUndo情報が不必要となるまで保持することを意味する。
オブジェクトをシリアライズしていったん削除し、Undo時に再構築するようにはしていない。
なぜかというと、オブジェクトのアドレス情報が変化するとそれ以前のUndo情報が無効となる可能性があるからだ。
除去コマンドを発行する以前に、Machineに対する各種編集コマンドを発行しているとする。Machineに対する各種編集コマンドはMachineオブジェクトのアドレスをベースにしている。
そのため、Machineオブジェクトを削除(delete)し、再構築(new)するとMachineオブジェクトのアドレスが変化してしまい、それまでの編集コマンドはUndo不能となってしまうのである。
このやり方だと、サンプラなどメモリを多く使用するMachineの挿入・削除を繰り返すと莫大なメモリを消費することになってしまう。
メモリ位置を保持しつつUndo情報に必要なメモリ量を削減しなくてはならない。
どうするかであるが、
・今のやり方をやめる。
メモリアドレス(参照・ポインタ)ベースによらない方法に変更する。
・配置Newや配置Deleteをうまく使用してなんとかする?
ぼんやりとだが、
(Undo情報保存時の動き)
Undo情報保存時にファイルにシリアライズしてメモリよりUndo情報を追い出す→デストラクタ明示的呼び出し→メモリ位置を保存。
(Undo時の動き)
Undo情報のメモリ位置に配置Newで初期化→Undo情報をファイルより読み出す→復活!
とすればよいのでは...と考えている。
ムリかな...。