コマンドパターンを使用して、アプリケーションに元に戻す/やり直し機能を実装しようとしています。私は問題に直面しています。
それを説明するために、私のアプリケーションで2Dプロファイルを(必要な数だけ)作成できると想像してみましょう。
これらの2Dプロファイルから、さまざまな属性(名前、色、スケールなど)を持つ3Dパーツを作成できます。
+--------------+ +--------------+ +--------------+
| 2D profile A | | 2D profile B | | 2D profile C |
+--------------+ +--------------+ +--------------+
| | |
| +---------------+ +---------------+
| | 3D Part B | | 3D Part C |
| | Colour : blue | | Colour : grey |
| | Name : bibi | | Name : foo |
| | Scale : 33% | | Scale : 100% |
| +---------------+ +---------------+
+--------------+
| 3D Part A |
| Colour : red |
| Name : aaa |
| Scale : 50% |
+--------------*
プロファイルが削除されると、このプロファイルに基づいて構築されたすべての3Dパーツも自動的に削除されます(プロファイルが削除されようとすると、3Dパーツマネージャーに通知され、廃止された3Dパーツが削除されます。ビューにも通知されて更新されます。 GUI)。
これは私が問題に直面しているところです:私は2Dプロファイルを削除するためのundo / redoコマンドを書いています、それはこのように見えます(擬似コード):
virtual void redo()
{
m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile
}
virtual void undo()
{
m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost
}
上記のコードでわかるように、2Dプロファイルを削除すると、削除されたプロファイルに依存するすべての3Dパーツが自動的に削除されます。
ただし、元に戻す場合は、2Dプロファイルをリストに再度追加するだけでは不十分です。3Dパーツが失われます。
私は何をすべきか ?undo / redoコマンドは、3Dパーツの削除を処理する責任がありますか(これは、3Dパーツマネージャーによって実際に行われることです)?これは、undo/redoコマンドがGUIを更新するようにビューに通知する役割も担うことを意味します。
または、undo / redoコマンドで、削除されるすべての3Dパーツの内部コピーを作成し、3Dパーツマネージャーに3Dパーツを削除させる必要がありますか?
または、別のより良い解決策はありますか?
ご協力いただきありがとうございます !