From 91290f0ded1e8fee5dd09a590629b8c4a301a57a Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Mon, 14 Jan 2019 15:46:56 -0300 Subject: [PATCH] Added a flag to specify an exported node path must be supplied from scene root, fixes #24412 --- core/object.h | 1 + editor/editor_properties.cpp | 21 +++++++++++++-------- editor/editor_properties.h | 3 ++- scene/main/viewport.cpp | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/core/object.h b/core/object.h index 434cca0fec7..a5bb6dea5d0 100644 --- a/core/object.h +++ b/core/object.h @@ -118,6 +118,7 @@ enum PropertyUsageFlags { PROPERTY_USAGE_INTERNAL = 1 << 20, PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE = 1 << 21, // If the object is duplicated also this property will be duplicated PROPERTY_USAGE_HIGH_END_GFX = 1 << 22, + PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT = 1 << 23, PROPERTY_USAGE_DEFAULT = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK, PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED, diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 6684fe1abb2..3d6ff233e39 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -1828,11 +1828,14 @@ void EditorPropertyNodePath::_node_selected(const NodePath &p_path) { NodePath path = p_path; Node *base_node = Object::cast_to(get_edited_object()); if (!base_node) { - //try a base node within history - if (EditorNode::get_singleton()->get_editor_history()->get_path_size() > 0) { - Object *base = ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_path_object(0)); - if (base) { - base_node = Object::cast_to(base); + + if (guess_path_from_editor_history) { + //try a base node within history + if (EditorNode::get_singleton()->get_editor_history()->get_path_size() > 0) { + Object *base = ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_path_object(0)); + if (base) { + base_node = Object::cast_to(base); + } } } } @@ -1912,10 +1915,11 @@ void EditorPropertyNodePath::update_property() { assign->set_icon(EditorNode::get_singleton()->get_object_icon(target_node, "Node")); } -void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector p_valid_types) { +void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector p_valid_types, bool p_guess_path_from_editor_history) { base_hint = p_base_hint; valid_types = p_valid_types; + guess_path_from_editor_history = guess_path_from_editor_history; } void EditorPropertyNodePath::_notification(int p_what) { @@ -1948,6 +1952,7 @@ EditorPropertyNodePath::EditorPropertyNodePath() { clear->set_flat(true); clear->connect("pressed", this, "_node_clear"); hbc->add_child(clear); + guess_path_from_editor_history = false; scene_tree = NULL; //do not allocate unnecessarily } @@ -3124,12 +3129,12 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ EditorPropertyNodePath *editor = memnew(EditorPropertyNodePath); if (p_hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && p_hint_text != String()) { - editor->setup(p_hint_text, Vector()); + editor->setup(p_hint_text, Vector(), !(p_usage & PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT)); } if (p_hint == PROPERTY_HINT_NODE_PATH_VALID_TYPES && p_hint_text != String()) { Vector types = p_hint_text.split(",", false); Vector sn = Variant(types); //convert via variant - editor->setup(NodePath(), sn); + editor->setup(NodePath(), sn, !(p_usage & PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT)); } add_property_editor(p_path, editor); diff --git a/editor/editor_properties.h b/editor/editor_properties.h index 2051ab40194..3118b929c4e 100644 --- a/editor/editor_properties.h +++ b/editor/editor_properties.h @@ -499,6 +499,7 @@ class EditorPropertyNodePath : public EditorProperty { Button *clear; SceneTreeDialog *scene_tree; NodePath base_hint; + bool guess_path_from_editor_history; Vector valid_types; void _node_selected(const NodePath &p_path); @@ -511,7 +512,7 @@ protected: public: virtual void update_property(); - void setup(const NodePath &p_base_hint, Vector p_valid_types); + void setup(const NodePath &p_base_hint, Vector p_valid_types, bool p_guess_path_from_editor_history = true); EditorPropertyNodePath(); }; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 52738a11141..0633d194f7c 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -148,7 +148,7 @@ void ViewportTexture::_bind_methods() { ClassDB::bind_method(D_METHOD("set_viewport_path_in_scene", "path"), &ViewportTexture::set_viewport_path_in_scene); ClassDB::bind_method(D_METHOD("get_viewport_path_in_scene"), &ViewportTexture::get_viewport_path_in_scene); - ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "viewport_path", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Viewport"), "set_viewport_path_in_scene", "get_viewport_path_in_scene"); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "viewport_path", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "Viewport", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT), "set_viewport_path_in_scene", "get_viewport_path_in_scene"); } ViewportTexture::ViewportTexture() {