@@ -5,10 +5,11 @@ use crate::messages::input_mapper::utility_types::macros::action_keys;
5
5
use crate :: messages:: layout:: utility_types:: widget_prelude:: * ;
6
6
use crate :: messages:: portfolio:: document:: utility_types:: document_metadata:: { DocumentMetadata , LayerNodeIdentifier } ;
7
7
use crate :: messages:: prelude:: * ;
8
-
9
8
use graph_craft:: document:: value:: TaggedValue ;
10
- use graph_craft:: document:: { DocumentNode , NodeId , NodeInput , NodeNetwork , NodeOutput } ;
9
+ use graph_craft:: document:: { DocumentNode , NodeId , NodeInput , NodeNetwork , NodeOutput , Source } ;
10
+ use graph_craft:: proto:: GraphErrors ;
11
11
use graphene_core:: * ;
12
+ use interpreted_executor:: dynamic_executor:: ResolvedDocumentNodeTypes ;
12
13
mod document_node_types;
13
14
mod node_properties;
14
15
@@ -23,22 +24,22 @@ pub enum FrontendGraphDataType {
23
24
Raster ,
24
25
#[ serde( rename = "color" ) ]
25
26
Color ,
26
- #[ serde( rename = "number " ) ]
27
+ #[ serde( rename = "general " ) ]
27
28
Text ,
28
29
#[ serde( rename = "vector" ) ]
29
30
Subpath ,
30
31
#[ serde( rename = "number" ) ]
31
32
Number ,
32
- #[ serde( rename = "number " ) ]
33
+ #[ serde( rename = "general " ) ]
33
34
Boolean ,
34
35
/// Refers to the mathematical vector, with direction and magnitude.
35
- #[ serde( rename = "vec2 " ) ]
36
+ #[ serde( rename = "number " ) ]
36
37
Vector ,
37
- #[ serde( rename = "graphic " ) ]
38
+ #[ serde( rename = "raster " ) ]
38
39
GraphicGroup ,
39
40
#[ serde( rename = "artboard" ) ]
40
41
Artboard ,
41
- #[ serde( rename = "palette " ) ]
42
+ #[ serde( rename = "color " ) ]
42
43
Palette ,
43
44
}
44
45
impl FrontendGraphDataType {
@@ -65,13 +66,17 @@ pub struct FrontendGraphInput {
65
66
#[ serde( rename = "dataType" ) ]
66
67
data_type : FrontendGraphDataType ,
67
68
name : String ,
69
+ #[ serde( rename = "resolvedType" ) ]
70
+ resolved_type : Option < String > ,
68
71
}
69
72
70
73
#[ derive( Clone , Debug , Eq , PartialEq , serde:: Serialize , serde:: Deserialize , specta:: Type ) ]
71
74
pub struct FrontendGraphOutput {
72
75
#[ serde( rename = "dataType" ) ]
73
76
data_type : FrontendGraphDataType ,
74
77
name : String ,
78
+ #[ serde( rename = "resolvedType" ) ]
79
+ resolved_type : Option < String > ,
75
80
}
76
81
77
82
#[ derive( Clone , Debug , Eq , PartialEq , serde:: Serialize , serde:: Deserialize , specta:: Type ) ]
@@ -92,6 +97,7 @@ pub struct FrontendNode {
92
97
pub position : ( i32 , i32 ) ,
93
98
pub disabled : bool ,
94
99
pub previewed : bool ,
100
+ pub errors : Option < String > ,
95
101
}
96
102
97
103
// (link_start, link_end, link_end_input_index)
@@ -124,6 +130,8 @@ impl FrontendNodeType {
124
130
#[ derive( Debug , Clone , PartialEq ) ]
125
131
pub struct NodeGraphMessageHandler {
126
132
pub network : Vec < NodeId > ,
133
+ pub resolved_types : ResolvedDocumentNodeTypes ,
134
+ pub node_graph_errors : GraphErrors ,
127
135
has_selection : bool ,
128
136
widgets : [ LayoutGroup ; 2 ] ,
129
137
}
@@ -144,6 +152,8 @@ impl Default for NodeGraphMessageHandler {
144
152
145
153
Self {
146
154
network : Vec :: new ( ) ,
155
+ resolved_types : ResolvedDocumentNodeTypes :: default ( ) ,
156
+ node_graph_errors : Vec :: new ( ) ,
147
157
has_selection : false ,
148
158
widgets : [ LayoutGroup :: Row { widgets : Vec :: new ( ) } , LayoutGroup :: Row { widgets : right_side_widgets } ] ,
149
159
}
@@ -264,7 +274,7 @@ impl NodeGraphMessageHandler {
264
274
}
265
275
}
266
276
267
- fn send_graph ( network : & NodeNetwork , graph_view_overlay_open : bool , responses : & mut VecDeque < Message > ) {
277
+ fn send_graph ( & self , network : & NodeNetwork , graph_view_overlay_open : bool , responses : & mut VecDeque < Message > ) {
268
278
responses. add ( PropertiesPanelMessage :: Refresh ) ;
269
279
270
280
if !graph_view_overlay_open {
@@ -298,27 +308,34 @@ impl NodeGraphMessageHandler {
298
308
299
309
let mut nodes = Vec :: new ( ) ;
300
310
for ( id, node) in & network. nodes {
311
+ let node_path = vec ! [ * id] ;
301
312
// TODO: This should be based on the graph runtime type inference system in order to change the colors of node connectors to match the data type in use
302
313
let Some ( node_type) = document_node_types:: resolve_document_node_type ( & node. name ) else {
303
314
warn ! ( "Node '{}' does not exist in library" , node. name) ;
304
315
continue ;
305
316
} ;
306
317
307
318
// Inputs
308
- let mut inputs = node. inputs . iter ( ) . zip ( node_type. inputs . iter ( ) . map ( |input_type| FrontendGraphInput {
309
- data_type : input_type. data_type ,
310
- name : input_type. name . to_string ( ) ,
319
+ let mut inputs = node. inputs . iter ( ) . zip ( node_type. inputs . iter ( ) . enumerate ( ) . map ( |( index, input_type) | {
320
+ let index = node. inputs . iter ( ) . take ( index) . filter ( |input| input. is_exposed ( ) ) . count ( ) ;
321
+ FrontendGraphInput {
322
+ data_type : input_type. data_type ,
323
+ name : input_type. name . to_string ( ) ,
324
+ resolved_type : self . resolved_types . inputs . get ( & Source { node : node_path. clone ( ) , index } ) . map ( |input| format ! ( "{input:?}" ) ) ,
325
+ }
311
326
} ) ) ;
312
327
let primary_input = inputs. next ( ) . filter ( |( input, _) | input. is_exposed ( ) ) . map ( |( _, input_type) | input_type) ;
313
328
let exposed_inputs = inputs. filter ( |( input, _) | input. is_exposed ( ) ) . map ( |( _, input_type) | input_type) . collect ( ) ;
314
329
315
330
// Outputs
316
- let mut outputs = node_type. outputs . iter ( ) . map ( |output_type| FrontendGraphOutput {
331
+ let mut outputs = node_type. outputs . iter ( ) . enumerate ( ) . map ( |( index , output_type) | FrontendGraphOutput {
317
332
data_type : output_type. data_type ,
318
333
name : output_type. name . to_string ( ) ,
334
+ resolved_type : self . resolved_types . outputs . get ( & Source { node : node_path. clone ( ) , index } ) . map ( |output| format ! ( "{output:?}" ) ) ,
319
335
} ) ;
320
336
let primary_output = if node. has_primary_output { outputs. next ( ) } else { None } ;
321
337
338
+ let errors = self . node_graph_errors . iter ( ) . find ( |error| error. node_path . starts_with ( & node_path) ) . map ( |error| error. error . clone ( ) ) ;
322
339
nodes. push ( FrontendNode {
323
340
is_layer : node. is_layer ( ) ,
324
341
id : * id,
@@ -331,6 +348,7 @@ impl NodeGraphMessageHandler {
331
348
position : node. metadata . position . into ( ) ,
332
349
previewed : network. outputs_contain ( * id) ,
333
350
disabled : network. disabled . contains ( id) ,
351
+ errors : errors. map ( |e| format ! ( "{e:?}" ) ) ,
334
352
} )
335
353
}
336
354
responses. add ( FrontendMessage :: UpdateNodeGraph { nodes, links } ) ;
@@ -607,7 +625,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
607
625
}
608
626
}
609
627
if let Some ( network) = document_network. nested_network ( & self . network ) {
610
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
628
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
611
629
}
612
630
self . update_selected ( document_network, metadata, responses) ;
613
631
}
@@ -635,7 +653,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
635
653
responses. add ( NodeGraphMessage :: InsertNode { node_id, document_node } ) ;
636
654
}
637
655
638
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
656
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
639
657
self . update_selected ( document_network, metadata, responses) ;
640
658
responses. add ( NodeGraphMessage :: SendGraph { should_rerender : false } ) ;
641
659
}
@@ -648,7 +666,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
648
666
self . network . pop ( ) ;
649
667
}
650
668
if let Some ( network) = document_network. nested_network ( & self . network ) {
651
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
669
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
652
670
}
653
671
self . update_selected ( document_network, metadata, responses) ;
654
672
}
@@ -698,7 +716,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
698
716
node. metadata . position += IVec2 :: new ( displacement_x, displacement_y)
699
717
}
700
718
}
701
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
719
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
702
720
}
703
721
NodeGraphMessage :: PasteNodes { serialized_nodes } => {
704
722
let Some ( network) = document_network. nested_network ( & self . network ) else {
@@ -763,7 +781,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
763
781
}
764
782
NodeGraphMessage :: SendGraph { should_rerender } => {
765
783
if let Some ( network) = document_network. nested_network ( & self . network ) {
766
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
784
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
767
785
if should_rerender {
768
786
responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
769
787
}
@@ -890,7 +908,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
890
908
} else if !network. inputs . contains ( & node_id) && !network. original_outputs ( ) . iter ( ) . any ( |output| output. node_id == node_id) {
891
909
network. disabled . push ( node_id) ;
892
910
}
893
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
911
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
894
912
895
913
// Only generate node graph if one of the selected nodes is connected to the output
896
914
if network. connected_to_output ( node_id) {
@@ -926,7 +944,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
926
944
} else {
927
945
return ;
928
946
}
929
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
947
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
930
948
}
931
949
self . update_selection_action_buttons ( document_network, metadata, responses) ;
932
950
responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
@@ -936,13 +954,25 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphHandlerData<'a>> for NodeGrap
936
954
metadata. clear_selected_nodes ( ) ;
937
955
responses. add ( BroadcastEvent :: SelectionChanged ) ;
938
956
939
- Self :: send_graph ( network, graph_view_overlay_open, responses) ;
957
+ self . send_graph ( network, graph_view_overlay_open, responses) ;
940
958
941
959
let node_types = document_node_types:: collect_node_types ( ) ;
942
960
responses. add ( FrontendMessage :: UpdateNodeTypes { node_types } ) ;
943
961
}
944
962
self . update_selected ( document_network, metadata, responses) ;
945
963
}
964
+ NodeGraphMessage :: UpdateTypes { resolved_types, node_graph_errors } => {
965
+ let changed = self . resolved_types != resolved_types || self . node_graph_errors != node_graph_errors;
966
+
967
+ self . resolved_types = resolved_types;
968
+ self . node_graph_errors = node_graph_errors;
969
+
970
+ if changed {
971
+ if let Some ( network) = document_network. nested_network ( & self . network ) {
972
+ self . send_graph ( network, graph_view_overlay_open, responses)
973
+ }
974
+ }
975
+ }
946
976
}
947
977
self . has_selection = metadata. has_selected_nodes ( ) ;
948
978
}
0 commit comments