@@ -43,6 +43,7 @@ type TransformData<'a> = (&'a DocumentMessageHandler, &'a InputPreprocessorMessa
43
43
impl MessageHandler < TransformLayerMessage , TransformData < ' _ > > for TransformLayerMessageHandler {
44
44
fn process_message ( & mut self , message : TransformLayerMessage , responses : & mut VecDeque < Message > , ( document, input, tool_data, shape_editor) : TransformData ) {
45
45
let using_path_tool = tool_data. active_tool_type == ToolType :: Path ;
46
+ let using_select_tool = tool_data. active_tool_type == ToolType :: Select ;
46
47
47
48
// TODO: Add support for transforming layer not in the document network
48
49
let selected_layers = document
@@ -120,6 +121,17 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
120
121
responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
121
122
}
122
123
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
+
123
135
if let TransformOperation :: Grabbing ( _) = self . transform_operation {
124
136
return ;
125
137
}
@@ -136,6 +148,56 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
136
148
selected. original_transforms . clear ( ) ;
137
149
}
138
150
TransformLayerMessage :: BeginRotate => {
151
+ if !( using_path_tool || using_select_tool) {
152
+ return ;
153
+ }
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
+
163
+ if using_path_tool && selected_points. is_empty ( ) {
164
+ responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
165
+ return ;
166
+ }
167
+
168
+ if selected_points. len ( ) == 1 {
169
+ if let Some ( point) = selected_points. first ( ) {
170
+ match point {
171
+ ManipulatorPointId :: Anchor ( _) => {
172
+ 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 )
174
+ || ( handle1. get_handle_length ( & vector_data) == f64:: MAX && handle2. get_handle_length ( & vector_data) == f64:: MAX )
175
+ {
176
+ self . transform_operation = TransformOperation :: None ;
177
+
178
+ responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
179
+ return ;
180
+ }
181
+ }
182
+ }
183
+ _ => {
184
+ let handle_position = point. get_position ( & vector_data) ;
185
+ let anchor_position = point. get_anchor_position ( & vector_data) ;
186
+
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 ( ) ;
190
+
191
+ // If the distance is zero, return early
192
+ if distance == 0.0 {
193
+ return ;
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+
139
201
if let TransformOperation :: Rotating ( _) = self . transform_operation {
140
202
return ;
141
203
}
@@ -152,6 +214,39 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
152
214
selected. original_transforms . clear ( ) ;
153
215
}
154
216
TransformLayerMessage :: BeginScale => {
217
+ if !( using_path_tool || using_select_tool) {
218
+ return ;
219
+ }
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
+
227
+ let points = shape_editor. selected_points ( ) ;
228
+ let selected_points: Vec < & ManipulatorPointId > = points. collect ( ) ;
229
+
230
+ if using_path_tool && selected_points. is_empty ( ) {
231
+ responses. add ( TransformLayerMessage :: CancelTransformOperation ) ;
232
+ return ;
233
+ }
234
+
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 ;
244
+ }
245
+ }
246
+ }
247
+ }
248
+ }
249
+
155
250
if let TransformOperation :: Scaling ( _) = self . transform_operation {
156
251
return ;
157
252
}
0 commit comments