Browse Source

Prevents incorrect connection attempt on port clicking in GraphEdit

Prevents incorrect connection attempt on port clicking in GraphEdit
Yuri Roubinsky 5 years ago
parent
commit
de1117f5ad
2 changed files with 58 additions and 50 deletions
  1. 56 50
      scene/gui/graph_edit.cpp
  2. 2 0
      scene/gui/graph_edit.h

+ 56 - 50
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) {
 void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
 	Ref<InputEventMouseButton> mb = p_ev;
 	Ref<InputEventMouseButton> mb = p_ev;
 	if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
 	if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
+		connecting_valid = false;
 		Ref<Texture2D> port = get_theme_icon("port", "GraphNode");
 		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--) {
 		for (int i = get_child_count() - 1; i >= 0; i--) {
 			GraphNode *gn = Object::cast_to<GraphNode>(get_child(i));
 			GraphNode *gn = Object::cast_to<GraphNode>(get_child(i));
 			if (!gn) {
 			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++) {
 			for (int j = 0; j < gn->get_connection_output_count(); j++) {
 				Vector2 pos = gn->get_connection_output_position(j) + gn->get_position();
 				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))) {
 					if (valid_left_disconnect_types.has(gn->get_connection_output_type(j))) {
 						//check disconnect
 						//check disconnect
 						for (List<Connection>::Element *E = connections.front(); E; E = E->next()) {
 						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++) {
 			for (int j = 0; j < gn->get_connection_input_count(); j++) {
 				Vector2 pos = gn->get_connection_input_position(j) + gn->get_position();
 				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))) {
 					if (right_disconnects || valid_right_disconnect_types.has(gn->get_connection_input_type(j))) {
 						//check disconnect
 						//check disconnect
 						for (List<Connection>::Element *E = connections.front(); E; E = E->next()) {
 						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_to = mm->get_position();
 		connecting_target = false;
 		connecting_target = false;
 		top_layer->update();
 		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 (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);
+				}
 			}
 			}
 		}
 		}
 
 

+ 2 - 0
scene/gui/graph_edit.h

@@ -93,6 +93,8 @@ private:
 	String connecting_target_to;
 	String connecting_target_to;
 	int connecting_target_index;
 	int connecting_target_index;
 	bool just_disconnected;
 	bool just_disconnected;
+	bool connecting_valid;
+	Vector2 click_pos;
 
 
 	bool dragging;
 	bool dragging;
 	bool just_selected;
 	bool just_selected;