Skip to content

Commit 1694fd3

Browse files
committed
Fix importing images into offset artboards so they don't get offset as well
1 parent 8568925 commit 1694fd3

1 file changed

Lines changed: 21 additions & 6 deletions

File tree

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -662,22 +662,30 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
662662
} => {
663663
// All the image's pixels have been converted to 0..=1, linear, and premultiplied by `Color::from_rgba8_srgb`
664664

665+
let layer_parent = self.new_layer_parent(true);
665666
let image_size = DVec2::new(image.width as f64, image.height as f64);
666667

667668
let transform = if place_at_origin {
668669
// File-open flow: place at document origin without centering so `WrapContentInArtboard` can wrap it
669670
DAffine2::from_scale(image_size)
670671
} else {
671-
// Clipboard paste or drag-drop: center at cursor or viewport center
672-
self.document_transform_from_mouse(mouse, viewport) * DAffine2::from_scale_angle_translation(image_size, 0., image_size / -2.)
672+
// Clipboard paste or drag-drop: center at cursor or viewport center.
673+
// Convert the document-space cursor to the parent's local coordinate space so that
674+
// an artboard at a non-zero position does not offset the placement.
675+
let parent_to_document = {
676+
let metadata = self.metadata();
677+
metadata.document_to_viewport.inverse() * metadata.transform_to_viewport(layer_parent)
678+
};
679+
let cursor_in_parent = parent_to_document.inverse() * self.document_transform_from_mouse(mouse, viewport);
680+
cursor_in_parent * DAffine2::from_scale_angle_translation(image_size, 0., image_size / -2.)
673681
};
674682

675683
let layer_node_id = NodeId::new();
676684
let layer_id = LayerNodeIdentifier::new_unchecked(layer_node_id);
677685

678686
responses.add(DocumentMessage::AddTransaction);
679687

680-
let layer = graph_modification_utils::new_image_layer(Table::new_from_element(Raster::new_cpu(image)), layer_node_id, self.new_layer_parent(true), responses);
688+
let layer = graph_modification_utils::new_image_layer(Table::new_from_element(Raster::new_cpu(image)), layer_node_id, layer_parent, responses);
681689

682690
if let Some(name) = name {
683691
responses.add(NodeGraphMessage::SetDisplayName {
@@ -714,20 +722,27 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
714722
parent_and_insert_index,
715723
place_at_origin,
716724
} => {
725+
let layer_parent = self.new_layer_parent(true);
717726
let transform = if place_at_origin {
718727
// File-open flow: place at document origin so `WrapContentInArtboard` can wrap it without extra Transform nodes
719728
DAffine2::IDENTITY
720729
} else {
721-
// Clipboard paste or drag-drop: center at cursor or viewport center
722-
self.document_transform_from_mouse(mouse, viewport)
730+
// Clipboard paste or drag-drop: center at cursor or viewport center.
731+
// Convert the document-space cursor to the parent's local coordinate space so that
732+
// an artboard at a non-zero position does not offset the placement.
733+
let parent_to_document = {
734+
let metadata = self.metadata();
735+
metadata.document_to_viewport.inverse() * metadata.transform_to_viewport(layer_parent)
736+
};
737+
parent_to_document.inverse() * self.document_transform_from_mouse(mouse, viewport)
723738
};
724739

725740
let layer_node_id = NodeId::new();
726741
let layer_id = LayerNodeIdentifier::new_unchecked(layer_node_id);
727742

728743
responses.add(DocumentMessage::AddTransaction);
729744

730-
let layer = graph_modification_utils::new_svg_layer(svg, transform, !place_at_origin, layer_node_id, self.new_layer_parent(true), responses);
745+
let layer = graph_modification_utils::new_svg_layer(svg, transform, !place_at_origin, layer_node_id, layer_parent, responses);
731746

732747
if let Some(name) = name {
733748
responses.add(NodeGraphMessage::SetDisplayName {

0 commit comments

Comments
 (0)