Added a flag to specify an exported node path must be supplied from scene root, fixes #24412
This commit is contained in:
parent
6f884cc884
commit
91290f0ded
4 changed files with 17 additions and 10 deletions
|
@ -118,6 +118,7 @@ enum PropertyUsageFlags {
|
||||||
PROPERTY_USAGE_INTERNAL = 1 << 20,
|
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_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_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 = 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,
|
PROPERTY_USAGE_DEFAULT_INTL = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_NETWORK | PROPERTY_USAGE_INTERNATIONALIZED,
|
||||||
|
|
|
@ -1828,6 +1828,8 @@ void EditorPropertyNodePath::_node_selected(const NodePath &p_path) {
|
||||||
NodePath path = p_path;
|
NodePath path = p_path;
|
||||||
Node *base_node = Object::cast_to<Node>(get_edited_object());
|
Node *base_node = Object::cast_to<Node>(get_edited_object());
|
||||||
if (!base_node) {
|
if (!base_node) {
|
||||||
|
|
||||||
|
if (guess_path_from_editor_history) {
|
||||||
//try a base node within history
|
//try a base node within history
|
||||||
if (EditorNode::get_singleton()->get_editor_history()->get_path_size() > 0) {
|
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));
|
Object *base = ObjectDB::get_instance(EditorNode::get_singleton()->get_editor_history()->get_path_object(0));
|
||||||
|
@ -1836,6 +1838,7 @@ void EditorPropertyNodePath::_node_selected(const NodePath &p_path) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!base_node && get_edited_object()->has_method("get_root_path")) {
|
if (!base_node && get_edited_object()->has_method("get_root_path")) {
|
||||||
base_node = get_edited_object()->call("get_root_path");
|
base_node = get_edited_object()->call("get_root_path");
|
||||||
|
@ -1912,10 +1915,11 @@ void EditorPropertyNodePath::update_property() {
|
||||||
assign->set_icon(EditorNode::get_singleton()->get_object_icon(target_node, "Node"));
|
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;
|
base_hint = p_base_hint;
|
||||||
valid_types = p_valid_types;
|
valid_types = p_valid_types;
|
||||||
|
guess_path_from_editor_history = guess_path_from_editor_history;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorPropertyNodePath::_notification(int p_what) {
|
void EditorPropertyNodePath::_notification(int p_what) {
|
||||||
|
@ -1948,6 +1952,7 @@ EditorPropertyNodePath::EditorPropertyNodePath() {
|
||||||
clear->set_flat(true);
|
clear->set_flat(true);
|
||||||
clear->connect("pressed", this, "_node_clear");
|
clear->connect("pressed", this, "_node_clear");
|
||||||
hbc->add_child(clear);
|
hbc->add_child(clear);
|
||||||
|
guess_path_from_editor_history = false;
|
||||||
|
|
||||||
scene_tree = NULL; //do not allocate unnecessarily
|
scene_tree = NULL; //do not allocate unnecessarily
|
||||||
}
|
}
|
||||||
|
@ -3124,12 +3129,12 @@ bool EditorInspectorDefaultPlugin::parse_property(Object *p_object, Variant::Typ
|
||||||
|
|
||||||
EditorPropertyNodePath *editor = memnew(EditorPropertyNodePath);
|
EditorPropertyNodePath *editor = memnew(EditorPropertyNodePath);
|
||||||
if (p_hint == PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE && p_hint_text != String()) {
|
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()) {
|
if (p_hint == PROPERTY_HINT_NODE_PATH_VALID_TYPES && p_hint_text != String()) {
|
||||||
Vector<String> types = p_hint_text.split(",", false);
|
Vector<String> types = p_hint_text.split(",", false);
|
||||||
Vector<StringName> sn = Variant(types); //convert via variant
|
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);
|
add_property_editor(p_path, editor);
|
||||||
|
|
||||||
|
|
|
@ -499,6 +499,7 @@ class EditorPropertyNodePath : public EditorProperty {
|
||||||
Button *clear;
|
Button *clear;
|
||||||
SceneTreeDialog *scene_tree;
|
SceneTreeDialog *scene_tree;
|
||||||
NodePath base_hint;
|
NodePath base_hint;
|
||||||
|
bool guess_path_from_editor_history;
|
||||||
|
|
||||||
Vector<StringName> valid_types;
|
Vector<StringName> valid_types;
|
||||||
void _node_selected(const NodePath &p_path);
|
void _node_selected(const NodePath &p_path);
|
||||||
|
@ -511,7 +512,7 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void update_property();
|
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();
|
EditorPropertyNodePath();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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("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);
|
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() {
|
ViewportTexture::ViewportTexture() {
|
||||||
|
|
Loading…
Reference in a new issue