@@ -20,7 +20,7 @@ use crate::node_graph_executor::{ExportConfig, NodeGraphExecutor};
20
20
use graphene_core:: renderer:: Quad ;
21
21
22
22
use bezier_rs:: Subpath ;
23
- use glam:: { DAffine2 , DVec2 , IVec2 } ;
23
+ use glam:: { DVec2 , IVec2 } ;
24
24
use graph_craft:: document:: value:: TaggedValue ;
25
25
use graph_craft:: document:: { DocumentNodeImplementation , NodeId , NodeInput } ;
26
26
use graphene_core:: text:: { Font , TypesettingConfig } ;
@@ -915,16 +915,29 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
915
915
}
916
916
}
917
917
PortfolioMessage :: CenterPastedLayers { layers } => {
918
- use crate :: messages:: portfolio:: document:: graph_operation:: transform_utils;
919
918
if let Some ( document) = self . active_document_mut ( ) {
920
919
let viewport_bounds = Quad :: from_box_at_zero ( ipp. viewport_bounds . size ( ) ) ;
921
920
let viewport_center = viewport_bounds. center ( ) ;
921
+ let transform = document. metadata ( ) . document_to_viewport ;
922
+
923
+ let viewport_points = Quad :: from_box_at_zero ( ipp. viewport_bounds . size ( ) ) . 0 ;
924
+
925
+ let inv_transform = transform. inverse ( ) ;
926
+ let doc_viewport_points = viewport_points. map ( |p| inv_transform. transform_point2 ( p) ) ;
927
+ let viewport_in_doc_space = Quad ( doc_viewport_points) ;
922
928
923
929
let mut positions = Vec :: new ( ) ;
924
930
925
931
for & layer in & layers {
926
932
if document. network_interface . is_artboard ( & layer. to_node ( ) , & [ ] ) {
927
933
if let Some ( bounds) = document. metadata ( ) . bounding_box_document ( layer) {
934
+ let artboard_quad = Quad :: from_box ( bounds) ;
935
+
936
+ // Only center if nothing is in the viewport
937
+ if artboard_quad. intersects ( viewport_in_doc_space) {
938
+ return ;
939
+ }
940
+
928
941
positions. push ( ( layer, bounds[ 0 ] , true ) ) ;
929
942
}
930
943
} else {
@@ -933,6 +946,12 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
933
946
if let Some ( network) = modify_inputs. network_interface . network ( & [ ] ) {
934
947
if let Some ( node) = network. nodes . get ( & transform_node_id) {
935
948
let current_transform = transform_utils:: get_current_transform ( & node. inputs ) ;
949
+
950
+ // Only center if nothing is in the viewport
951
+ if viewport_in_doc_space. contains ( current_transform. translation ) {
952
+ return ;
953
+ }
954
+
936
955
positions. push ( ( layer, current_transform. translation , false ) ) ;
937
956
}
938
957
}
@@ -943,7 +962,6 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
943
962
944
963
if !positions. is_empty ( ) {
945
964
let mean_pos = positions. iter ( ) . fold ( glam:: DVec2 :: ZERO , |acc, ( _, pos, _) | acc + * pos) / positions. len ( ) as f64 ;
946
- let transform = document. metadata ( ) . document_to_viewport ;
947
965
948
966
for ( layer, pos, is_artboard) in positions {
949
967
let offset_from_center = pos - mean_pos;
@@ -974,6 +992,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
974
992
}
975
993
}
976
994
}
995
+
977
996
PortfolioMessage :: PasteImage {
978
997
name,
979
998
image,
0 commit comments