Browse Source

WIP undo/redo for node add/remove

Josh Engebretson 10 years ago
parent
commit
dbb9e830aa

+ 1 - 2
Script/AtomicEditor/ui/frames/HierarchyFrame.ts

@@ -219,8 +219,7 @@ class HierarchyFrame extends Atomic.UIWidget {
 
 
                 var node = this.scene.getNode(selectedId);
                 var node = this.scene.getNode(selectedId);
                 if (node) {
                 if (node) {
-
-                    node.removeAllComponents();
+                    this.scene.sendEvent("SceneEditNodeAddedRemoved", { scene:this.scene, node:node, added:false});
                     node.remove();
                     node.remove();
 
 
                 }
                 }

+ 1 - 0
Script/AtomicEditor/ui/frames/menus/HierarchyFrameMenu.ts

@@ -38,6 +38,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
                 if (node) {
                 if (node) {
 
 
                     child = node.createChild("Node");
                     child = node.createChild("Node");
+                    node.scene.sendEvent("SceneEditNodeAddedRemoved", { scene:node.scene, node:node, added:true});
 
 
                 }
                 }
 
 

+ 2 - 1
Source/Atomic/UI/UIInput.cpp

@@ -308,7 +308,8 @@ static bool InvokeKey(UI* ui, TBWidget* root, unsigned int key, SPECIAL_KEY spec
 
 
 void UI::HandleKey(bool keydown, int keycode, int scancode)
 void UI::HandleKey(bool keydown, int keycode, int scancode)
 {
 {
-    if (keydown && keycode == KEY_ESC && TBWidget::focused_widget)
+    if (keydown && (keycode == KEY_ESC || keycode == KEY_RETURN || keycode == KEY_RETURN2 || keycode == KEY_KP_ENTER)
+            && TBWidget::focused_widget)
     {
     {
         SendEvent(E_UIWIDGETFOCUSESCAPED);
         SendEvent(E_UIWIDGETFOCUSESCAPED);
     }
     }

+ 1 - 0
Source/AtomicEditor/Editors/SceneEditor3D/Gizmo3D.cpp

@@ -442,6 +442,7 @@ void Gizmo3D::SetEditMode(EditMode mode)
 
 
 void Gizmo3D::Hide()
 void Gizmo3D::Hide()
 {
 {
+    gizmoAxisX_.selected_ = gizmoAxisY_.selected_ = gizmoAxisZ_.selected_ = false;
     gizmo_->SetEnabled(false);
     gizmo_->SetEnabled(false);
 }
 }
 
 

+ 9 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditHistory.cpp

@@ -19,6 +19,7 @@ SceneEditHistory::SceneEditHistory(Context* context, Scene* scene) :
     scene_(scene)
     scene_(scene)
 {
 {
     SubscribeToEvent(scene_, E_SCENEEDITSERIALIZABLE, HANDLER(SceneEditHistory, HandleSceneEditSerializable));    
     SubscribeToEvent(scene_, E_SCENEEDITSERIALIZABLE, HANDLER(SceneEditHistory, HandleSceneEditSerializable));    
+    SubscribeToEvent(scene_, E_SCENEEDITNODEADDEDREMOVED, HANDLER(SceneEditHistory, HandleSceneEditNodeAddedRemoved));
 }
 }
 
 
 SceneEditHistory::~SceneEditHistory()
 SceneEditHistory::~SceneEditHistory()
@@ -48,6 +49,14 @@ void SceneEditHistory::HandleSceneEditSerializableUndoRedo(StringHash eventType,
     }
     }
 }
 }
 
 
+void SceneEditHistory::HandleSceneEditNodeAddedRemoved(StringHash eventType, VariantMap& eventData)
+{
+    bool added = eventData[SceneEditNodeAddedRemoved::P_ADDED].GetBool();
+    Node* node = static_cast<Node*>(eventData[SceneEditNodeAddedRemoved::P_NODE].GetPtr());
+    NodeAddedRemovedOp* op = new NodeAddedRemovedOp(node, added);
+    AddUndoOp(op);
+}
+
 void SceneEditHistory::HandleSceneEditSerializable(StringHash eventType, VariantMap& eventData)
 void SceneEditHistory::HandleSceneEditSerializable(StringHash eventType, VariantMap& eventData)
 {
 {
 
 

+ 1 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditHistory.h

@@ -40,6 +40,7 @@ private:
 
 
     void HandleSceneEditSerializable(StringHash eventType, VariantMap& eventData);
     void HandleSceneEditSerializable(StringHash eventType, VariantMap& eventData);
     void HandleSceneEditSerializableUndoRedo(StringHash eventType, VariantMap& eventData);
     void HandleSceneEditSerializableUndoRedo(StringHash eventType, VariantMap& eventData);
+    void HandleSceneEditNodeAddedRemoved(StringHash eventType, VariantMap& eventData);
 
 
     void AddUndoOp(SceneEditOp* op);
     void AddUndoOp(SceneEditOp* op);
 
 

+ 18 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditOps.cpp

@@ -26,11 +26,29 @@ NodeAddedRemovedOp::NodeAddedRemovedOp(Node* node, bool added) : NodeEditOp(node
 
 
 bool NodeAddedRemovedOp::Undo()
 bool NodeAddedRemovedOp::Undo()
 {
 {
+    if (added_)
+    {
+        node_->Remove();
+    }
+    else
+    {
+        parent_->AddChild(node_);
+    }
+
     return true;
     return true;
 }
 }
 
 
 bool NodeAddedRemovedOp::Redo()
 bool NodeAddedRemovedOp::Redo()
 {
 {
+    if (added_)
+    {
+        parent_->AddChild(node_);
+    }
+    else
+    {
+        node_->Remove();
+    }
+
     return true;
     return true;
 }
 }
 
 

+ 23 - 2
Source/AtomicEditor/Editors/SceneEditor3D/SceneEditor3D.cpp

@@ -96,6 +96,7 @@ SceneEditor3D ::SceneEditor3D(Context* context, const String &fullpath, UITabCon
     SubscribeToEvent(E_EDITORPLAYSTARTED, HANDLER(SceneEditor3D, HandlePlayStarted));
     SubscribeToEvent(E_EDITORPLAYSTARTED, HANDLER(SceneEditor3D, HandlePlayStarted));
     SubscribeToEvent(E_EDITORPLAYSTOPPED, HANDLER(SceneEditor3D, HandlePlayStopped));
     SubscribeToEvent(E_EDITORPLAYSTOPPED, HANDLER(SceneEditor3D, HandlePlayStopped));
 
 
+    SubscribeToEvent(scene_, E_NODEADDED, HANDLER(SceneEditor3D, HandleNodeAdded));
     SubscribeToEvent(scene_, E_NODEREMOVED, HANDLER(SceneEditor3D, HandleNodeRemoved));
     SubscribeToEvent(scene_, E_NODEREMOVED, HANDLER(SceneEditor3D, HandleNodeRemoved));
 
 
     editHistory_ = new SceneEditHistory(context_, scene_);
     editHistory_ = new SceneEditHistory(context_, scene_);
@@ -115,7 +116,12 @@ bool SceneEditor3D::OnEvent(const TBWidgetEvent &ev)
         {
         {
             if (selectedNode_)
             if (selectedNode_)
             {
             {
-                selectedNode_->RemoveAllComponents();
+                VariantMap editData;
+                editData[SceneEditNodeAddedRemoved::P_SCENE] = scene_;
+                editData[SceneEditNodeAddedRemoved::P_NODE] = selectedNode_;
+                editData[SceneEditNodeAddedRemoved::P_ADDED] = false;
+                scene_->SendEvent(E_SCENEEDITNODEADDEDREMOVED, editData);
+
                 selectedNode_->Remove();
                 selectedNode_->Remove();
                 selectedNode_ = 0;
                 selectedNode_ = 0;
             }
             }
@@ -141,6 +147,13 @@ bool SceneEditor3D::OnEvent(const TBWidgetEvent &ev)
                 VariantMap eventData;
                 VariantMap eventData;
                 eventData[EditorActiveNodeChange::P_NODE] = pasteNode;
                 eventData[EditorActiveNodeChange::P_NODE] = pasteNode;
                 SendEvent(E_EDITORACTIVENODECHANGE, eventData);
                 SendEvent(E_EDITORACTIVENODECHANGE, eventData);
+
+                VariantMap editData;
+                editData[SceneEditNodeAddedRemoved::P_SCENE] = scene_;
+                editData[SceneEditNodeAddedRemoved::P_NODE] = pasteNode;
+                editData[SceneEditNodeAddedRemoved::P_ADDED] = true;
+
+                scene_->SendEvent(E_SCENEEDITNODEADDEDREMOVED, editData);
             }
             }
         } 
         } 
         else if (ev.ref_id == TBIDC("close"))
         else if (ev.ref_id == TBIDC("close"))
@@ -204,6 +217,15 @@ void SceneEditor3D::SelectNode(Node* node)
 
 
 }
 }
 
 
+void SceneEditor3D::HandleNodeAdded(StringHash eventType, VariantMap& eventData)
+{
+    // Node does not have values set here
+
+    //Node* node =  static_cast<Node*>(eventData[NodeAdded::P_NODE].GetPtr());
+    //LOGINFOF("Node Added: %s", node->GetName().CString());
+}
+
+
 void SceneEditor3D::HandleNodeRemoved(StringHash eventType, VariantMap& eventData)
 void SceneEditor3D::HandleNodeRemoved(StringHash eventType, VariantMap& eventData)
 {
 {
     Node* node = (Node*) (eventData[NodeRemoved::P_NODE].GetPtr());
     Node* node = (Node*) (eventData[NodeRemoved::P_NODE].GetPtr());
@@ -211,7 +233,6 @@ void SceneEditor3D::HandleNodeRemoved(StringHash eventType, VariantMap& eventDat
         SelectNode(0);
         SelectNode(0);
 }
 }
 
 
-
 void SceneEditor3D::HandleUpdate(StringHash eventType, VariantMap& eventData)
 void SceneEditor3D::HandleUpdate(StringHash eventType, VariantMap& eventData)
 {
 {
     Vector<Node*> editNodes;
     Vector<Node*> editNodes;

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

@@ -67,6 +67,8 @@ private:
     void HandlePlayStopped(StringHash eventType, VariantMap& eventData);
     void HandlePlayStopped(StringHash eventType, VariantMap& eventData);
     void HandleGizmoEditModeChanged(StringHash eventType, VariantMap& eventData);
     void HandleGizmoEditModeChanged(StringHash eventType, VariantMap& eventData);
     void HandleGizmoAxisModeChanged(StringHash eventType, VariantMap& eventData);
     void HandleGizmoAxisModeChanged(StringHash eventType, VariantMap& eventData);
+
+    void HandleNodeAdded(StringHash eventType, VariantMap& eventData);
     void HandleNodeRemoved(StringHash eventType, VariantMap& eventData);
     void HandleNodeRemoved(StringHash eventType, VariantMap& eventData);
 
 
     SharedPtr<Scene> scene_;
     SharedPtr<Scene> scene_;

+ 7 - 0
Source/AtomicEditor/Editors/SceneEditor3D/SceneView3D.cpp

@@ -542,6 +542,13 @@ void SceneView3D::HandleDragEnded(StringHash eventType, VariantMap& eventData)
         VariantMap neventData;
         VariantMap neventData;
         neventData[EditorActiveNodeChange::P_NODE] = dragNode_;
         neventData[EditorActiveNodeChange::P_NODE] = dragNode_;
         SendEvent(E_EDITORACTIVENODECHANGE, neventData);
         SendEvent(E_EDITORACTIVENODECHANGE, neventData);
+
+        VariantMap editData;
+        editData[SceneEditNodeAddedRemoved::P_SCENE] = scene_;
+        editData[SceneEditNodeAddedRemoved::P_NODE] = dragNode_;
+        editData[SceneEditNodeAddedRemoved::P_ADDED] = true;
+        scene_->SendEvent(E_SCENEEDITNODEADDEDREMOVED, editData);
+
     }
     }
 
 
     if (dragObject && dragObject->GetObject()->GetType() == ToolCore::Asset::GetTypeStatic())
     if (dragObject && dragObject->GetObject()->GetType() == ToolCore::Asset::GetTypeStatic())