SceneEditHistory.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include <Atomic/IO/Log.h>
  2. #include <Atomic/Core/Timer.h>
  3. #include <Atomic/Scene/Scene.h>
  4. #include <Atomic/Scene/Component.h>
  5. #include <Atomic/Scene/SceneEvents.h>
  6. #include "../../EditorMode/AEEditorEvents.h"
  7. #include "SceneEditOps.h"
  8. #include "SceneEditor3DEvents.h"
  9. #include "SceneEditHistory.h"
  10. namespace AtomicEditor
  11. {
  12. SceneEditHistory::SceneEditHistory(Context* context, Scene* scene) :
  13. Object(context),
  14. scene_(scene)
  15. {
  16. SubscribeToEvent(scene_, E_SCENEEDITSERIALIZABLE, HANDLER(SceneEditHistory, HandleSceneEditSerializable));
  17. }
  18. SceneEditHistory::~SceneEditHistory()
  19. {
  20. }
  21. void SceneEditHistory::AddUndoOp(SceneEditOp* op)
  22. {
  23. undoHistory_.Push(op);
  24. for (unsigned i = 0; i < redoHistory_.Size(); i++)
  25. {
  26. delete redoHistory_[i];
  27. }
  28. redoHistory_.Clear();
  29. }
  30. void SceneEditHistory::HandleSceneEditSerializableUndoRedo(StringHash eventType, VariantMap& eventData)
  31. {
  32. SharedPtr<Serializable> serial(static_cast<Serializable*>(eventData[SceneEditSerializableUndoRedo::P_SERIALIZABLE].GetPtr()));
  33. if (editStates_.Contains(serial))
  34. {
  35. editStates_[serial] = eventData[SceneEditSerializableUndoRedo::P_STATE].GetVectorBuffer();
  36. }
  37. }
  38. void SceneEditHistory::HandleSceneEditSerializable(StringHash eventType, VariantMap& eventData)
  39. {
  40. int editop = eventData[SceneEditSerializable::P_OPERATION].GetInt();
  41. SharedPtr<Serializable> serial(static_cast<Serializable*>(eventData[SceneEditSerializable::P_SERIALIZABLE].GetPtr()));
  42. if (editop == 0) // begin
  43. {
  44. if (editStates_.Contains(serial))
  45. return;
  46. SubscribeToEvent(serial, E_SCENEEDITSERIALIZABLEUNDOREDO, HANDLER(SceneEditHistory, HandleSceneEditSerializableUndoRedo));
  47. VectorBuffer& vb = editStates_[serial];
  48. vb.Clear();
  49. serial->Serializable::Save(vb);
  50. vb.Seek(0);
  51. }
  52. else if (editop == 1) // change
  53. {
  54. if (!editStates_.Contains(serial))
  55. return;
  56. VectorBuffer& beginState = editStates_[serial];
  57. VectorBuffer deltaState;
  58. serial->Serializable::Save(deltaState);
  59. deltaState.Seek(0);
  60. if (beginState.GetSize() != deltaState.GetSize() ||
  61. memcmp(beginState.GetData(), deltaState.GetData(), deltaState.GetSize()))
  62. {
  63. SerializableEditOp* op = new SerializableEditOp(serial, beginState, deltaState);
  64. AddUndoOp(op);
  65. editStates_[serial] = deltaState;
  66. }
  67. }
  68. else if (editop == 2) // end
  69. {
  70. if (!editStates_.Contains(serial))
  71. return;
  72. UnsubscribeFromEvent(serial, E_SCENEEDITSERIALIZABLEUNDOREDO);
  73. editStates_.Erase(serial);
  74. }
  75. }
  76. void SceneEditHistory::Undo()
  77. {
  78. if (!undoHistory_.Size())
  79. return;
  80. SceneEditOp* op = undoHistory_.Back();
  81. undoHistory_.Pop();
  82. op->Undo();
  83. redoHistory_.Push(op);
  84. }
  85. void SceneEditHistory::Redo()
  86. {
  87. if (!redoHistory_.Size())
  88. return;
  89. SceneEditOp* op = redoHistory_.Back();
  90. redoHistory_.Pop();
  91. op->Redo();
  92. undoHistory_.Push(op);
  93. }
  94. }