Merge pull request #62 from setzer22/fix/incompatible_port_snap

Fix/incompatible port snap
This commit is contained in:
setzer22 2022-09-15 12:11:00 +02:00 committed by GitHub
commit 0395039920
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -178,7 +178,16 @@ where
let start_pos = port_locations[locator]; let start_pos = port_locations[locator];
// Find a port to connect to // Find a port to connect to
fn snap_to_ports<Key: slotmap::Key + Into<AnyParameterId>, Value>( fn snap_to_ports<
NodeData,
UserState,
DataType: DataTypeTrait<UserState>,
ValueType,
Key: slotmap::Key + Into<AnyParameterId>,
Value,
>(
graph: &Graph<NodeData, DataType, ValueType>,
port_type: &DataType,
ports: &SlotMap<Key, Value>, ports: &SlotMap<Key, Value>,
port_locations: &PortLocations, port_locations: &PortLocations,
cursor_pos: Pos2, cursor_pos: Pos2,
@ -186,23 +195,45 @@ where
ports ports
.iter() .iter()
.find_map(|(port_id, _)| { .find_map(|(port_id, _)| {
port_locations.get(&port_id.into()).and_then(|port_pos| { let compatible_ports = graph
if port_pos.distance(cursor_pos) < DISTANCE_TO_CONNECT { .any_param_type(port_id.into())
Some(*port_pos) .map(|other| other == port_type)
} else { .unwrap_or(false);
None
} if compatible_ports {
}) port_locations.get(&port_id.into()).and_then(|port_pos| {
if port_pos.distance(cursor_pos) < DISTANCE_TO_CONNECT {
Some(*port_pos)
} else {
None
}
})
} else {
None
}
}) })
.unwrap_or(cursor_pos) .unwrap_or(cursor_pos)
} }
let (src_pos, dst_pos) = match locator { let (src_pos, dst_pos) = match locator {
AnyParameterId::Output(_) => ( AnyParameterId::Output(_) => (
start_pos, start_pos,
snap_to_ports(&self.graph.inputs, &port_locations, cursor_pos), snap_to_ports(
&self.graph,
port_type,
&self.graph.inputs,
&port_locations,
cursor_pos,
),
), ),
AnyParameterId::Input(_) => ( AnyParameterId::Input(_) => (
snap_to_ports(&self.graph.outputs, &port_locations, cursor_pos), snap_to_ports(
&self.graph,
port_type,
&self.graph.outputs,
&port_locations,
cursor_pos,
),
start_pos, start_pos,
), ),
}; };
@ -263,7 +294,7 @@ where
self.node_order.retain(|id| *id != *node_id); self.node_order.retain(|id| *id != *node_id);
} }
NodeResponse::DisconnectEvent { input, output } => { NodeResponse::DisconnectEvent { input, output } => {
let other_node = self.graph.get_input(*input).node(); let other_node = self.graph.get_output(*output).node;
self.graph.remove_connection(*input); self.graph.remove_connection(*input);
self.connection_in_progress = self.connection_in_progress =
Some((other_node, AnyParameterId::Output(*output))); Some((other_node, AnyParameterId::Output(*output)));