11use super :: clipboards:: Clipboard ;
22use super :: layer_panel:: { layer_panel_entry, LayerDataTypeDiscriminant , LayerMetadata , LayerPanelEntry , RawBuffer } ;
33use super :: utility_types:: { AlignAggregate , AlignAxis , DocumentSave , FlipAxis } ;
4- use super :: vectorize_layer_metadata;
4+ use super :: { vectorize_layer_metadata, PropertiesPanelMessageHandler } ;
55use super :: { ArtboardMessageHandler , MovementMessageHandler , OverlaysMessageHandler , TransformLayerMessageHandler } ;
66use crate :: consts:: {
77 ASYMPTOTIC_EFFECT , DEFAULT_DOCUMENT_NAME , FILE_EXPORT_SUFFIX , FILE_SAVE_SUFFIX , GRAPHITE_DOCUMENT_VERSION , SCALE_EFFECT , SCROLLBAR_SPACING , VIEWPORT_ZOOM_TO_FIT_PADDING_SCALE_FACTOR ,
@@ -16,7 +16,7 @@ use crate::viewport_tools::vector_editor::vector_shape::VectorShape;
1616use crate :: EditorError ;
1717
1818use graphene:: document:: Document as GrapheneDocument ;
19- use graphene:: layers:: folder :: Folder ;
19+ use graphene:: layers:: folder_layer :: FolderLayer ;
2020use graphene:: layers:: layer_info:: LayerDataType ;
2121use graphene:: layers:: style:: ViewMode ;
2222use graphene:: { DocumentError , DocumentResponse , LayerId , Operation as DocumentOperation } ;
@@ -45,6 +45,7 @@ pub struct DocumentMessageHandler {
4545 pub artboard_message_handler : ArtboardMessageHandler ,
4646 #[ serde( skip) ]
4747 transform_layer_handler : TransformLayerMessageHandler ,
48+ properties_panel_message_handler : PropertiesPanelMessageHandler ,
4849 pub overlays_visible : bool ,
4950 pub snapping_enabled : bool ,
5051 pub view_mode : ViewMode ,
@@ -65,6 +66,7 @@ impl Default for DocumentMessageHandler {
6566 overlays_message_handler : OverlaysMessageHandler :: default ( ) ,
6667 artboard_message_handler : ArtboardMessageHandler :: default ( ) ,
6768 transform_layer_handler : TransformLayerMessageHandler :: default ( ) ,
69+ properties_panel_message_handler : PropertiesPanelMessageHandler :: default ( ) ,
6870 snapping_enabled : true ,
6971 overlays_visible : true ,
7072 view_mode : ViewMode :: default ( ) ,
@@ -221,7 +223,7 @@ impl DocumentMessageHandler {
221223 )
222224 }
223225
224- fn serialize_structure ( & self , folder : & Folder , structure : & mut Vec < u64 > , data : & mut Vec < LayerId > , path : & mut Vec < LayerId > ) {
226+ fn serialize_structure ( & self , folder : & FolderLayer , structure : & mut Vec < u64 > , data : & mut Vec < LayerId > , path : & mut Vec < LayerId > ) {
225227 let mut space = 0 ;
226228 for ( id, layer) in folder. layer_ids . iter ( ) . zip ( folder. layers ( ) ) . rev ( ) {
227229 data. push ( * id) ;
@@ -676,16 +678,28 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
676678 self . transform_layer_handler
677679 . process_action ( message, ( & mut self . layer_metadata , & mut self . graphene_document , ipp) , responses) ;
678680 }
681+ #[ remain:: unsorted]
682+ PropertiesPanel ( message) => {
683+ self . properties_panel_message_handler . process_action ( message, & self . graphene_document , responses) ;
684+ }
679685
680686 // Messages
681687 AbortTransaction => {
682688 self . undo ( responses) . unwrap_or_else ( |e| log:: warn!( "{}" , e) ) ;
683689 responses. extend ( [ RenderDocument . into ( ) , DocumentStructureChanged . into ( ) ] ) ;
684690 }
685691 AddSelectedLayers { additional_layers } => {
686- for layer_path in additional_layers {
687- responses. extend ( self . select_layer ( & layer_path) ) ;
692+ for layer_path in & additional_layers {
693+ responses. extend ( self . select_layer ( layer_path) ) ;
694+ }
695+
696+ let selected_paths: Vec < Vec < u64 > > = self . selected_layers ( ) . map ( |path| path. to_vec ( ) ) . collect ( ) ;
697+ if selected_paths. is_empty ( ) {
698+ responses. push_back ( PropertiesPanelMessage :: ClearSelection . into ( ) )
699+ } else {
700+ responses. push_back ( PropertiesPanelMessage :: SetActiveLayers { paths : selected_paths } . into ( ) )
688701 }
702+
689703 // TODO: Correctly update layer panel in clear_selection instead of here
690704 responses. push_back ( FolderChanged { affected_folder_path : vec ! [ ] } . into ( ) ) ;
691705 responses. push_back ( DocumentMessage :: SelectionChanged . into ( ) ) ;
@@ -727,6 +741,16 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
727741 responses. push_back ( ToolMessage :: DocumentIsDirty . into ( ) ) ;
728742 }
729743 }
744+ BooleanOperation ( op) => {
745+ // convert Vec<&[LayerId]> to Vec<Vec<&LayerId>> because Vec<&[LayerId]> does not implement several traits (Debug, Serialize, Deserialize, ...) required by DocumentOperation enum
746+ responses. push_back (
747+ DocumentOperation :: BooleanOperation {
748+ operation : op,
749+ selected : self . selected_layers_sorted ( ) . iter ( ) . map ( |slice| ( * slice) . into ( ) ) . collect ( ) ,
750+ }
751+ . into ( ) ,
752+ ) ;
753+ }
730754 CommitTransaction => ( ) ,
731755 CreateEmptyFolder { mut container_path } => {
732756 let id = generate_uuid ( ) ;
@@ -743,12 +767,15 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
743767 DebugPrintDocument => {
744768 log:: debug!( "{:#?}\n {:#?}" , self . graphene_document, self . layer_metadata) ;
745769 }
746- DeleteLayer { layer_path } => responses. push_front ( DocumentOperation :: DeleteLayer { path : layer_path } . into ( ) ) ,
770+ DeleteLayer { layer_path } => {
771+ responses. push_front ( DocumentOperation :: DeleteLayer { path : layer_path. clone ( ) } . into ( ) ) ;
772+ responses. push_back ( PropertiesPanelMessage :: CheckSelectedWasDeleted { path : layer_path } . into ( ) ) ;
773+ }
747774 DeleteSelectedLayers => {
748775 self . backup ( responses) ;
749776
750777 for path in self . selected_layers_without_children ( ) {
751- responses. push_front ( DocumentOperation :: DeleteLayer { path : path. to_vec ( ) } . into ( ) ) ;
778+ responses. push_front ( DocumentMessage :: DeleteLayer { layer_path : path. to_vec ( ) } . into ( ) ) ;
752779 }
753780
754781 responses. push_front ( DocumentMessage :: SelectionChanged . into ( ) ) ;
@@ -781,7 +808,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
781808 }
782809 }
783810 ExportDocument => {
784- // TODO(MFISH33 ): Add Dialog to select artboards
811+ // TODO(mfish33 ): Add Dialog to select artboards
785812 let bbox = self . document_bounds ( ) . unwrap_or_else ( || [ DVec2 :: ZERO , ipp. viewport_bounds . size ( ) ] ) ;
786813 let size = bbox[ 1 ] - bbox[ 0 ] ;
787814 let name = match self . name . ends_with ( FILE_SAVE_SUFFIX ) {
@@ -861,9 +888,10 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
861888 ) ;
862889 }
863890 LayerChanged { affected_layer_path } => {
864- if let Ok ( layer_entry) = self . layer_panel_entry ( affected_layer_path) {
891+ if let Ok ( layer_entry) = self . layer_panel_entry ( affected_layer_path. clone ( ) ) {
865892 responses. push_back ( FrontendMessage :: UpdateDocumentLayer { data : layer_entry } . into ( ) ) ;
866893 }
894+ responses. push_back ( PropertiesPanelMessage :: CheckSelectedWasUpdated { path : affected_layer_path } . into ( ) ) ;
867895 }
868896 MoveSelectedLayersTo {
869897 folder_path,
@@ -902,7 +930,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
902930 responses. push_back ( ToolMessage :: DocumentIsDirty . into ( ) ) ;
903931 }
904932 Redo => {
905- responses. push_back ( SelectMessage :: Abort . into ( ) ) ;
933+ responses. push_back ( SelectToolMessage :: Abort . into ( ) ) ;
906934 responses. push_back ( DocumentHistoryForward . into ( ) ) ;
907935 responses. push_back ( ToolMessage :: DocumentIsDirty . into ( ) ) ;
908936 responses. push_back ( RenderDocument . into ( ) ) ;
@@ -1159,7 +1187,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessorMessageHandler> for Docum
11591187 responses. push_back ( ToolMessage :: DocumentIsDirty . into ( ) ) ;
11601188 }
11611189 Undo => {
1162- responses. push_back ( SelectMessage :: Abort . into ( ) ) ;
1190+ responses. push_back ( SelectToolMessage :: Abort . into ( ) ) ;
11631191 responses. push_back ( DocumentHistoryBackward . into ( ) ) ;
11641192 responses. push_back ( ToolMessage :: DocumentIsDirty . into ( ) ) ;
11651193 responses. push_back ( RenderDocument . into ( ) ) ;
0 commit comments