Remove layer and artboard nudge resizing

This commit is contained in:
Keavon Chambers
2026-06-15 18:51:15 -07:00
parent 82879c7a08
commit 8b8cac23d1
6 changed files with 88 additions and 243 deletions
@@ -30,7 +30,7 @@ pub enum ArtboardToolMessage {
// Tool-specific messages
UpdateSelectedArtboard,
DeleteSelected,
NudgeSelected { delta_x: f64, delta_y: f64, resize: Key, resize_opposite_corner: Key },
NudgeSelected { delta_x: f64, delta_y: f64 },
PointerDown,
PointerMove { constrain_axis_or_aspect: Key, center: Key },
PointerOutsideViewport { constrain_axis_or_aspect: Key, center: Key },
@@ -480,15 +480,7 @@ impl Fsm for ArtboardToolFsmState {
ArtboardToolFsmState::Ready { hovered }
}
(
_,
ArtboardToolMessage::NudgeSelected {
delta_x,
delta_y,
resize,
resize_opposite_corner,
},
) => {
(_, ArtboardToolMessage::NudgeSelected { delta_x, delta_y }) => {
let Some(bounds) = &mut tool_data.bounding_box_manager else {
return ArtboardToolFsmState::Ready { hovered };
};
@@ -500,65 +492,13 @@ impl Fsm for ArtboardToolFsmState {
return ArtboardToolFsmState::Ready { hovered };
}
let resize = input.keyboard.key(resize);
let resize_opposite_corner = input.keyboard.key(resize_opposite_corner);
let [existing_top_left, existing_bottom_right] = bounds.bounds;
// Nudge translation without resizing
if !resize {
let delta = DVec2::from_angle(-document.document_ptz.tilt()).rotate(DVec2::new(delta_x, delta_y));
responses.add(GraphOperationMessage::ResizeArtboard {
layer: selected_artboard,
location: DVec2::new(existing_top_left.x + delta.x, existing_top_left.y + delta.y).round(),
dimensions: (existing_bottom_right - existing_top_left).round(),
});
return ArtboardToolFsmState::Ready { hovered };
}
// Swap and negate coordinates as needed to match the resize direction that's closest to the current tilt angle
let tilt = (document.document_ptz.tilt() + std::f64::consts::TAU) % std::f64::consts::TAU;
let (delta_x, delta_y, opposite_x, opposite_y) = match ((tilt + std::f64::consts::FRAC_PI_4) / std::f64::consts::FRAC_PI_2).floor() as i32 % 4 {
0 => (delta_x, delta_y, false, false),
1 => (delta_y, -delta_x, false, true),
2 => (-delta_x, -delta_y, true, true),
3 => (-delta_y, delta_x, true, false),
_ => unreachable!(),
};
let size = existing_bottom_right - existing_top_left;
let enlargement = DVec2::new(
if resize_opposite_corner != opposite_x { -delta_x } else { delta_x },
if resize_opposite_corner != opposite_y { -delta_y } else { delta_y },
);
let enlargement_factor = (enlargement + size) / size;
let position = DVec2::new(
existing_top_left.x + if resize_opposite_corner != opposite_x { delta_x } else { 0. },
existing_top_left.y + if resize_opposite_corner != opposite_y { delta_y } else { 0. },
);
let mut pivot = (existing_top_left * enlargement_factor - position) / (enlargement_factor - DVec2::ONE);
if !pivot.x.is_finite() {
pivot.x = 0.;
}
if !pivot.y.is_finite() {
pivot.y = 0.;
}
let scale = DAffine2::from_scale(enlargement_factor);
let pivot = DAffine2::from_translation(pivot);
let transformation = pivot * scale * pivot.inverse();
let document_to_viewport = document
.navigation_handler
.calculate_offset_transform(viewport.center_in_viewport_space().into(), &document.document_ptz);
let to = document_to_viewport.inverse() * document.metadata().downstream_transform_to_viewport(selected_artboard);
let original_transform = document.metadata().upstream_transform(selected_artboard.to_node());
let new = to.inverse() * transformation * to * original_transform;
let delta = DVec2::from_angle(-document.document_ptz.tilt()).rotate(DVec2::new(delta_x, delta_y));
responses.add(GraphOperationMessage::ResizeArtboard {
layer: selected_artboard,
location: position.round(),
dimensions: new.transform_vector2(existing_bottom_right - existing_top_left).round(),
location: DVec2::new(existing_top_left.x + delta.x, existing_top_left.y + delta.y).round(),
dimensions: (existing_bottom_right - existing_top_left).round(),
});
ArtboardToolFsmState::Ready { hovered }
@@ -1812,12 +1812,7 @@ impl Fsm for SelectToolFsmState {
// TODO: Make all the following hints only appear if there is at least one selected layer
HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Drag Selected")]),
HintGroup(vec![HintInfo::multi_keys([[Key::KeyG], [Key::KeyR], [Key::KeyS]], "Grab/Rotate/Scale Selected")]),
HintGroup(vec![
HintInfo::arrow_keys("Nudge Selected"),
HintInfo::keys([Key::Shift], "10x").prepend_plus(),
HintInfo::keys([Key::Alt], "Resize Corner").prepend_plus(),
HintInfo::keys([Key::Control], "Other Corner").prepend_plus(),
]),
HintGroup(vec![HintInfo::arrow_keys("Nudge Selected"), HintInfo::keys([Key::Shift], "10x").prepend_plus()]),
HintGroup(vec![
HintInfo::keys_and_mouse([Key::Alt], MouseMotion::LmbDrag, "Move Duplicate"),
HintInfo::keys([Key::Control, Key::KeyD], "Duplicate").add_mac_keys([Key::Command, Key::KeyD]),
@@ -133,7 +133,7 @@ pub enum ShapeToolMessage {
IncreaseSides,
DecreaseSides,
NudgeSelectedLayers { delta_x: f64, delta_y: f64, resize: Key, resize_opposite_corner: Key },
NudgeSelectedLayers { delta_x: f64, delta_y: f64 },
}
fn create_sides_widget(vertices: u32) -> WidgetInstance {
@@ -994,21 +994,8 @@ impl Fsm for ShapeToolFsmState {
}
self
}
(
ShapeToolFsmState::Ready(_),
ShapeToolMessage::NudgeSelectedLayers {
delta_x,
delta_y,
resize,
resize_opposite_corner,
},
) => {
responses.add(DocumentMessage::NudgeSelectedLayers {
delta_x,
delta_y,
resize,
resize_opposite_corner,
});
(ShapeToolFsmState::Ready(_), ShapeToolMessage::NudgeSelectedLayers { delta_x, delta_y }) => {
responses.add(DocumentMessage::NudgeSelectedLayers { delta_x, delta_y });
self
}