summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2019-01-14 15:46:56 -0300
committerJuan Linietsky <reduzio@gmail.com>2019-01-14 15:46:56 -0300
commit91290f0ded1e8fee5dd09a590629b8c4a301a57a (patch)
tree0cd586f582380b2f346ff9035ea3a2f8bfa80686
parent6f884cc88409fa1eb25b95f0fe91fc848c1b1481 (diff)
Added a flag to specify an exported node path must be supplied from scene root, fixes #24412
-rw-r--r--core/object.h1
-rw-r--r--editor/editor_properties.cpp21
-rw-r--r--editor/editor_properties.h3
-rw-r--r--scene/main/viewport.cpp2
4 files changed, 17 insertions, 10 deletions
diff --git a/core/object.h b/core/object.h
index 434cca0fec..a5bb6dea5d 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 6684fe1abb..3d6ff233e3 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<Node>(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<Node>(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<Node>(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<StringName> p_valid_types) {
+void EditorPropertyNodePath::setup(const NodePath &p_base_hint, Vector<StringName> 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<StringName>());
+ editor->setup(p_hint_text, Vector<StringName>(), !(p_usage & PROPERTY_USAGE_NODE_PATH_FROM_SCENE_ROOT));
}
if (p_hint == PROPERTY_HINT_NODE_PATH_VALID_TYPES && p_hint_text != String()) {
Vector<String> types = p_hint_text.split(",", false);
Vector<StringName> 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 2051ab4019..3118b929c4 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<StringName> 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<StringName> p_valid_types);
+ void setup(const NodePath &p_base_hint, Vector<StringName> 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 52738a1114..0633d194f7 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() {