@@ -16,10 +16,11 @@ use crate::messages::portfolio::document::utility_types::nodes::{CollapsedLayers
16
16
use crate :: messages:: portfolio:: document:: utility_types:: wires:: { GraphWireStyle , WirePath , WirePathUpdate , build_vector_wire} ;
17
17
use crate :: messages:: prelude:: * ;
18
18
use crate :: messages:: tool:: common_functionality:: auto_panning:: AutoPanning ;
19
- use crate :: messages:: tool:: common_functionality:: graph_modification_utils:: get_clip_mode;
19
+ use crate :: messages:: tool:: common_functionality:: graph_modification_utils:: { self , get_clip_mode} ;
20
20
use crate :: messages:: tool:: tool_messages:: tool_prelude:: { Key , MouseMotion } ;
21
21
use crate :: messages:: tool:: utility_types:: { HintData , HintGroup , HintInfo } ;
22
22
use glam:: { DAffine2 , DVec2 , IVec2 } ;
23
+ use graph_craft:: document:: value:: TaggedValue ;
23
24
use graph_craft:: document:: { DocumentNodeImplementation , NodeId , NodeInput } ;
24
25
use graph_craft:: proto:: GraphErrors ;
25
26
use graphene_std:: math:: math_ext:: QuadExt ;
@@ -119,6 +120,41 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
119
120
120
121
responses. add ( NodeGraphMessage :: SelectedNodesSet { nodes : vec ! [ new_layer_id] } ) ;
121
122
}
123
+ NodeGraphMessage :: AddPathNode => {
124
+ let selected_nodes = network_interface. selected_nodes ( ) ;
125
+ let mut selected_layers = selected_nodes. selected_layers ( network_interface. document_metadata ( ) ) ;
126
+ let selected_layer = selected_layers. next ( ) ;
127
+ let has_selection = selected_layer. is_some ( ) ;
128
+ let has_multiple_selection = selected_layers. next ( ) . is_some ( ) ;
129
+
130
+ let compatible_type = selected_layer. and_then ( |layer| {
131
+ let graph_layer = graph_modification_utils:: NodeGraphLayer :: new ( layer, network_interface) ;
132
+ let node_type = graph_layer. horizontal_layer_flow ( ) . nth ( 1 ) ;
133
+ if let Some ( node_id) = node_type {
134
+ let ( output_type, _) = network_interface. output_type ( & node_id, 0 , & [ ] ) ;
135
+ Some ( format ! ( "type:{}" , output_type. nested_type( ) ) )
136
+ } else {
137
+ None
138
+ }
139
+ } ) ;
140
+
141
+ let compatible = compatible_type. unwrap_or ( "" . to_string ( ) ) == "type:Instances<VectorData>" ;
142
+ let single_layer_selected = has_selection && !has_multiple_selection;
143
+
144
+ if compatible && single_layer_selected {
145
+ if let Some ( layer) = selected_layer {
146
+ let node_type = "Path" . to_string ( ) ;
147
+ let graph_layer = graph_modification_utils:: NodeGraphLayer :: new ( layer, & network_interface) ;
148
+ let modifiable = matches ! ( graph_layer. find_input( "Path" , 1 ) , Some ( TaggedValue :: VectorModification ( _) ) ) ;
149
+ if !modifiable {
150
+ responses. add ( NodeGraphMessage :: CreateNodeInLayerWithTransaction {
151
+ node_type : node_type. clone ( ) ,
152
+ layer : LayerNodeIdentifier :: new_unchecked ( layer. to_node ( ) ) ,
153
+ } ) ;
154
+ }
155
+ }
156
+ }
157
+ }
122
158
NodeGraphMessage :: AddImport => {
123
159
network_interface. add_import ( graph_craft:: document:: value:: TaggedValue :: None , true , -1 , "" , "" , breadcrumb_network_path) ;
124
160
responses. add ( NodeGraphMessage :: SendGraph ) ;
0 commit comments