@@ -76,25 +76,18 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
76
76
let viewspace = document. metadata ( ) . transform_to_viewport ( selected_layers[ 0 ] ) ;
77
77
78
78
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) ) ;
80
80
let points = shape_editor. selected_points ( ) ;
81
81
let selected_points: Vec < & ManipulatorPointId > = points. collect ( ) ;
82
82
83
83
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 ;
95
90
}
96
- } else {
97
- * selected. pivot = selected_points. iter ( ) . filter_map ( |point| get_location ( point) ) . inspect ( |_| point_count += 1 ) . sum :: < DVec2 > ( ) / point_count as f64 ;
98
91
}
99
92
}
100
93
} else {
@@ -121,23 +114,13 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
121
114
responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
122
115
}
123
116
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 ( ) ;
138
123
139
- // Don't allow grab with no selected layers
140
- if selected_layers. is_empty ( ) {
141
124
return ;
142
125
}
143
126
@@ -148,62 +131,46 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
148
131
selected. original_transforms . clear ( ) ;
149
132
}
150
133
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 ( ) ;
152
141
return ;
153
142
}
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 ( ) ;
162
143
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 ] ;
167
147
168
- if selected_points. len ( ) == 1 {
169
- if let Some ( point) = selected_points. first ( ) {
170
148
match point {
171
149
ManipulatorPointId :: Anchor ( _) => {
172
150
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. )
174
152
|| ( handle1. get_handle_length ( & vector_data) == f64:: MAX && handle2. get_handle_length ( & vector_data) == f64:: MAX )
175
153
{
176
- self . transform_operation = TransformOperation :: None ;
177
-
178
- responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
179
154
return ;
180
155
}
181
156
}
182
157
}
183
158
_ => {
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).
186
160
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) ) ) ;
190
162
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 ( ) ;
193
166
return ;
194
167
}
195
168
}
196
169
}
197
170
}
198
171
}
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 ( ) ;
207
174
return ;
208
175
}
209
176
@@ -214,45 +181,47 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
214
181
selected. original_transforms . clear ( ) ;
215
182
}
216
183
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 ( ) ;
218
192
return ;
219
193
}
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
- } ;
226
194
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 ] ;
229
198
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) ;
234
204
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
+ }
244
219
}
245
220
}
246
221
}
247
222
}
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 ( ) ;
256
225
return ;
257
226
}
258
227
0 commit comments