@@ -76,25 +76,18 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
7676 let viewspace = document. metadata ( ) . transform_to_viewport ( selected_layers[ 0 ] ) ;
7777
7878 let mut point_count: usize = 0 ;
79- let get_location = |point : & ManipulatorPointId | point. get_position ( & vector_data) . map ( |position| viewspace. transform_point2 ( position) ) ;
79+ let get_location = |point : & & ManipulatorPointId | point. get_position ( & vector_data) . map ( |position| viewspace. transform_point2 ( position) ) ;
8080 let points = shape_editor. selected_points ( ) ;
8181 let selected_points: Vec < & ManipulatorPointId > = points. collect ( ) ;
8282
8383 if selected_points. len ( ) == 1 {
84- if let Some ( point) = selected_points. first ( ) {
85- match point {
86- ManipulatorPointId :: PrimaryHandle ( _) | ManipulatorPointId :: EndHandle ( _) => {
87- if let Some ( anchor_position) = point. get_anchor_position ( & vector_data) {
88- * selected. pivot = viewspace. transform_point2 ( anchor_position) ;
89- }
90- }
91- _ => {
92- * selected. pivot = selected_points. iter ( ) . filter_map ( |point| get_location ( point) ) . inspect ( |_| point_count += 1 ) . sum :: < DVec2 > ( ) / point_count as f64 ;
93- }
94- }
84+ let point = & selected_points[ 0 ] ;
85+ if let ManipulatorPointId :: PrimaryHandle ( _) | ManipulatorPointId :: EndHandle ( _) = point {
86+ let anchor_position = point. get_anchor_position ( & vector_data) . unwrap ( ) ;
87+ * selected. pivot = viewspace. transform_point2 ( anchor_position) ;
88+ } else {
89+ * selected. pivot = selected_points. iter ( ) . filter_map ( get_location) . inspect ( |_| point_count += 1 ) . sum :: < DVec2 > ( ) / point_count as f64 ;
9590 }
96- } else {
97- * selected. pivot = selected_points. iter ( ) . filter_map ( |point| get_location ( point) ) . inspect ( |_| point_count += 1 ) . sum :: < DVec2 > ( ) / point_count as f64 ;
9891 }
9992 }
10093 } else {
@@ -121,23 +114,13 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
121114 responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
122115 }
123116 TransformLayerMessage :: BeginGrab => {
124- if !( using_path_tool || using_select_tool) {
125- return ;
126- }
127- let points = shape_editor. selected_points ( ) ;
128- let selected_points: Vec < & ManipulatorPointId > = points. collect ( ) ;
129-
130- if using_path_tool && selected_points. is_empty ( ) {
131- responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
132- return ;
133- }
134-
135- if let TransformOperation :: Grabbing ( _) = self . transform_operation {
136- return ;
137- }
117+ if !( using_path_tool || using_select_tool)
118+ || ( using_path_tool && shape_editor. selected_points ( ) . next ( ) . is_none ( ) )
119+ || matches ! ( self . transform_operation, TransformOperation :: Grabbing ( _) )
120+ || selected_layers. is_empty ( )
121+ {
122+ selected. original_transforms . clear ( ) ;
138123
139- // Don't allow grab with no selected layers
140- if selected_layers. is_empty ( ) {
141124 return ;
142125 }
143126
@@ -148,62 +131,46 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
148131 selected. original_transforms . clear ( ) ;
149132 }
150133 TransformLayerMessage :: BeginRotate => {
151- if !( using_path_tool || using_select_tool) {
134+ let selected_points: Vec < & ManipulatorPointId > = shape_editor. selected_points ( ) . collect ( ) ;
135+ if !( using_path_tool || using_select_tool)
136+ || ( using_path_tool && selected_points. is_empty ( ) )
137+ || selected_layers. is_empty ( )
138+ || matches ! ( self . transform_operation, TransformOperation :: Rotating ( _) )
139+ {
140+ selected. original_transforms . clear ( ) ;
152141 return ;
153142 }
154- let Some ( & layer) = selected_layers. first ( ) else {
155- return ;
156- } ;
157- let Some ( vector_data) = document. network_interface . compute_modified_vector ( layer) else {
158- return ;
159- } ;
160- let points = shape_editor. selected_points ( ) ;
161- let selected_points: Vec < & ManipulatorPointId > = points. collect ( ) ;
162143
163- if using_path_tool && selected_points. is_empty ( ) {
164- responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
165- return ;
166- }
144+ if let Some ( vector_data) = selected_layers. first ( ) . and_then ( |& layer| document. network_interface . compute_modified_vector ( layer) ) {
145+ if selected_points. len ( ) == 1 {
146+ let point = & selected_points[ 0 ] ;
167147
168- if selected_points. len ( ) == 1 {
169- if let Some ( point) = selected_points. first ( ) {
170148 match point {
171149 ManipulatorPointId :: Anchor ( _) => {
172150 if let Some ( [ handle1, handle2] ) = point. get_handle_pair ( & vector_data) {
173- if ( handle1. get_handle_length ( & vector_data) == 0.0 && handle2. get_handle_length ( & vector_data) == 0.0 )
151+ if ( handle1. get_handle_length ( & vector_data) == 0. && handle2. get_handle_length ( & vector_data) == 0. )
174152 || ( handle1. get_handle_length ( & vector_data) == f64:: MAX && handle2. get_handle_length ( & vector_data) == f64:: MAX )
175153 {
176- self . transform_operation = TransformOperation :: None ;
177-
178- responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
179154 return ;
180155 }
181156 }
182157 }
183158 _ => {
184- let handle_position = point. get_position ( & vector_data) ;
185- let anchor_position = point. get_anchor_position ( & vector_data) ;
159+ // TODO: Need to fix handle snap to anchor issue. SEE (https://discord.com/channels/731730685944922173/1217752903209713715).
186160
187- if let ( Some ( handle_pos) , Some ( anchor_pos) ) = ( handle_position, anchor_position) {
188- // Calculate the distance between the handle and anchor
189- let distance = ( handle_pos - anchor_pos) . length ( ) ;
161+ let handle_length = point. as_handle ( ) . and_then ( |handle| Some ( handle. get_handle_length ( & vector_data) ) ) ;
190162
191- // If the distance is zero, return early
192- if distance == 0.0 {
163+ if let Some ( length) = handle_length {
164+ if length == 0. {
165+ selected. original_transforms . clear ( ) ;
193166 return ;
194167 }
195168 }
196169 }
197170 }
198171 }
199- }
200-
201- if let TransformOperation :: Rotating ( _) = self . transform_operation {
202- return ;
203- }
204-
205- // Don't allow rotate with no selected layers
206- if selected_layers. is_empty ( ) {
172+ } else {
173+ selected. original_transforms . clear ( ) ;
207174 return ;
208175 }
209176
@@ -214,45 +181,47 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
214181 selected. original_transforms . clear ( ) ;
215182 }
216183 TransformLayerMessage :: BeginScale => {
217- if !( using_path_tool || using_select_tool) {
184+ let selected_points: Vec < & ManipulatorPointId > = shape_editor. selected_points ( ) . collect ( ) ;
185+
186+ if ( using_path_tool && selected_points. is_empty ( ) )
187+ || !( using_path_tool || using_select_tool)
188+ || matches ! ( self . transform_operation, TransformOperation :: Scaling ( _) )
189+ || selected_layers. is_empty ( )
190+ {
191+ selected. original_transforms . clear ( ) ;
218192 return ;
219193 }
220- let Some ( & layer) = selected_layers. first ( ) else {
221- return ;
222- } ;
223- let Some ( vector_data) = document. network_interface . compute_modified_vector ( layer) else {
224- return ;
225- } ;
226194
227- let points = shape_editor. selected_points ( ) ;
228- let selected_points: Vec < & ManipulatorPointId > = points. collect ( ) ;
195+ if let Some ( vector_data) = selected_layers. first ( ) . and_then ( |& layer| document. network_interface . compute_modified_vector ( layer) ) {
196+ if selected_points. len ( ) == 1 {
197+ let point = & selected_points[ 0 ] ;
229198
230- if using_path_tool && selected_points. is_empty ( ) {
231- responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
232- return ;
233- }
199+ match point {
200+ ManipulatorPointId :: Anchor ( _) => {
201+ if let Some ( [ handle1, handle2] ) = point. get_handle_pair ( & vector_data) {
202+ let handle1_length = handle1. get_handle_length ( & vector_data) ;
203+ let handle2_length = handle2. get_handle_length ( & vector_data) ;
234204
235- if selected_points. len ( ) == 1 {
236- if let Some ( point) = selected_points. first ( ) {
237- if let ManipulatorPointId :: Anchor ( _) = point {
238- if let Some ( [ handle1, handle2] ) = point. get_handle_pair ( & vector_data) {
239- if ( handle1. get_handle_length ( & vector_data) == 0.0 && handle2. get_handle_length ( & vector_data) == 0.0 )
240- || ( handle1. get_handle_length ( & vector_data) == f64:: MAX && handle2. get_handle_length ( & vector_data) == f64:: MAX )
241- {
242- responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
243- return ;
205+ if ( handle1_length == 0. && handle2_length == 0. ) || ( handle1_length == f64:: MAX && handle2_length == f64:: MAX ) {
206+ selected. original_transforms . clear ( ) ;
207+ return ;
208+ }
209+ }
210+ }
211+ _ => {
212+ let handle_length = point. as_handle ( ) . and_then ( |handle| Some ( handle. get_handle_length ( & vector_data) ) ) ;
213+
214+ if let Some ( length) = handle_length {
215+ if length == 0. {
216+ selected. original_transforms . clear ( ) ;
217+ return ;
218+ }
244219 }
245220 }
246221 }
247222 }
248- }
249-
250- if let TransformOperation :: Scaling ( _) = self . transform_operation {
251- return ;
252- }
253-
254- // Don't allow scale with no selected layers
255- if selected_layers. is_empty ( ) {
223+ } else {
224+ selected. original_transforms . clear ( ) ;
256225 return ;
257226 }
258227
0 commit comments