Browse Source

Support undo/redo of breaking prefabs

Josh Engebretson 10 years ago
parent
commit
8287913101

+ 15 - 0
Script/AtomicEditor/ui/frames/inspector/SelectionInspector.ts

@@ -172,6 +172,7 @@ class SelectionInspector extends ScriptWidget {
         this.subscribeToEvent("SceneEditStateChange", (data) => this.handleSceneEditStateChangeEvent(data));
         this.subscribeToEvent(sceneEditor.scene, "SceneEditStateChangesEnd", (data) => this.handleSceneEditStateChangesEndEvent());
 
+        this.subscribeToEvent(sceneEditor.scene, "SceneEditNodeRemoved", (ev: Editor.SceneEditNodeRemovedEvent) => this.handleSceneEditNodeRemoved(ev));
         this.subscribeToEvent(sceneEditor.scene, "SceneEditComponentAddedRemoved", (ev) => this.handleSceneEditComponentAddedRemovedEvent(ev));
 
         this.subscribeToEvent(this.createComponentButton, "SelectionCreateComponent", (data) => this.handleSelectionCreateComponent(data));
@@ -481,8 +482,20 @@ class SelectionInspector extends ScriptWidget {
 
     }
 
+    handleSceneEditNodeRemoved(ev: Editor.SceneEditNodeRemovedEvent) {
+
+        this.removeNode(ev.node);
+
+    }
+
     handleSceneEditComponentAddedRemovedEvent(ev: Editor.SceneEditComponentAddedRemovedEvent) {
 
+        if (this.filterComponent(ev.component)) {
+            // still refresh as may affect UI (for example PrefabComponents)
+            this.refresh();
+            return;
+        }
+
         if (!ev.removed) {
 
             editType = this.addSerializable(ev.component);
@@ -654,6 +667,8 @@ class SelectionInspector extends ScriptWidget {
 
         c.breakPrefab();
 
+        this.sceneEditor.scene.sendEvent("SceneEditEnd");
+
         var node = this.nodes[0];
         this.removeNode(node);
         this.addNode(node);

+ 18 - 4
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditOp.cpp

@@ -8,6 +8,7 @@
 #include <Atomic/IO/Log.h>
 #include <Atomic/Scene/Node.h>
 #include <Atomic/Scene/Component.h>
+#include <Atomic/Scene/PrefabComponent.h>
 #include <Atomic/Scene/Scene.h>
 
 #include "SceneEditOp.h"
@@ -58,6 +59,7 @@ void SelectionEditOp::AddNode(Node* node)
         EditComponent* ecomponent = new EditComponent();
         ecomponent->component_ = component;
         ecomponent->nodeBegin_ = ecomponent->nodeEnd_ = node;
+        ecomponent->temporaryBegin_ = ecomponent->temporaryEnd_ = component->IsTemporary();
         component->Serializable::Save(ecomponent->stateBegin_);
         ecomponent->stateBegin_.Seek(0);
         ecomponent->stateEnd_ = ecomponent->stateBegin_;
@@ -129,6 +131,9 @@ bool SelectionEditOp::Commit()
             if (ecomponent->nodeBegin_ != ecomponent->nodeEnd_)
                 return true;
 
+            if (ecomponent->temporaryBegin_ != ecomponent->temporaryEnd_)
+                return true;
+
             if (!CompareStates(ecomponent->stateBegin_, ecomponent->stateEnd_))
                 return true;
 
@@ -157,6 +162,7 @@ void SelectionEditOp::RegisterEdit()
             ecomponent->component_->Serializable::Save(ecomponent->stateEnd_);
             ecomponent->stateEnd_.Seek(0);
             ecomponent->nodeEnd_ = ecomponent->component_->GetNode();
+            ecomponent->temporaryEnd_ = ecomponent->component_->IsTemporary();
         }
 
     }
@@ -249,15 +255,19 @@ bool SelectionEditOp::Undo()
 
             ecomponent->stateBegin_.Seek(0);
 
-            if (component->GetNode() != ecomponent->nodeBegin_)
+            if (component->GetNode() != ecomponent->nodeBegin_ || component->IsTemporary() != ecomponent->temporaryBegin_)
             {
                 component->Remove();
 
+                bool add = ecomponent->nodeBegin_.NotNull();
+
+                component->SetTemporary(ecomponent->temporaryBegin_);
+
                 VariantMap caData;
                 caData[SceneEditComponentAddedRemoved::P_SCENE] = scene_;
                 caData[SceneEditComponentAddedRemoved::P_COMPONENT] = component;
 
-                if (ecomponent->nodeBegin_.NotNull())
+                if (add)
                 {
                     ecomponent->nodeBegin_->AddComponent(component, 0, REPLICATED);
                     caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeBegin_;
@@ -364,15 +374,19 @@ bool SelectionEditOp::Redo()
                 component->SendEvent(E_SCENEEDITSTATECHANGE, eventData);
             }
 
-            if (component->GetNode() != ecomponent->nodeEnd_)
+            if (component->GetNode() != ecomponent->nodeEnd_ || component->IsTemporary() != ecomponent->temporaryEnd_)
             {
                 component->Remove();
 
+                bool add = ecomponent->nodeEnd_.NotNull();
+
+                component->SetTemporary(ecomponent->temporaryEnd_);
+
                 VariantMap caData;
                 caData[SceneEditComponentAddedRemoved::P_SCENE] = scene_;
                 caData[SceneEditComponentAddedRemoved::P_COMPONENT] = component;
 
-                if (ecomponent->nodeEnd_.NotNull())
+                if (add)
                 {
                     ecomponent->nodeEnd_->AddComponent(component, 0, REPLICATED);
                     caData[SceneEditComponentAddedRemoved::P_NODE] = ecomponent->nodeEnd_;

+ 2 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditOp.h

@@ -86,6 +86,8 @@ private:
         SharedPtr<Node> nodeEnd_;
         VectorBuffer stateBegin_;
         VectorBuffer stateEnd_;
+        bool temporaryBegin_;
+        bool temporaryEnd_;
     };
 
     struct EditNode