1- use crate :: messages:: layout:: utility_types:: widget_prelude:: * ;
21use crate :: messages:: prelude:: * ;
2+ use crate :: messages:: { input_mapper:: utility_types:: input_mouse:: ViewportBounds , layout:: utility_types:: widget_prelude:: * } ;
33use glam:: { IVec2 , UVec2 } ;
44use graph_craft:: document:: NodeId ;
55
6+ #[ derive( ExtractField ) ]
7+ pub struct NewDocumentDialogMessageContext < ' a > {
8+ pub viewport_bounds : & ' a ViewportBounds ,
9+ }
10+
611/// A dialog to allow users to set some initial options about a new document.
712#[ derive( Debug , Clone , Default , ExtractField ) ]
813pub struct NewDocumentDialogMessageHandler {
@@ -12,8 +17,8 @@ pub struct NewDocumentDialogMessageHandler {
1217}
1318
1419#[ message_handler_data]
15- impl MessageHandler < NewDocumentDialogMessage , ( ) > for NewDocumentDialogMessageHandler {
16- fn process_message ( & mut self , message : NewDocumentDialogMessage , responses : & mut VecDeque < Message > , _ : ( ) ) {
20+ impl < ' a > MessageHandler < NewDocumentDialogMessage , NewDocumentDialogMessageContext < ' a > > for NewDocumentDialogMessageHandler {
21+ fn process_message ( & mut self , message : NewDocumentDialogMessage , responses : & mut VecDeque < Message > , context : NewDocumentDialogMessageContext < ' a > ) {
1722 match message {
1823 NewDocumentDialogMessage :: Name ( name) => self . name = name,
1924 NewDocumentDialogMessage :: Infinite ( infinite) => self . infinite = infinite,
@@ -24,21 +29,18 @@ impl MessageHandler<NewDocumentDialogMessage, ()> for NewDocumentDialogMessageHa
2429
2530 let create_artboard = !self . infinite && self . dimensions . x > 0 && self . dimensions . y > 0 ;
2631 if create_artboard {
27- responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
28- responses. add ( DeferMessage :: AfterGraphRun {
29- messages : vec ! [
30- GraphOperationMessage :: NewArtboard {
31- id: NodeId :: new( ) ,
32- artboard: graphene_std:: Artboard :: new( IVec2 :: ZERO , self . dimensions. as_ivec2( ) ) ,
33- }
34- . into( ) ,
35- NodeGraphMessage :: ForceRunDocumentGraph . into( ) ,
36- DeferMessage :: AfterGraphRun {
37- messages: vec![ DeferMessage :: TriggerNavigationReady . into( ) ] ,
38- }
39- . into( ) ,
40- ] ,
32+ responses. add ( GraphOperationMessage :: NewArtboard {
33+ id : NodeId :: new ( ) ,
34+ artboard : graphene_std:: Artboard :: new ( IVec2 :: ZERO , self . dimensions . as_ivec2 ( ) ) ,
4135 } ) ;
36+ responses. add ( NavigationMessage :: CanvasPan { delta : self . dimensions . as_dvec2 ( ) } ) ;
37+ responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
38+ // If we already have bounds, we won't receive a viewport bounds update so we just fabricate one ourselves
39+ if * context. viewport_bounds != ViewportBounds :: default ( ) {
40+ responses. add ( InputPreprocessorMessage :: BoundsOfViewports {
41+ bounds_of_viewports : vec ! [ context. viewport_bounds. clone( ) ] ,
42+ } ) ;
43+ }
4244 responses. add ( DeferMessage :: AfterNavigationReady {
4345 messages : vec ! [ DocumentMessage :: ZoomCanvasToFitAll . into( ) , DocumentMessage :: DeselectAllLayers . into( ) ] ,
4446 } ) ;
0 commit comments