Skip to content

Commit 94e0922

Browse files
committed
Add GRS support for selected segments
1 parent 0fa0e89 commit 94e0922

3 files changed

Lines changed: 35 additions & 3 deletions

File tree

editor/src/messages/portfolio/document/utility_types/transformation.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,19 @@ impl OriginalTransforms {
8989
continue;
9090
};
9191

92+
let Some(selected_segments) = shape_editor.selected_segments_in_layer(layer) else {
93+
continue;
94+
};
95+
96+
let mut selected_points = selected_points.clone();
97+
98+
for (segmentid, _, start, end) in vector_data.segment_bezier_iter() {
99+
if selected_segments.contains(&segmentid) {
100+
selected_points.insert(ManipulatorPointId::Anchor(start));
101+
selected_points.insert(ManipulatorPointId::Anchor(end));
102+
}
103+
}
104+
92105
// Anchors also move their handles
93106
let anchor_ids = selected_points.iter().filter_map(|point| point.as_anchor());
94107
let anchors = anchor_ids.filter_map(|id| vector_data.point_domain.position_from_id(id).map(|pos| (id, AnchorPoint { initial: pos, current: pos })));

editor/src/messages/tool/common_functionality/shape_editor.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,10 @@ impl ShapeState {
791791
self.selected_shape_state.get(&layer).map(|state| &state.selected_points)
792792
}
793793

794+
pub fn selected_segments_in_layer(&self, layer: LayerNodeIdentifier) -> Option<&HashSet<SegmentId>> {
795+
self.selected_shape_state.get(&layer).map(|state| &state.selected_segments)
796+
}
797+
794798
pub fn move_primary(&self, segment: SegmentId, delta: DVec2, layer: LayerNodeIdentifier, responses: &mut VecDeque<Message>) {
795799
responses.add(GraphOperationMessage::Vector {
796800
layer,

editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,28 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
179179
*selected.pivot = selected.mean_average_of_pivots();
180180
self.local_pivot = document.metadata().document_to_viewport.inverse().transform_point2(*selected.pivot);
181181
self.grab_target = document.metadata().document_to_viewport.inverse().transform_point2(selected.mean_average_of_pivots());
182-
} else if let Some(vector_data) = selected_layers.first().and_then(|&layer| document.network_interface.compute_modified_vector(layer)) {
182+
}
183+
// Here vector data from all layers is not considered which can be problem in pivot calculation
184+
else if let Some(vector_data) = selected_layers.first().and_then(|&layer| document.network_interface.compute_modified_vector(layer)) {
183185
*selected.original_transforms = OriginalTransforms::default();
184186

185187
let viewspace = document.metadata().transform_to_viewport(selected_layers[0]);
186188
let selected_points = shape_editor.selected_points().collect::<Vec<_>>();
189+
let mut affected_points = selected_points.iter().map(|p| (*p).clone()).collect::<Vec<_>>();
190+
191+
let selected_segments = shape_editor.selected_segments().collect::<HashSet<_>>();
192+
193+
for (segment_id, _, start, end) in vector_data.segment_bezier_iter() {
194+
if selected_segments.contains(&segment_id) {
195+
affected_points.push(ManipulatorPointId::Anchor(start));
196+
affected_points.push(ManipulatorPointId::Anchor(end));
197+
}
198+
}
199+
200+
let affected_point_refs = affected_points.iter().collect();
187201

188202
let get_location = |point: &&ManipulatorPointId| point.get_position(&vector_data).map(|position| viewspace.transform_point2(position));
189-
if let Some((new_pivot, grab_target)) = calculate_pivot(&selected_points, &vector_data, viewspace, |point: &ManipulatorPointId| get_location(&point)) {
203+
if let Some((new_pivot, grab_target)) = calculate_pivot(&affected_point_refs, &vector_data, viewspace, |point: &ManipulatorPointId| get_location(&point)) {
190204
*selected.pivot = new_pivot;
191205

192206
self.local_pivot = document_to_viewport.inverse().transform_point2(*selected.pivot);
@@ -389,7 +403,8 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
389403
}
390404
TransformLayerMessage::BeginGRS { transform_type } => {
391405
let selected_points: Vec<&ManipulatorPointId> = shape_editor.selected_points().collect();
392-
if (using_path_tool && selected_points.is_empty())
406+
let selected_segments = shape_editor.selected_segments().collect::<Vec<_>>();
407+
if (using_path_tool && selected_points.is_empty() && selected_segments.is_empty())
393408
|| (!using_path_tool && !using_select_tool && !using_pen_tool)
394409
|| selected_layers.is_empty()
395410
|| transform_type.equivalent_to(self.transform_operation)

0 commit comments

Comments
 (0)