Browse Source

Prevent crash described in #34555.

Normally it wouldn't be possible to click on the "Connect" button if no node
is selected, because the button would be disabled.

However, double clicking on a node is also hooked up to the same signal
and double clicking is possible even if the "Connect" button is disabled.

This caused a crash described in #34555.
asynts 5 years ago
parent
commit
71b4b180ba
2 changed files with 13 additions and 1 deletions
  1. 12 1
      editor/connections_dialog.cpp
  2. 1 0
      editor/connections_dialog.h

+ 12 - 1
editor/connections_dialog.cpp

@@ -148,6 +148,16 @@ void ConnectDialog::_tree_node_selected() {
 	get_ok()->set_disabled(false);
 }
 
+/*
+ * Called each time a target node is activated within the target node tree.
+ */
+void ConnectDialog::_tree_item_activated() {
+
+	if (!get_ok()->is_disabled()) {
+		get_ok()->emit_signal("pressed");
+	}
+}
+
 /*
  * Adds a new parameter bind to connection.
  */
@@ -211,6 +221,7 @@ void ConnectDialog::_bind_methods() {
 	ClassDB::bind_method("_advanced_pressed", &ConnectDialog::_advanced_pressed);
 	ClassDB::bind_method("_cancel", &ConnectDialog::_cancel_pressed);
 	ClassDB::bind_method("_tree_node_selected", &ConnectDialog::_tree_node_selected);
+	ClassDB::bind_method("_tree_item_activated", &ConnectDialog::_tree_item_activated);
 	ClassDB::bind_method("_add_bind", &ConnectDialog::_add_bind);
 	ClassDB::bind_method("_remove_bind", &ConnectDialog::_remove_bind);
 
@@ -360,7 +371,7 @@ ConnectDialog::ConnectDialog() {
 
 	tree = memnew(SceneTreeEditor(false));
 	tree->set_connecting_signal(true);
-	tree->get_scene_tree()->connect("item_activated", this, "_ok");
+	tree->get_scene_tree()->connect("item_activated", this, "_tree_item_activated");
 	tree->connect("node_selected", this, "_tree_node_selected");
 	tree->set_connect_to_script_mode(true);
 

+ 1 - 0
editor/connections_dialog.h

@@ -76,6 +76,7 @@ class ConnectDialog : public ConfirmationDialog {
 	void ok_pressed();
 	void _cancel_pressed();
 	void _tree_node_selected();
+	void _tree_item_activated();
 	void _add_bind();
 	void _remove_bind();
 	void _advanced_pressed();