Fix unable to disconnect signal in Editor once created
Adds a CONNECT_INHERITED flag to connections, only available in editor builds. This flag denotes that the signal has been inherited from a previous Scene in the instancing hierarchy.
This commit is contained in:
parent
f3e6750a7e
commit
885f2a4eca
3 changed files with 3 additions and 18 deletions
|
@ -556,6 +556,7 @@ public:
|
|||
CONNECT_PERSIST = 2, // hint for scene to save this connection
|
||||
CONNECT_ONE_SHOT = 4,
|
||||
CONNECT_REFERENCE_COUNTED = 8,
|
||||
CONNECT_INHERITED = 16, // Used in editor builds.
|
||||
};
|
||||
|
||||
struct Connection {
|
||||
|
|
|
@ -788,23 +788,7 @@ bool ConnectionsDock::_is_item_signal(TreeItem &p_item) {
|
|||
}
|
||||
|
||||
bool ConnectionsDock::_is_connection_inherited(Connection &p_connection) {
|
||||
Node *scene_root = EditorNode::get_singleton()->get_edited_scene();
|
||||
Ref<PackedScene> scn = ResourceLoader::load(scene_root->get_scene_file_path());
|
||||
ERR_FAIL_NULL_V(scn, false);
|
||||
|
||||
Ref<SceneState> state = scn->get_state();
|
||||
ERR_FAIL_NULL_V(state, false);
|
||||
|
||||
Node *source = Object::cast_to<Node>(p_connection.signal.get_object());
|
||||
Node *target = Object::cast_to<Node>(p_connection.callable.get_object());
|
||||
|
||||
const NodePath source_path = scene_root->get_path_to(source);
|
||||
const NodePath target_path = scene_root->get_path_to(target);
|
||||
const StringName signal_name = p_connection.signal.get_name();
|
||||
const StringName method_name = p_connection.callable.get_method();
|
||||
|
||||
// If it cannot be found in PackedScene, this connection was inherited.
|
||||
return !state->has_connection(source_path, signal_name, target_path, method_name, true);
|
||||
return bool(p_connection.flags & CONNECT_INHERITED);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -450,7 +450,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const {
|
|||
callable = callable.bindp(argptrs, binds.size());
|
||||
}
|
||||
|
||||
cfrom->connect(snames[c.signal], callable, CONNECT_PERSIST | c.flags);
|
||||
cfrom->connect(snames[c.signal], callable, CONNECT_PERSIST | c.flags | (p_edit_state == GEN_EDIT_STATE_MAIN ? 0 : CONNECT_INHERITED));
|
||||
}
|
||||
|
||||
//Node *s = ret_nodes[0];
|
||||
|
|
Loading…
Reference in a new issue