|
@@ -710,6 +710,9 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
|
|
|
|
|
|
int type = gn->get_connection_output_type(j);
|
|
int type = gn->get_connection_output_type(j);
|
|
if ((type == connecting_type || valid_connection_types.has(ConnType(connecting_type, type))) && is_in_output_hotzone(gn, j, mpos, port_size)) {
|
|
if ((type == connecting_type || valid_connection_types.has(ConnType(connecting_type, type))) && is_in_output_hotzone(gn, j, mpos, port_size)) {
|
|
|
|
+ if (!is_node_hover_valid(gn->get_name(), j, connecting_from, connecting_index)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
connecting_target = true;
|
|
connecting_target = true;
|
|
connecting_to = pos;
|
|
connecting_to = pos;
|
|
connecting_target_to = gn->get_name();
|
|
connecting_target_to = gn->get_name();
|
|
@@ -725,6 +728,9 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) {
|
|
|
|
|
|
int type = gn->get_connection_input_type(j);
|
|
int type = gn->get_connection_input_type(j);
|
|
if ((type == connecting_type || valid_connection_types.has(ConnType(connecting_type, type))) && is_in_input_hotzone(gn, j, mpos, port_size)) {
|
|
if ((type == connecting_type || valid_connection_types.has(ConnType(connecting_type, type))) && is_in_input_hotzone(gn, j, mpos, port_size)) {
|
|
|
|
+ if (!is_node_hover_valid(connecting_from, connecting_index, gn->get_name(), j)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
connecting_target = true;
|
|
connecting_target = true;
|
|
connecting_to = pos;
|
|
connecting_to = pos;
|
|
connecting_target_to = gn->get_name();
|
|
connecting_target_to = gn->get_name();
|
|
@@ -1453,6 +1459,14 @@ void GraphEdit::force_connection_drag_end() {
|
|
emit_signal(SNAME("connection_drag_ended"));
|
|
emit_signal(SNAME("connection_drag_ended"));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool GraphEdit::is_node_hover_valid(const StringName &p_from, const int p_from_port, const StringName &p_to, const int p_to_port) {
|
|
|
|
+ bool valid;
|
|
|
|
+ if (GDVIRTUAL_CALL(_is_node_hover_valid, p_from, p_from_port, p_to, p_to_port, valid)) {
|
|
|
|
+ return valid;
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
void GraphEdit::set_panning_scheme(PanningScheme p_scheme) {
|
|
void GraphEdit::set_panning_scheme(PanningScheme p_scheme) {
|
|
panning_scheme = p_scheme;
|
|
panning_scheme = p_scheme;
|
|
panner->set_control_scheme((ViewPanner::ControlScheme)p_scheme);
|
|
panner->set_control_scheme((ViewPanner::ControlScheme)p_scheme);
|
|
@@ -2315,6 +2329,7 @@ void GraphEdit::_bind_methods() {
|
|
ClassDB::bind_method(D_METHOD("set_selected", "node"), &GraphEdit::set_selected);
|
|
ClassDB::bind_method(D_METHOD("set_selected", "node"), &GraphEdit::set_selected);
|
|
|
|
|
|
GDVIRTUAL_BIND(_get_connection_line, "from", "to")
|
|
GDVIRTUAL_BIND(_get_connection_line, "from", "to")
|
|
|
|
+ GDVIRTUAL_BIND(_is_node_hover_valid, "from", "from_slot", "to", "to_slot");
|
|
|
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "right_disconnects"), "set_right_disconnects", "is_right_disconnects_enabled");
|
|
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "right_disconnects"), "set_right_disconnects", "is_right_disconnects_enabled");
|
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scroll_offset", PROPERTY_HINT_NONE, "suffix:px"), "set_scroll_ofs", "get_scroll_ofs");
|
|
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scroll_offset", PROPERTY_HINT_NONE, "suffix:px"), "set_scroll_ofs", "get_scroll_ofs");
|