undo/redo
ノートに線を書き加えたり消したりする操作を取り消したりやり直したりする機能
誤解を招かないため、キャンバス上での出来事だけにしたほうがいい
例えばタイトルの変更とかは、対象外
どう実装するか
2種類のスタックを持つ
A: 操作を積んでいくスタック(done)
B: undoした操作を積んでいくスタック(undone)
undoは、Aからpopした操作を逆適用し、Bにpushする
redoは、Bからpopした操作を適用し、Aにpushする
それぞれのスタックが空の場合は、それぞれの操作ができない
操作とは
適用または逆適用できるもの
現在考えるべきは2種類
パスを書き加えた
もちろんパスの情報を持つ
パスを消した
パスの情報も持つ
他の人がどう操作しようが、スタックの内容は変わらない
自分が描いた線を他の人が消した後にundoした場合、何も起こらない
画面に描画しているパスが追加、削除されるのはいつ?
8パターン
A. 追加: 最初にデータが読み込まれたとき
B. 追加: 自分で線を描いたとき
C. 削除: 自分で線を消したとき
D. 追加: 他の人が線を描いたとき
E. 削除: 他の人が線を消したとき
F. 追加: 消す操作をundoしたとき
G. 削除: 描く操作をundoしたとき
H. 追加: 描く操作をredoしたとき
I. 削除: 消す操作をredoしたとき
A, D, Eでは保存処理とスタック操作がいらない
Aではスクロール位置を調整する処理が必要
B, C, H, Iでは操作をdoneスタックに入れる
E, Fでは操作をundoneスタックに入れる
以上を考慮すると、4つのバリエーションが必要
スクロール位置を調整するバージョン
何もしないバージョン
保存してdoneスタックに入れるバージョン
保存してundoスタックに入れるバージョン