summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2020-07-05 00:55:03 +0200
committerGitHub <noreply@github.com>2020-07-05 00:55:03 +0200
commite4657bd7244b0a86af612ac6b50ca8466c03fd86 (patch)
treeb48f055c48f84ab777b44970f2a8a6c5bc204abb
parent854e9d48edd974787ac187ddb89b927276686aae (diff)
parentde1117f5ad41776f25c32c93c3959df42fa5d638 (diff)
Merge pull request #40112 from Chaosus/graphedit_connection_enchancement
Prevents incorrect connection attempt on port clicking in GraphEdit
-rw-r--r--scene/gui/graph_edit.cpp106
-rw-r--r--scene/gui/graph_edit.h2
2 files changed, 58 insertions, 50 deletions
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index 2b0e084db4..8e5ac83acb 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -370,8 +370,9 @@ bool GraphEdit::_filter_input(const Point2 &p_point) {
void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
Ref<InputEventMouseButton> mb = p_ev;
if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
+ connecting_valid = false;
Ref<Texture2D> port = get_theme_icon("port", "GraphNode");
- Vector2 mpos(mb->get_position().x, mb->get_position().y);
+ click_pos = mb->get_position();
for (int i = get_child_count() - 1; i >= 0; i--) {
GraphNode *gn = Object::cast_to<GraphNode>(get_child(i));
if (!gn) {
@@ -380,7 +381,7 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
for (int j = 0; j < gn->get_connection_output_count(); j++) {
Vector2 pos = gn->get_connection_output_position(j) + gn->get_position();
- if (is_in_hot_zone(pos, mpos)) {
+ if (is_in_hot_zone(pos, click_pos)) {
if (valid_left_disconnect_types.has(gn->get_connection_output_type(j))) {
//check disconnect
for (List<Connection>::Element *E = connections.front(); E; E = E->next()) {
@@ -422,7 +423,7 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
for (int j = 0; j < gn->get_connection_input_count(); j++) {
Vector2 pos = gn->get_connection_input_position(j) + gn->get_position();
- if (is_in_hot_zone(pos, mpos)) {
+ if (is_in_hot_zone(pos, click_pos)) {
if (right_disconnects || valid_right_disconnect_types.has(gn->get_connection_input_type(j))) {
//check disconnect
for (List<Connection>::Element *E = connections.front(); E; E = E->next()) {
@@ -470,37 +471,40 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
connecting_to = mm->get_position();
connecting_target = false;
top_layer->update();
+ connecting_valid = click_pos.distance_to(connecting_to) > 20.0 * zoom;
- Ref<Texture2D> port = get_theme_icon("port", "GraphNode");
- Vector2 mpos = mm->get_position();
- for (int i = get_child_count() - 1; i >= 0; i--) {
- GraphNode *gn = Object::cast_to<GraphNode>(get_child(i));
- if (!gn) {
- continue;
- }
+ if (connecting_valid) {
+ Ref<Texture2D> port = get_theme_icon("port", "GraphNode");
+ Vector2 mpos = mm->get_position();
+ for (int i = get_child_count() - 1; i >= 0; i--) {
+ GraphNode *gn = Object::cast_to<GraphNode>(get_child(i));
+ if (!gn) {
+ continue;
+ }
- if (!connecting_out) {
- for (int j = 0; j < gn->get_connection_output_count(); j++) {
- Vector2 pos = gn->get_connection_output_position(j) + gn->get_position();
- int type = gn->get_connection_output_type(j);
- if ((type == connecting_type || valid_connection_types.has(ConnType(type, connecting_type))) && is_in_hot_zone(pos, mpos)) {
- connecting_target = true;
- connecting_to = pos;
- connecting_target_to = gn->get_name();
- connecting_target_index = j;
- return;
+ if (!connecting_out) {
+ for (int j = 0; j < gn->get_connection_output_count(); j++) {
+ Vector2 pos = gn->get_connection_output_position(j) + gn->get_position();
+ int type = gn->get_connection_output_type(j);
+ if ((type == connecting_type || valid_connection_types.has(ConnType(type, connecting_type))) && is_in_hot_zone(pos, mpos)) {
+ connecting_target = true;
+ connecting_to = pos;
+ connecting_target_to = gn->get_name();
+ connecting_target_index = j;
+ return;
+ }
}
- }
- } else {
- for (int j = 0; j < gn->get_connection_input_count(); j++) {
- Vector2 pos = gn->get_connection_input_position(j) + gn->get_position();
- int type = gn->get_connection_input_type(j);
- if ((type == connecting_type || valid_connection_types.has(ConnType(type, connecting_type))) && is_in_hot_zone(pos, mpos)) {
- connecting_target = true;
- connecting_to = pos;
- connecting_target_to = gn->get_name();
- connecting_target_index = j;
- return;
+ } else {
+ for (int j = 0; j < gn->get_connection_input_count(); j++) {
+ Vector2 pos = gn->get_connection_input_position(j) + gn->get_position();
+ int type = gn->get_connection_input_type(j);
+ if ((type == connecting_type || valid_connection_types.has(ConnType(type, connecting_type))) && is_in_hot_zone(pos, mpos)) {
+ connecting_target = true;
+ connecting_to = pos;
+ connecting_target_to = gn->get_name();
+ connecting_target_index = j;
+ return;
+ }
}
}
}
@@ -508,27 +512,29 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
}
if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) {
- if (connecting && connecting_target) {
- String from = connecting_from;
- int from_slot = connecting_index;
- String to = connecting_target_to;
- int to_slot = connecting_target_index;
-
- if (!connecting_out) {
- SWAP(from, to);
- SWAP(from_slot, to_slot);
- }
- emit_signal("connection_request", from, from_slot, to, to_slot);
+ if (connecting_valid) {
+ if (connecting && connecting_target) {
+ String from = connecting_from;
+ int from_slot = connecting_index;
+ String to = connecting_target_to;
+ int to_slot = connecting_target_index;
+
+ if (!connecting_out) {
+ SWAP(from, to);
+ SWAP(from_slot, to_slot);
+ }
+ emit_signal("connection_request", from, from_slot, to, to_slot);
- } else if (!just_disconnected) {
- String from = connecting_from;
- int from_slot = connecting_index;
- Vector2 ofs = Vector2(mb->get_position().x, mb->get_position().y);
+ } else if (!just_disconnected) {
+ String from = connecting_from;
+ int from_slot = connecting_index;
+ Vector2 ofs = Vector2(mb->get_position().x, mb->get_position().y);
- if (!connecting_out) {
- emit_signal("connection_from_empty", from, from_slot, ofs);
- } else {
- emit_signal("connection_to_empty", from, from_slot, ofs);
+ if (!connecting_out) {
+ emit_signal("connection_from_empty", from, from_slot, ofs);
+ } else {
+ emit_signal("connection_to_empty", from, from_slot, ofs);
+ }
}
}
diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h
index a627a8eec8..454047f228 100644
--- a/scene/gui/graph_edit.h
+++ b/scene/gui/graph_edit.h
@@ -93,6 +93,8 @@ private:
String connecting_target_to;
int connecting_target_index;
bool just_disconnected;
+ bool connecting_valid;
+ Vector2 click_pos;
bool dragging;
bool just_selected;