@@ -929,6 +929,69 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
929
929
} ;
930
930
responses. add ( FrontendMessage :: UpdateWirePathInProgress { wire_path : Some ( wire_path) } ) ;
931
931
}
932
+ } else if self . disconnecting . is_some ( ) {
933
+ // Disconnecting with no upstream node, create new value node.
934
+ let to_connector = network_interface. input_connector_from_click ( ipp. mouse . position , selection_network_path) ;
935
+ if let Some ( to_connector) = & to_connector {
936
+ let Some ( input_position) = network_interface. input_position ( to_connector, selection_network_path) else {
937
+ log:: error!( "Could not get input position for connector: {to_connector:?}" ) ;
938
+ return ;
939
+ } ;
940
+ self . wire_in_progress_to_connector = Some ( input_position) ;
941
+ }
942
+ // Not hovering over a node input or node output, insert the node
943
+ else {
944
+ // Disconnect if the wire was previously connected to an input
945
+ if let Some ( disconnecting) = self . disconnecting . take ( ) {
946
+ let mut position = if let Some ( to_connector) = self . wire_in_progress_to_connector { to_connector } else { point } ;
947
+ // Offset to drag from center of node
948
+ position = position - DVec2 :: new ( 24. * 3. , 24. ) ;
949
+
950
+ // Offset to account for division rounding error
951
+ if position. x < 0. {
952
+ position. x = position. x - 1. ;
953
+ }
954
+ if position. y < 0. {
955
+ position. y = position. y - 1. ;
956
+ }
957
+
958
+ let Some ( input) = network_interface. take_input ( & disconnecting, breadcrumb_network_path) else {
959
+ return ;
960
+ } ;
961
+
962
+ let drag_start = DragStart {
963
+ start_x : point. x ,
964
+ start_y : point. y ,
965
+ round_x : 0 ,
966
+ round_y : 0 ,
967
+ } ;
968
+
969
+ self . drag_start = Some ( ( drag_start, false ) ) ;
970
+ self . node_has_moved_in_drag = false ;
971
+ self . update_node_graph_hints ( responses) ;
972
+
973
+ let node_id = NodeId :: new ( ) ;
974
+ responses. add ( NodeGraphMessage :: CreateNodeFromContextMenu {
975
+ node_id : Some ( node_id) ,
976
+ node_type : "Identity" . to_string ( ) ,
977
+ xy : Some ( ( ( position. x / 24. ) as i32 , ( position. y / 24. ) as i32 ) ) ,
978
+ } ) ;
979
+
980
+ responses. add ( NodeGraphMessage :: SetInput {
981
+ input_connector : InputConnector :: node ( node_id, 0 ) ,
982
+ input,
983
+ } ) ;
984
+
985
+ responses. add ( NodeGraphMessage :: CreateWire {
986
+ output_connector : OutputConnector :: Node { node_id, output_index : 0 } ,
987
+ input_connector : disconnecting,
988
+ } ) ;
989
+ responses. add ( NodeGraphMessage :: SelectedNodesSet { nodes : vec ! [ node_id] } ) ;
990
+ // Update the frontend that the node is disconnected
991
+ responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
992
+ responses. add ( NodeGraphMessage :: SendGraph ) ;
993
+ }
994
+ }
932
995
} else if let Some ( ( drag_start, dragged) ) = & mut self . drag_start {
933
996
if drag_start. start_x != point. x || drag_start. start_y != point. y {
934
997
* dragged = true ;
0 commit comments