@@ -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