@@ -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 } ;
@@ -923,16 +923,29 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
923
923
}
924
924
}
925
925
PortfolioMessage :: CenterPastedLayers { layers } => {
926
- use crate :: messages:: portfolio:: document:: graph_operation:: transform_utils;
927
926
if let Some ( document) = self . active_document_mut ( ) {
928
927
let viewport_bounds = Quad :: from_box_at_zero ( ipp. viewport_bounds . size ( ) ) ;
929
928
let viewport_center = viewport_bounds. center ( ) ;
929
+ let transform = document. metadata ( ) . document_to_viewport ;
930
+
931
+ let viewport_points = Quad :: from_box_at_zero ( ipp. viewport_bounds . size ( ) ) . 0 ;
932
+
933
+ let inv_transform = transform. inverse ( ) ;
934
+ let doc_viewport_points = viewport_points. map ( |p| inv_transform. transform_point2 ( p) ) ;
935
+ let viewport_in_doc_space = Quad ( doc_viewport_points) ;
930
936
931
937
let mut positions = Vec :: new ( ) ;
932
938
933
939
for & layer in & layers {
934
940
if document. network_interface . is_artboard ( & layer. to_node ( ) , & [ ] ) {
935
941
if let Some ( bounds) = document. metadata ( ) . bounding_box_document ( layer) {
942
+ let artboard_quad = Quad :: from_box ( bounds) ;
943
+
944
+ // Only center if nothing is in the viewport
945
+ if artboard_quad. intersects ( viewport_in_doc_space) {
946
+ return ;
947
+ }
948
+
936
949
positions. push ( ( layer, bounds[ 0 ] , true ) ) ;
937
950
}
938
951
} else {
@@ -941,6 +954,12 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
941
954
if let Some ( network) = modify_inputs. network_interface . network ( & [ ] ) {
942
955
if let Some ( node) = network. nodes . get ( & transform_node_id) {
943
956
let current_transform = transform_utils:: get_current_transform ( & node. inputs ) ;
957
+
958
+ // Only center if nothing is in the viewport
959
+ if viewport_in_doc_space. contains ( current_transform. translation ) {
960
+ return ;
961
+ }
962
+
944
963
positions. push ( ( layer, current_transform. translation , false ) ) ;
945
964
}
946
965
}
@@ -951,7 +970,6 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
951
970
952
971
if !positions. is_empty ( ) {
953
972
let mean_pos = positions. iter ( ) . fold ( glam:: DVec2 :: ZERO , |acc, ( _, pos, _) | acc + * pos) / positions. len ( ) as f64 ;
954
- let transform = document. metadata ( ) . document_to_viewport ;
955
973
956
974
for ( layer, pos, is_artboard) in positions {
957
975
let offset_from_center = pos - mean_pos;
@@ -982,6 +1000,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageData<'_>> for PortfolioMes
982
1000
}
983
1001
}
984
1002
}
1003
+
985
1004
PortfolioMessage :: PasteImage {
986
1005
name,
987
1006
image,
0 commit comments