From e564b4fd0743c6202a2b47eefbf823c2664c89fb Mon Sep 17 00:00:00 2001 From: asynts Date: Wed, 15 Jan 2020 18:18:34 +0100 Subject: [PATCH] Refactor (and fix) how the connect button is disabled. It should not be possible to click the "Connect" button unless - a node is selected, and - that node is valid in the current mode. The modes are the default and advanced modes which allow connecting to scripts and nodes respectively. --- editor/connections_dialog.cpp | 31 +++++++++++++++++++++++++++---- editor/connections_dialog.h | 1 + 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 2ef50973452..1853133bc70 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -146,7 +146,7 @@ void ConnectDialog::_tree_node_selected() { return; dst_path = source->get_path_to(current); - get_ok()->set_disabled(false); + _update_ok_enabled(); } /* @@ -210,6 +210,27 @@ void ConnectDialog::_remove_bind() { cdbinds->notify_changed(); } +/* + * Enables or disables the connect button. The connect button is enabled if a + * node is selected and valid in the selected mode. + */ +void ConnectDialog::_update_ok_enabled() { + + Node *target = tree->get_selected(); + + if (target == nullptr) { + get_ok()->set_disabled(true); + return; + } + + if (!advanced->is_pressed() && target->get_script().is_null()) { + get_ok()->set_disabled(true); + return; + } + + get_ok()->set_disabled(false); +} + void ConnectDialog::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE) { @@ -225,6 +246,7 @@ void ConnectDialog::_bind_methods() { 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); + ClassDB::bind_method("_update_ok_enabled", &ConnectDialog::_update_ok_enabled); ADD_SIGNAL(MethodInfo("connected")); } @@ -301,13 +323,12 @@ void ConnectDialog::init(Connection c, bool bEdit) { tree->set_marked(source, true); if (c.target) { - get_ok()->set_disabled(false); set_dst_node(static_cast(c.target)); set_dst_method(c.method); - } else { - get_ok()->set_disabled(true); } + _update_ok_enabled(); + bool bDeferred = (c.flags & CONNECT_DEFERRED) == CONNECT_DEFERRED; bool bOneshot = (c.flags & CONNECT_ONESHOT) == CONNECT_ONESHOT; @@ -350,6 +371,8 @@ void ConnectDialog::_advanced_pressed() { error_label->set_visible(!_find_first_script(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root())); } + _update_ok_enabled(); + set_position((get_viewport_rect().size - get_custom_minimum_size()) / 2); } diff --git a/editor/connections_dialog.h b/editor/connections_dialog.h index 4f46e145e12..c30413953ab 100644 --- a/editor/connections_dialog.h +++ b/editor/connections_dialog.h @@ -80,6 +80,7 @@ class ConnectDialog : public ConfirmationDialog { void _add_bind(); void _remove_bind(); void _advanced_pressed(); + void _update_ok_enabled(); protected: void _notification(int p_what);