Remove the usage of pointers in signal call, to fix #67941
The signal was emitted right as the node was being disposed of. Since the connection was deferred, the receiving method received an already freed pointer. Instead, we listen to the text_changed signal and keep record of the edited text which we then use to update node name when the LineEdit goes out of focus.
This commit is contained in:
parent
ad3f2a2340
commit
3d0a9b2bec
2 changed files with 13 additions and 5 deletions
|
|
@ -153,7 +153,8 @@ void AnimationNodeBlendTreeEditor::update_graph() {
|
|||
node->add_child(name);
|
||||
node->set_slot(0, false, 0, Color(), true, read_only ? -1 : 0, get_theme_color(SNAME("font_color"), SNAME("Label")));
|
||||
name->connect("text_submitted", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed).bind(agnode), CONNECT_DEFERRED);
|
||||
name->connect("focus_exited", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed_focus_out).bind(name, agnode), CONNECT_DEFERRED);
|
||||
name->connect("focus_exited", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_renamed_focus_out).bind(agnode), CONNECT_DEFERRED);
|
||||
name->connect("text_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_node_rename_lineedit_changed), CONNECT_DEFERRED);
|
||||
base = 1;
|
||||
node->set_show_close_button(true);
|
||||
node->connect("close_request", callable_mp(this, &AnimationNodeBlendTreeEditor::_delete_request).bind(E), CONNECT_DEFERRED);
|
||||
|
|
@ -991,13 +992,18 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima
|
|||
}
|
||||
|
||||
update_graph(); // Needed to update the signal connections with the new name.
|
||||
current_node_rename_text = String();
|
||||
}
|
||||
|
||||
void AnimationNodeBlendTreeEditor::_node_renamed_focus_out(Node *le, Ref<AnimationNode> p_node) {
|
||||
if (le == nullptr) {
|
||||
void AnimationNodeBlendTreeEditor::_node_renamed_focus_out(Ref<AnimationNode> p_node) {
|
||||
if (current_node_rename_text.is_empty()) {
|
||||
return; // The text_submitted signal triggered the graph update and freed the LineEdit.
|
||||
}
|
||||
_node_renamed(le->call("get_text"), p_node);
|
||||
_node_renamed(current_node_rename_text, p_node);
|
||||
}
|
||||
|
||||
void AnimationNodeBlendTreeEditor::_node_rename_lineedit_changed(const String &p_text) {
|
||||
current_node_rename_text = p_text;
|
||||
}
|
||||
|
||||
bool AnimationNodeBlendTreeEditor::can_edit(const Ref<AnimationNode> &p_node) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue