mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-01 14:28:11 +08:00
Remove layer and artboard nudge resizing
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user