@@ -10,8 +10,8 @@ pub struct LayersInView {
1010 layers_panel : HashSet < NodeId > ,
1111 /// The nodes in view in the node graph while it's open.
1212 node_graph : HashSet < NodeId > ,
13- /// The latest thumbnail of each layer, as rendered by the graph runtime.
14- thumbnails : HashMap < NodeId , String > ,
13+ /// The message with the latest thumbnail of each layer, as rendered by the graph runtime.
14+ thumbnails : HashMap < NodeId , FrontendMessage > ,
1515 /// The layers whose latest thumbnail the frontend has.
1616 thumbnails_sent : HashSet < NodeId > ,
1717}
@@ -40,10 +40,17 @@ impl LayersInView {
4040 responses. add ( PortfolioMessage :: SubmitThumbnailsInView ) ;
4141 }
4242
43- /// Keeps a layer's newly rendered thumbnail, sending it to the frontend only if the layer is in view.
44- pub fn receive_thumbnail ( & mut self , layer : NodeId , thumbnail : String , responses : & mut VecDeque < Message > ) {
43+ pub fn thumbnail_layer ( message : & FrontendMessage ) -> Option < NodeId > {
44+ match message {
45+ FrontendMessage :: UpdateNodeThumbnail { id, .. } | FrontendMessage :: UpdateNodeThumbnailCanvases { id, .. } | FrontendMessage :: UpdateNodeThumbnailPixels { id, .. } => Some ( * id) ,
46+ _ => None ,
47+ }
48+ }
49+
50+ /// Keeps the message with a layer's newly rendered thumbnail, sending it to the frontend only if the layer is in view.
51+ pub fn receive_thumbnail ( & mut self , layer : NodeId , thumbnail : FrontendMessage , responses : & mut VecDeque < Message > ) {
4552 if self . in_view ( & layer) {
46- responses. add ( FrontendMessage :: UpdateNodeThumbnail { id : layer , value : thumbnail. clone ( ) } ) ;
53+ responses. add ( thumbnail. clone ( ) ) ;
4754 self . thumbnails_sent . insert ( layer) ;
4855 } else {
4956 // Out of view, the frontend's copy is now stale until the layer comes back into view
@@ -84,7 +91,7 @@ impl LayersInView {
8491 }
8592 let Some ( thumbnail) = self . thumbnails . get ( & layer) else { continue } ;
8693
87- responses. add ( FrontendMessage :: UpdateNodeThumbnail { id : layer , value : thumbnail. clone ( ) } ) ;
94+ responses. add ( thumbnail. clone ( ) ) ;
8895 self . thumbnails_sent . insert ( layer) ;
8996 }
9097 }
@@ -94,6 +101,10 @@ impl LayersInView {
94101mod tests {
95102 use super :: * ;
96103
104+ fn svg_thumbnail ( layer : NodeId , svg : & str ) -> FrontendMessage {
105+ FrontendMessage :: UpdateNodeThumbnail { id : layer, value : svg. to_string ( ) }
106+ }
107+
97108 fn thumbnails_sent ( responses : VecDeque < Message > ) -> Vec < ( NodeId , String ) > {
98109 responses
99110 . into_iter ( )
@@ -110,8 +121,8 @@ mod tests {
110121 let mut layers_in_view = LayersInView :: default ( ) ;
111122
112123 let mut responses = VecDeque :: new ( ) ;
113- layers_in_view. receive_thumbnail ( layer, "first" . to_string ( ) , & mut responses) ;
114- layers_in_view. receive_thumbnail ( layer, "latest" . to_string ( ) , & mut responses) ;
124+ layers_in_view. receive_thumbnail ( layer, svg_thumbnail ( layer , "first" ) , & mut responses) ;
125+ layers_in_view. receive_thumbnail ( layer, svg_thumbnail ( layer , "latest" ) , & mut responses) ;
115126 assert ! ( thumbnails_sent( responses) . is_empty( ) , "out of view, a thumbnail isn't sent" ) ;
116127
117128 let mut responses = VecDeque :: new ( ) ;
@@ -130,12 +141,12 @@ mod tests {
130141
131142 let mut responses = VecDeque :: new ( ) ;
132143 layers_in_view. set_layers_panel ( HashSet :: from ( [ layer] ) , & mut responses) ;
133- layers_in_view. receive_thumbnail ( layer, "in view" . to_string ( ) , & mut responses) ;
144+ layers_in_view. receive_thumbnail ( layer, svg_thumbnail ( layer , "in view" ) , & mut responses) ;
134145 assert_eq ! ( thumbnails_sent( responses) , vec![ ( layer, "in view" . to_string( ) ) ] , "in view, a thumbnail is sent as it's received" ) ;
135146
136147 let mut responses = VecDeque :: new ( ) ;
137148 layers_in_view. set_layers_panel ( HashSet :: new ( ) , & mut responses) ;
138- layers_in_view. receive_thumbnail ( layer, "changed" . to_string ( ) , & mut responses) ;
149+ layers_in_view. receive_thumbnail ( layer, svg_thumbnail ( layer , "changed" ) , & mut responses) ;
139150 layers_in_view. set_layers_panel ( HashSet :: from ( [ layer] ) , & mut responses) ;
140151 assert_eq ! ( thumbnails_sent( responses) , vec![ ( layer, "changed" . to_string( ) ) ] ) ;
141152 }
@@ -147,7 +158,7 @@ mod tests {
147158
148159 let mut responses = VecDeque :: new ( ) ;
149160 layers_in_view. set_layers_panel ( HashSet :: from ( [ layer] ) , & mut responses) ;
150- layers_in_view. receive_thumbnail ( layer, "before" . to_string ( ) , & mut responses) ;
161+ layers_in_view. receive_thumbnail ( layer, svg_thumbnail ( layer , "before" ) , & mut responses) ;
151162
152163 let mut responses = VecDeque :: new ( ) ;
153164 layers_in_view. forget_thumbnails ( & [ layer, other_documents_layer] , & mut responses) ;
@@ -163,7 +174,7 @@ mod tests {
163174 assert ! ( thumbnails_sent( responses) . is_empty( ) , "a forgotten thumbnail isn't sent again" ) ;
164175
165176 let mut responses = VecDeque :: new ( ) ;
166- layers_in_view. receive_thumbnail ( layer, "after" . to_string ( ) , & mut responses) ;
177+ layers_in_view. receive_thumbnail ( layer, svg_thumbnail ( layer , "after" ) , & mut responses) ;
167178 assert_eq ! ( thumbnails_sent( responses) , vec![ ( layer, "after" . to_string( ) ) ] , "rendered anew, it's sent as before" ) ;
168179 }
169180}
0 commit comments