@@ -3,7 +3,7 @@ use crate::messages::input_mapper::utility_types::input_mouse::{DocumentPosition
3
3
use crate :: messages:: portfolio:: document:: overlays:: utility_types:: { OverlayProvider , Pivot } ;
4
4
use crate :: messages:: portfolio:: document:: utility_types:: document_metadata:: LayerNodeIdentifier ;
5
5
use crate :: messages:: portfolio:: document:: utility_types:: misc:: PTZ ;
6
- use crate :: messages:: portfolio:: document:: utility_types:: transformation:: { Axis , OriginalTransforms , Selected , TransformOperation , Typing } ;
6
+ use crate :: messages:: portfolio:: document:: utility_types:: transformation:: { Axis , OriginalTransforms , Selected , TransformOperation , TransformType , Typing } ;
7
7
use crate :: messages:: prelude:: * ;
8
8
use crate :: messages:: tool:: common_functionality:: shape_editor:: ShapeState ;
9
9
use crate :: messages:: tool:: tool_messages:: tool_prelude:: Key ;
@@ -12,7 +12,7 @@ use glam::{DAffine2, DVec2};
12
12
use graphene_core:: renderer:: Quad ;
13
13
use graphene_core:: vector:: ManipulatorPointId ;
14
14
use graphene_std:: vector:: { VectorData , VectorModificationType } ;
15
- use std:: f64:: consts:: TAU ;
15
+ use std:: f64:: consts:: { PI , TAU } ;
16
16
17
17
const TRANSFORM_GRS_OVERLAY_PROVIDER : OverlayProvider = |context| TransformLayerMessage :: Overlays ( context) . into ( ) ;
18
18
@@ -107,8 +107,6 @@ fn project_edge_to_quad(edge: DVec2, quad: &Quad, local: bool, axis_constraint:
107
107
}
108
108
109
109
fn update_colinear_handles ( selected_layers : & [ LayerNodeIdentifier ] , document : & DocumentMessageHandler , responses : & mut VecDeque < Message > ) {
110
- use std:: f64:: consts:: PI ;
111
-
112
110
for & layer in selected_layers {
113
111
let Some ( vector_data) = document. network_interface . compute_modified_vector ( layer) else { continue } ;
114
112
@@ -243,23 +241,15 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
243
241
let e1 = ( self . layer_bounding_box . 0 [ 1 ] - self . layer_bounding_box . 0 [ 0 ] ) . normalize_or ( DVec2 :: X ) ;
244
242
245
243
if matches ! ( axis_constraint, Axis :: Both | Axis :: X ) && translation. x != 0. {
246
- let end = if self . local {
247
- ( quad[ 1 ] - quad[ 0 ] ) . length ( ) * e1 * e1. dot ( quad[ 1 ] - quad[ 0 ] ) . signum ( ) + quad[ 0 ]
248
- } else {
249
- quad[ 1 ]
250
- } ;
244
+ let end = if self . local { ( quad[ 1 ] - quad[ 0 ] ) . rotate ( e1) + quad[ 0 ] } else { quad[ 1 ] } ;
251
245
overlay_context. line ( quad[ 0 ] , end, None ) ;
252
246
253
247
let x_transform = DAffine2 :: from_translation ( ( quad[ 0 ] + end) / 2. ) ;
254
248
overlay_context. text ( & format_rounded ( translation. x , 3 ) , COLOR_OVERLAY_BLUE , None , x_transform, 4. , [ Pivot :: Middle , Pivot :: End ] ) ;
255
249
}
256
250
257
251
if matches ! ( axis_constraint, Axis :: Both | Axis :: Y ) && translation. y != 0. {
258
- let end = if self . local {
259
- ( quad[ 3 ] - quad[ 0 ] ) . length ( ) * e1. perp ( ) * e1. perp ( ) . dot ( quad[ 3 ] - quad[ 0 ] ) . signum ( ) + quad[ 0 ]
260
- } else {
261
- quad[ 3 ]
262
- } ;
252
+ let end = if self . local { ( quad[ 3 ] - quad[ 0 ] ) . rotate ( e1) + quad[ 0 ] } else { quad[ 3 ] } ;
263
253
overlay_context. line ( quad[ 0 ] , end, None ) ;
264
254
let x_parameter = viewport_translate. x . clamp ( -1. , 1. ) ;
265
255
let y_transform = DAffine2 :: from_translation ( ( quad[ 0 ] + end) / 2. + x_parameter * DVec2 :: X * 0. ) ;
@@ -325,27 +315,30 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
325
315
}
326
316
327
317
// Messages
328
- TransformLayerMessage :: ApplyTransformOperation => {
318
+ TransformLayerMessage :: ApplyTransformOperation { final_transform } => {
329
319
selected. original_transforms . clear ( ) ;
330
320
self . typing . clear ( ) ;
331
- self . transform_operation = TransformOperation :: None ;
321
+ if final_transform {
322
+ self . transform_operation = TransformOperation :: None ;
323
+ self . operation_count = 0 ;
324
+ }
332
325
333
326
if using_pen_tool {
334
327
self . last_point = DVec2 :: ZERO ;
335
328
self . grs_pen_handle = false ;
336
329
337
330
selected. pen_handle = None ;
338
-
339
331
selected. responses . add ( PenToolMessage :: Confirm ) ;
340
332
} else {
341
333
update_colinear_handles ( & selected_layers, document, responses) ;
342
- self . operation_count = 0 ;
343
334
responses. add ( DocumentMessage :: EndTransaction ) ;
344
335
responses. add ( ToolMessage :: UpdateHints ) ;
345
336
responses. add ( NodeGraphMessage :: RunDocumentGraph ) ;
346
337
}
347
338
348
- responses. add ( OverlaysMessage :: RemoveProvider ( TRANSFORM_GRS_OVERLAY_PROVIDER ) ) ;
339
+ if final_transform {
340
+ responses. add ( OverlaysMessage :: RemoveProvider ( TRANSFORM_GRS_OVERLAY_PROVIDER ) ) ;
341
+ }
349
342
}
350
343
TransformLayerMessage :: BeginGrabPen { last_point, handle } | TransformLayerMessage :: BeginRotatePen { last_point, handle } | TransformLayerMessage :: BeginScalePen { last_point, handle } => {
351
344
self . typing . clear ( ) ;
@@ -381,37 +374,12 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
381
374
increments_key : INCREMENTS_KEY ,
382
375
} ) ;
383
376
}
384
- TransformLayerMessage :: BeginGrab => {
385
- if ( !using_path_tool && !using_select_tool && !using_pen_tool)
386
- || ( using_path_tool && shape_editor. selected_points ( ) . next ( ) . is_none ( ) )
387
- || selected_layers. is_empty ( )
388
- || matches ! ( self . transform_operation, TransformOperation :: Grabbing ( _) )
389
- {
390
- return ;
391
- }
392
-
393
- begin_operation ( self . transform_operation , & mut self . typing , & mut self . mouse_position , & mut self . start_mouse , & mut self . initial_transform ) ;
394
-
395
- self . transform_operation = TransformOperation :: Grabbing ( Default :: default ( ) ) ;
396
- self . local = false ;
397
- self . layer_bounding_box = selected. bounding_box ( ) ;
398
- self . operation_count += 1 ;
399
-
400
- selected. original_transforms . clear ( ) ;
401
-
402
- responses. add ( OverlaysMessage :: AddProvider ( TRANSFORM_GRS_OVERLAY_PROVIDER ) ) ;
403
- responses. add ( TransformLayerMessage :: PointerMove {
404
- slow_key : SLOW_KEY ,
405
- increments_key : INCREMENTS_KEY ,
406
- } ) ;
407
- }
408
- TransformLayerMessage :: BeginRotate => {
377
+ TransformLayerMessage :: BeginGRS { transform_type } => {
409
378
let selected_points: Vec < & ManipulatorPointId > = shape_editor. selected_points ( ) . collect ( ) ;
410
-
411
- if ( !using_path_tool && !using_select_tool && !using_pen_tool)
412
- || ( using_path_tool && selected_points. is_empty ( ) )
379
+ if ( using_path_tool && selected_points. is_empty ( ) )
380
+ || ( !using_path_tool && !using_select_tool && !using_pen_tool)
413
381
|| selected_layers. is_empty ( )
414
- || matches ! ( self . transform_operation, TransformOperation :: Rotating ( _ ) )
382
+ || transform_type . equivalent_to ( self . transform_operation )
415
383
{
416
384
return ;
417
385
}
@@ -428,12 +396,12 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
428
396
let handle2_length = handle2. length ( & vector_data) ;
429
397
430
398
if ( handle1_length == 0. && handle2_length == 0. ) || ( handle1_length == f64:: MAX && handle2_length == f64:: MAX ) {
399
+ selected. original_transforms . clear ( ) ;
431
400
return ;
432
401
}
433
402
}
434
403
} else {
435
- // TODO: Fix handle snap to anchor issue, see <https://discord.com/channels/731730685944922173/1217752903209713715>
436
-
404
+ // TODO: Fix handle snap to anchor issue, see <https://github.com/GraphiteEditor/Graphite/issues/2451>
437
405
let handle_length = point. as_handle ( ) . map ( |handle| handle. length ( & vector_data) ) ;
438
406
439
407
if handle_length == Some ( 0. ) {
@@ -443,74 +411,41 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
443
411
}
444
412
}
445
413
446
- begin_operation ( self . transform_operation , & mut self . typing , & mut self . mouse_position , & mut self . start_mouse , & mut self . initial_transform ) ;
414
+ let chain_operation = self . transform_operation != TransformOperation :: None ;
415
+ if chain_operation {
416
+ responses. add ( TransformLayerMessage :: ApplyTransformOperation { final_transform : false } ) ;
417
+ } else {
418
+ responses. add ( OverlaysMessage :: AddProvider ( TRANSFORM_GRS_OVERLAY_PROVIDER ) ) ;
419
+ }
447
420
448
- self . transform_operation = TransformOperation :: Rotating ( Default :: default ( ) ) ;
421
+ let response = match transform_type {
422
+ TransformType :: Grab => TransformLayerMessage :: BeginGrab ,
423
+ TransformType :: Rotate => TransformLayerMessage :: BeginRotate ,
424
+ TransformType :: Scale => TransformLayerMessage :: BeginScale ,
425
+ } ;
449
426
450
427
self . local = false ;
451
- self . layer_bounding_box = selected. bounding_box ( ) ;
452
428
self . operation_count += 1 ;
453
-
454
- selected. original_transforms . clear ( ) ;
455
-
456
- responses. add ( OverlaysMessage :: AddProvider ( TRANSFORM_GRS_OVERLAY_PROVIDER ) ) ;
429
+ responses. add ( response) ;
457
430
responses. add ( TransformLayerMessage :: PointerMove {
458
431
slow_key : SLOW_KEY ,
459
432
increments_key : INCREMENTS_KEY ,
460
433
} ) ;
461
434
}
435
+ TransformLayerMessage :: BeginGrab => {
436
+ begin_operation ( self . transform_operation , & mut self . typing , & mut self . mouse_position , & mut self . start_mouse , & mut self . initial_transform ) ;
437
+ self . transform_operation = TransformOperation :: Grabbing ( Default :: default ( ) ) ;
438
+ self . layer_bounding_box = selected. bounding_box ( ) ;
439
+ }
440
+ TransformLayerMessage :: BeginRotate => {
441
+ begin_operation ( self . transform_operation , & mut self . typing , & mut self . mouse_position , & mut self . start_mouse , & mut self . initial_transform ) ;
442
+ self . transform_operation = TransformOperation :: Rotating ( Default :: default ( ) ) ;
443
+ self . layer_bounding_box = selected. bounding_box ( ) ;
444
+ }
462
445
TransformLayerMessage :: BeginScale => {
463
- let selected_points: Vec < & ManipulatorPointId > = shape_editor. selected_points ( ) . collect ( ) ;
464
-
465
- if ( using_path_tool && selected_points. is_empty ( ) )
466
- || ( !using_path_tool && !using_select_tool && !using_pen_tool)
467
- || selected_layers. is_empty ( )
468
- || matches ! ( self . transform_operation, TransformOperation :: Scaling ( _) )
469
- {
470
- return ;
471
- }
472
-
473
- let Some ( vector_data) = selected_layers. first ( ) . and_then ( |& layer| document. network_interface . compute_modified_vector ( layer) ) else {
474
- selected. original_transforms . clear ( ) ;
475
- return ;
476
- } ;
477
-
478
- if let [ point] = selected_points. as_slice ( ) {
479
- if matches ! ( point, ManipulatorPointId :: Anchor ( _) ) {
480
- if let Some ( [ handle1, handle2] ) = point. get_handle_pair ( & vector_data) {
481
- let handle1_length = handle1. length ( & vector_data) ;
482
- let handle2_length = handle2. length ( & vector_data) ;
483
-
484
- if ( handle1_length == 0. && handle2_length == 0. ) || ( handle1_length == f64:: MAX && handle2_length == f64:: MAX ) {
485
- selected. original_transforms . clear ( ) ;
486
- return ;
487
- }
488
- }
489
- } else {
490
- let handle_length = point. as_handle ( ) . map ( |handle| handle. length ( & vector_data) ) ;
491
-
492
- if handle_length == Some ( 0. ) {
493
- selected. original_transforms . clear ( ) ;
494
- return ;
495
- }
496
- }
497
- }
498
-
499
446
begin_operation ( self . transform_operation , & mut self . typing , & mut self . mouse_position , & mut self . start_mouse , & mut self . initial_transform ) ;
500
-
501
447
self . transform_operation = TransformOperation :: Scaling ( Default :: default ( ) ) ;
502
-
503
- self . local = false ;
504
448
self . layer_bounding_box = selected. bounding_box ( ) ;
505
- self . operation_count += 1 ;
506
-
507
- selected. original_transforms . clear ( ) ;
508
-
509
- responses. add ( OverlaysMessage :: AddProvider ( TRANSFORM_GRS_OVERLAY_PROVIDER ) ) ;
510
- responses. add ( TransformLayerMessage :: PointerMove {
511
- slow_key : SLOW_KEY ,
512
- increments_key : INCREMENTS_KEY ,
513
- } ) ;
514
449
}
515
450
TransformLayerMessage :: CancelTransformOperation => {
516
451
if using_pen_tool {
@@ -744,9 +679,7 @@ impl MessageHandler<TransformLayerMessage, TransformData<'_>> for TransformLayer
744
679
745
680
fn actions ( & self ) -> ActionList {
746
681
let mut common = actions ! ( TransformLayerMessageDiscriminant ;
747
- BeginGrab ,
748
- BeginScale ,
749
- BeginRotate ,
682
+ BeginGRS ,
750
683
) ;
751
684
752
685
if self . transform_operation != TransformOperation :: None {
0 commit comments