Browse Source

Fix crash on wrong type drag into the vs editor

Don't allow drops of draggable items without a vs node type.

This fixes #10935
Hein-Pieter van Braam 8 years ago
parent
commit
2ec0bc4f80
1 changed files with 303 additions and 294 deletions
  1. 303 294
      modules/visual_script/visual_script_editor.cpp

+ 303 - 294
modules/visual_script/visual_script_editor.cpp

@@ -1495,415 +1495,424 @@ static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const
 
 void VisualScriptEditor::drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) {
 
-	if (p_from == graph) {
+	if (p_from != graph) {
+		return;
+	}
 
-		Dictionary d = p_data;
-		if (d.has("type") && String(d["type"]) == "visual_script_node_drag") {
+	Dictionary d = p_data;
 
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
+	if (!d.has("type")) {
+		return;
+	}
 
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+	if (String(d["type"]) == "visual_script_node_drag") {
+		if (!d.has("node_type") || String(d["node_type"]) == "Null") {
+			return;
+		}
 
-			ofs /= EDSCALE;
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
 
-			Ref<VisualScriptNode> vnode = VisualScriptLanguage::singleton->create_node_from_name(d["node_type"]);
-			int new_id = script->get_available_id();
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			undo_redo->create_action(TTR("Add Node"));
-			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
-			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
-			undo_redo->add_do_method(this, "_update_graph");
-			undo_redo->add_undo_method(this, "_update_graph");
-			undo_redo->commit_action();
+		ofs /= EDSCALE;
 
-			Node *node = graph->get_node(itos(new_id));
-			if (node) {
-				graph->set_selected(node);
-				_node_selected(node);
-			}
+		Ref<VisualScriptNode> vnode = VisualScriptLanguage::singleton->create_node_from_name(d["node_type"]);
+		int new_id = script->get_available_id();
+
+		undo_redo->create_action(TTR("Add Node"));
+		undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
+		undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
+		undo_redo->add_do_method(this, "_update_graph");
+		undo_redo->add_undo_method(this, "_update_graph");
+		undo_redo->commit_action();
+
+		Node *node = graph->get_node(itos(new_id));
+		if (node) {
+			graph->set_selected(node);
+			_node_selected(node);
 		}
+	}
 
-		if (d.has("type") && String(d["type"]) == "visual_script_variable_drag") {
+	if (String(d["type"]) == "visual_script_variable_drag") {
 
 #ifdef OSX_ENABLED
-			bool use_set = Input::get_singleton()->is_key_pressed(KEY_META);
+		bool use_set = Input::get_singleton()->is_key_pressed(KEY_META);
 #else
-			bool use_set = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+		bool use_set = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
 #endif
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			ofs /= EDSCALE;
+		ofs /= EDSCALE;
 
-			Ref<VisualScriptNode> vnode;
-			if (use_set) {
-				Ref<VisualScriptVariableSet> vnodes;
-				vnodes.instance();
-				vnodes->set_variable(d["variable"]);
-				vnode = vnodes;
-			} else {
+		Ref<VisualScriptNode> vnode;
+		if (use_set) {
+			Ref<VisualScriptVariableSet> vnodes;
+			vnodes.instance();
+			vnodes->set_variable(d["variable"]);
+			vnode = vnodes;
+		} else {
 
-				Ref<VisualScriptVariableGet> vnodeg;
-				vnodeg.instance();
-				vnodeg->set_variable(d["variable"]);
-				vnode = vnodeg;
-			}
+			Ref<VisualScriptVariableGet> vnodeg;
+			vnodeg.instance();
+			vnodeg->set_variable(d["variable"]);
+			vnode = vnodeg;
+		}
 
-			int new_id = script->get_available_id();
+		int new_id = script->get_available_id();
 
-			undo_redo->create_action(TTR("Add Node"));
-			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
-			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
-			undo_redo->add_do_method(this, "_update_graph");
-			undo_redo->add_undo_method(this, "_update_graph");
-			undo_redo->commit_action();
+		undo_redo->create_action(TTR("Add Node"));
+		undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
+		undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
+		undo_redo->add_do_method(this, "_update_graph");
+		undo_redo->add_undo_method(this, "_update_graph");
+		undo_redo->commit_action();
 
-			Node *node = graph->get_node(itos(new_id));
-			if (node) {
-				graph->set_selected(node);
-				_node_selected(node);
-			}
+		Node *node = graph->get_node(itos(new_id));
+		if (node) {
+			graph->set_selected(node);
+			_node_selected(node);
 		}
+	}
 
-		if (d.has("type") && String(d["type"]) == "visual_script_function_drag") {
+	if (String(d["type"]) == "visual_script_function_drag") {
 
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			ofs /= EDSCALE;
+		ofs /= EDSCALE;
 
-			Ref<VisualScriptFunctionCall> vnode;
-			vnode.instance();
-			vnode->set_call_mode(VisualScriptFunctionCall::CALL_MODE_SELF);
+		Ref<VisualScriptFunctionCall> vnode;
+		vnode.instance();
+		vnode->set_call_mode(VisualScriptFunctionCall::CALL_MODE_SELF);
 
-			int new_id = script->get_available_id();
+		int new_id = script->get_available_id();
 
-			undo_redo->create_action(TTR("Add Node"));
-			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
-			undo_redo->add_do_method(vnode.ptr(), "set_base_type", script->get_instance_base_type());
-			undo_redo->add_do_method(vnode.ptr(), "set_function", d["function"]);
+		undo_redo->create_action(TTR("Add Node"));
+		undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
+		undo_redo->add_do_method(vnode.ptr(), "set_base_type", script->get_instance_base_type());
+		undo_redo->add_do_method(vnode.ptr(), "set_function", d["function"]);
 
-			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
-			undo_redo->add_do_method(this, "_update_graph");
-			undo_redo->add_undo_method(this, "_update_graph");
-			undo_redo->commit_action();
+		undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
+		undo_redo->add_do_method(this, "_update_graph");
+		undo_redo->add_undo_method(this, "_update_graph");
+		undo_redo->commit_action();
 
-			Node *node = graph->get_node(itos(new_id));
-			if (node) {
-				graph->set_selected(node);
-				_node_selected(node);
-			}
+		Node *node = graph->get_node(itos(new_id));
+		if (node) {
+			graph->set_selected(node);
+			_node_selected(node);
 		}
+	}
 
-		if (d.has("type") && String(d["type"]) == "visual_script_signal_drag") {
+	if (String(d["type"]) == "visual_script_signal_drag") {
 
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			ofs /= EDSCALE;
+		ofs /= EDSCALE;
 
-			Ref<VisualScriptEmitSignal> vnode;
-			vnode.instance();
-			vnode->set_signal(d["signal"]);
+		Ref<VisualScriptEmitSignal> vnode;
+		vnode.instance();
+		vnode->set_signal(d["signal"]);
 
-			int new_id = script->get_available_id();
+		int new_id = script->get_available_id();
 
-			undo_redo->create_action(TTR("Add Node"));
-			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
-			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
-			undo_redo->add_do_method(this, "_update_graph");
-			undo_redo->add_undo_method(this, "_update_graph");
-			undo_redo->commit_action();
+		undo_redo->create_action(TTR("Add Node"));
+		undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, vnode, ofs);
+		undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
+		undo_redo->add_do_method(this, "_update_graph");
+		undo_redo->add_undo_method(this, "_update_graph");
+		undo_redo->commit_action();
 
-			Node *node = graph->get_node(itos(new_id));
-			if (node) {
-				graph->set_selected(node);
-				_node_selected(node);
-			}
+		Node *node = graph->get_node(itos(new_id));
+		if (node) {
+			graph->set_selected(node);
+			_node_selected(node);
 		}
+	}
 
-		if (d.has("type") && String(d["type"]) == "resource") {
+	if (String(d["type"]) == "resource") {
 
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			ofs /= EDSCALE;
+		ofs /= EDSCALE;
 
-			Ref<VisualScriptPreload> prnode;
-			prnode.instance();
-			prnode->set_preload(d["resource"]);
+		Ref<VisualScriptPreload> prnode;
+		prnode.instance();
+		prnode->set_preload(d["resource"]);
 
-			int new_id = script->get_available_id();
+		int new_id = script->get_available_id();
 
-			undo_redo->create_action(TTR("Add Preload Node"));
-			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, prnode, ofs);
-			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
-			undo_redo->add_do_method(this, "_update_graph");
-			undo_redo->add_undo_method(this, "_update_graph");
-			undo_redo->commit_action();
+		undo_redo->create_action(TTR("Add Preload Node"));
+		undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, prnode, ofs);
+		undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
+		undo_redo->add_do_method(this, "_update_graph");
+		undo_redo->add_undo_method(this, "_update_graph");
+		undo_redo->commit_action();
 
-			Node *node = graph->get_node(itos(new_id));
-			if (node) {
-				graph->set_selected(node);
-				_node_selected(node);
-			}
+		Node *node = graph->get_node(itos(new_id));
+		if (node) {
+			graph->set_selected(node);
+			_node_selected(node);
 		}
+	}
 
-		if (d.has("type") && String(d["type"]) == "files") {
-
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+	if (String(d["type"]) == "files") {
 
-			ofs /= EDSCALE;
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			Array files = d["files"];
+		ofs /= EDSCALE;
 
-			List<int> new_ids;
-			int new_id = script->get_available_id();
+		Array files = d["files"];
 
-			if (files.size()) {
-				undo_redo->create_action(TTR("Add Preload Node"));
+		List<int> new_ids;
+		int new_id = script->get_available_id();
 
-				for (int i = 0; i < files.size(); i++) {
+		if (files.size()) {
+			undo_redo->create_action(TTR("Add Preload Node"));
 
-					Ref<Resource> res = ResourceLoader::load(files[i]);
-					if (!res.is_valid())
-						continue;
+			for (int i = 0; i < files.size(); i++) {
 
-					Ref<VisualScriptPreload> prnode;
-					prnode.instance();
-					prnode->set_preload(res);
+				Ref<Resource> res = ResourceLoader::load(files[i]);
+				if (!res.is_valid())
+					continue;
 
-					undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, prnode, ofs);
-					undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
-					new_ids.push_back(new_id);
-					new_id++;
-					ofs += Vector2(20, 20) * EDSCALE;
-				}
+				Ref<VisualScriptPreload> prnode;
+				prnode.instance();
+				prnode->set_preload(res);
 
-				undo_redo->add_do_method(this, "_update_graph");
-				undo_redo->add_undo_method(this, "_update_graph");
-				undo_redo->commit_action();
+				undo_redo->add_do_method(script.ptr(), "add_node", edited_func, new_id, prnode, ofs);
+				undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, new_id);
+				new_ids.push_back(new_id);
+				new_id++;
+				ofs += Vector2(20, 20) * EDSCALE;
 			}
 
-			for (List<int>::Element *E = new_ids.front(); E; E = E->next()) {
+			undo_redo->add_do_method(this, "_update_graph");
+			undo_redo->add_undo_method(this, "_update_graph");
+			undo_redo->commit_action();
+		}
+
+		for (List<int>::Element *E = new_ids.front(); E; E = E->next()) {
 
-				Node *node = graph->get_node(itos(E->get()));
-				if (node) {
-					graph->set_selected(node);
-					_node_selected(node);
-				}
+			Node *node = graph->get_node(itos(E->get()));
+			if (node) {
+				graph->set_selected(node);
+				_node_selected(node);
 			}
 		}
+	}
 
-		if (d.has("type") && String(d["type"]) == "nodes") {
+	if (String(d["type"]) == "nodes") {
 
-			Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script);
+		Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script);
 
-			if (!sn) {
-				EditorNode::get_singleton()->show_warning("Can't drop nodes because script '" + get_name() + "' is not used in this scene.");
-				return;
-			}
+		if (!sn) {
+			EditorNode::get_singleton()->show_warning("Can't drop nodes because script '" + get_name() + "' is not used in this scene.");
+			return;
+		}
 
 #ifdef OSX_ENABLED
-			bool use_node = Input::get_singleton()->is_key_pressed(KEY_META);
+		bool use_node = Input::get_singleton()->is_key_pressed(KEY_META);
 #else
-			bool use_node = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+		bool use_node = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
 #endif
 
-			Array nodes = d["nodes"];
+		Array nodes = d["nodes"];
 
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
 
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
-			ofs /= EDSCALE;
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
+		ofs /= EDSCALE;
 
-			undo_redo->create_action(TTR("Add Node(s) From Tree"));
-			int base_id = script->get_available_id();
+		undo_redo->create_action(TTR("Add Node(s) From Tree"));
+		int base_id = script->get_available_id();
 
-			if (nodes.size() > 1) {
-				use_node = true;
-			}
+		if (nodes.size() > 1) {
+			use_node = true;
+		}
 
-			for (int i = 0; i < nodes.size(); i++) {
+		for (int i = 0; i < nodes.size(); i++) {
 
-				NodePath np = nodes[i];
-				Node *node = get_node(np);
-				if (!node) {
-					continue;
-				}
-
-				Ref<VisualScriptNode> n;
+			NodePath np = nodes[i];
+			Node *node = get_node(np);
+			if (!node) {
+				continue;
+			}
 
-				if (use_node) {
-					Ref<VisualScriptSceneNode> scene_node;
-					scene_node.instance();
-					scene_node->set_node_path(sn->get_path_to(node));
-					n = scene_node;
+			Ref<VisualScriptNode> n;
 
-				} else {
-					Ref<VisualScriptFunctionCall> call;
-					call.instance();
-					call->set_call_mode(VisualScriptFunctionCall::CALL_MODE_NODE_PATH);
-					call->set_base_path(sn->get_path_to(node));
-					call->set_base_type(node->get_class());
-					n = call;
-
-					method_select->select_method_from_instance(node);
-					selecting_method_id = base_id;
-				}
+			if (use_node) {
+				Ref<VisualScriptSceneNode> scene_node;
+				scene_node.instance();
+				scene_node->set_node_path(sn->get_path_to(node));
+				n = scene_node;
 
-				undo_redo->add_do_method(script.ptr(), "add_node", edited_func, base_id, n, ofs);
-				undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, base_id);
+			} else {
+				Ref<VisualScriptFunctionCall> call;
+				call.instance();
+				call->set_call_mode(VisualScriptFunctionCall::CALL_MODE_NODE_PATH);
+				call->set_base_path(sn->get_path_to(node));
+				call->set_base_type(node->get_class());
+				n = call;
 
-				base_id++;
-				ofs += Vector2(25, 25);
+				method_select->select_method_from_instance(node);
+				selecting_method_id = base_id;
 			}
-			undo_redo->add_do_method(this, "_update_graph");
-			undo_redo->add_undo_method(this, "_update_graph");
-			undo_redo->commit_action();
+
+			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, base_id, n, ofs);
+			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, base_id);
+
+			base_id++;
+			ofs += Vector2(25, 25);
 		}
+		undo_redo->add_do_method(this, "_update_graph");
+		undo_redo->add_undo_method(this, "_update_graph");
+		undo_redo->commit_action();
+	}
 
-		if (d.has("type") && String(d["type"]) == "obj_property") {
+	if (String(d["type"]) == "obj_property") {
 
-			Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script);
+		Node *sn = _find_script_node(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root(), script);
 
-			if (!sn && !Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
-				EditorNode::get_singleton()->show_warning("Can't drop properties because script '" + get_name() + "' is not used in this scene.\nDrop holding 'Shift' to just copy the signature.");
-				return;
-			}
+		if (!sn && !Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+			EditorNode::get_singleton()->show_warning("Can't drop properties because script '" + get_name() + "' is not used in this scene.\nDrop holding 'Shift' to just copy the signature.");
+			return;
+		}
 
-			Object *obj = d["object"];
+		Object *obj = d["object"];
 
-			if (!obj)
-				return;
+		if (!obj)
+			return;
 
-			Node *node = Object::cast_to<Node>(obj);
-			Vector2 ofs = graph->get_scroll_ofs() + p_point;
+		Node *node = Object::cast_to<Node>(obj);
+		Vector2 ofs = graph->get_scroll_ofs() + p_point;
 
-			if (graph->is_using_snap()) {
-				int snap = graph->get_snap();
-				ofs = ofs.snapped(Vector2(snap, snap));
-			}
+		if (graph->is_using_snap()) {
+			int snap = graph->get_snap();
+			ofs = ofs.snapped(Vector2(snap, snap));
+		}
 
-			ofs /= EDSCALE;
+		ofs /= EDSCALE;
 #ifdef OSX_ENABLED
-			bool use_get = Input::get_singleton()->is_key_pressed(KEY_META);
+		bool use_get = Input::get_singleton()->is_key_pressed(KEY_META);
 #else
-			bool use_get = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
+		bool use_get = Input::get_singleton()->is_key_pressed(KEY_CONTROL);
 #endif
 
-			if (!node || Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
+		if (!node || Input::get_singleton()->is_key_pressed(KEY_SHIFT)) {
 
-				if (use_get)
-					undo_redo->create_action(TTR("Add Getter Property"));
-				else
-					undo_redo->create_action(TTR("Add Setter Property"));
+			if (use_get)
+				undo_redo->create_action(TTR("Add Getter Property"));
+			else
+				undo_redo->create_action(TTR("Add Setter Property"));
 
-				int base_id = script->get_available_id();
+			int base_id = script->get_available_id();
 
-				Ref<VisualScriptNode> vnode;
+			Ref<VisualScriptNode> vnode;
 
-				if (!use_get) {
+			if (!use_get) {
 
-					Ref<VisualScriptPropertySet> pset;
-					pset.instance();
-					pset->set_call_mode(VisualScriptPropertySet::CALL_MODE_INSTANCE);
-					pset->set_base_type(obj->get_class());
-					/*if (use_value) {
+				Ref<VisualScriptPropertySet> pset;
+				pset.instance();
+				pset->set_call_mode(VisualScriptPropertySet::CALL_MODE_INSTANCE);
+				pset->set_base_type(obj->get_class());
+				/*if (use_value) {
 						pset->set_use_builtin_value(true);
 						pset->set_builtin_value(d["value"]);
 					}*/
-					vnode = pset;
-				} else {
-
-					Ref<VisualScriptPropertyGet> pget;
-					pget.instance();
-					pget->set_call_mode(VisualScriptPropertyGet::CALL_MODE_INSTANCE);
-					pget->set_base_type(obj->get_class());
+				vnode = pset;
+			} else {
 
-					vnode = pget;
-				}
+				Ref<VisualScriptPropertyGet> pget;
+				pget.instance();
+				pget->set_call_mode(VisualScriptPropertyGet::CALL_MODE_INSTANCE);
+				pget->set_base_type(obj->get_class());
 
-				undo_redo->add_do_method(script.ptr(), "add_node", edited_func, base_id, vnode, ofs);
-				undo_redo->add_do_method(vnode.ptr(), "set_property", d["property"]);
-				if (!use_get) {
-					undo_redo->add_do_method(vnode.ptr(), "set_default_input_value", 0, d["value"]);
-				}
+				vnode = pget;
+			}
 
-				undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, base_id);
+			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, base_id, vnode, ofs);
+			undo_redo->add_do_method(vnode.ptr(), "set_property", d["property"]);
+			if (!use_get) {
+				undo_redo->add_do_method(vnode.ptr(), "set_default_input_value", 0, d["value"]);
+			}
 
-				undo_redo->add_do_method(this, "_update_graph");
-				undo_redo->add_undo_method(this, "_update_graph");
-				undo_redo->commit_action();
+			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, base_id);
 
-			} else {
+			undo_redo->add_do_method(this, "_update_graph");
+			undo_redo->add_undo_method(this, "_update_graph");
+			undo_redo->commit_action();
 
-				if (use_get)
-					undo_redo->create_action(TTR("Add Getter Property"));
-				else
-					undo_redo->create_action(TTR("Add Setter Property"));
+		} else {
 
-				int base_id = script->get_available_id();
+			if (use_get)
+				undo_redo->create_action(TTR("Add Getter Property"));
+			else
+				undo_redo->create_action(TTR("Add Setter Property"));
 
-				Ref<VisualScriptNode> vnode;
+			int base_id = script->get_available_id();
 
-				if (!use_get) {
+			Ref<VisualScriptNode> vnode;
 
-					Ref<VisualScriptPropertySet> pset;
-					pset.instance();
-					if (sn == node) {
-						pset->set_call_mode(VisualScriptPropertySet::CALL_MODE_SELF);
-					} else {
-						pset->set_call_mode(VisualScriptPropertySet::CALL_MODE_NODE_PATH);
-						pset->set_base_path(sn->get_path_to(node));
-					}
+			if (!use_get) {
 
-					vnode = pset;
+				Ref<VisualScriptPropertySet> pset;
+				pset.instance();
+				if (sn == node) {
+					pset->set_call_mode(VisualScriptPropertySet::CALL_MODE_SELF);
 				} else {
-
-					Ref<VisualScriptPropertyGet> pget;
-					pget.instance();
-					if (sn == node) {
-						pget->set_call_mode(VisualScriptPropertyGet::CALL_MODE_SELF);
-					} else {
-						pget->set_call_mode(VisualScriptPropertyGet::CALL_MODE_NODE_PATH);
-						pget->set_base_path(sn->get_path_to(node));
-					}
-					vnode = pget;
+					pset->set_call_mode(VisualScriptPropertySet::CALL_MODE_NODE_PATH);
+					pset->set_base_path(sn->get_path_to(node));
 				}
-				undo_redo->add_do_method(script.ptr(), "add_node", edited_func, base_id, vnode, ofs);
-				undo_redo->add_do_method(vnode.ptr(), "set_property", d["property"]);
-				if (!use_get) {
-					undo_redo->add_do_method(vnode.ptr(), "set_default_input_value", 0, d["value"]);
-				}
-				undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, base_id);
 
-				undo_redo->add_do_method(this, "_update_graph");
-				undo_redo->add_undo_method(this, "_update_graph");
-				undo_redo->commit_action();
+				vnode = pset;
+			} else {
+
+				Ref<VisualScriptPropertyGet> pget;
+				pget.instance();
+				if (sn == node) {
+					pget->set_call_mode(VisualScriptPropertyGet::CALL_MODE_SELF);
+				} else {
+					pget->set_call_mode(VisualScriptPropertyGet::CALL_MODE_NODE_PATH);
+					pget->set_base_path(sn->get_path_to(node));
+				}
+				vnode = pget;
 			}
+			undo_redo->add_do_method(script.ptr(), "add_node", edited_func, base_id, vnode, ofs);
+			undo_redo->add_do_method(vnode.ptr(), "set_property", d["property"]);
+			if (!use_get) {
+				undo_redo->add_do_method(vnode.ptr(), "set_default_input_value", 0, d["value"]);
+			}
+			undo_redo->add_undo_method(script.ptr(), "remove_node", edited_func, base_id);
+
+			undo_redo->add_do_method(this, "_update_graph");
+			undo_redo->add_undo_method(this, "_update_graph");
+			undo_redo->commit_action();
 		}
 	}
 }