@@ -42,73 +42,70 @@ impl Resize {
4242self . layer . take ( ) ;
4343return None ;
4444}
45- Some ( self . calculate_points_ignore_layer ( document, input, center, lock_ratio) )
45+ Some ( self . calculate_points_ignore_layer ( document, input, center, lock_ratio, false ) )
4646}
4747
4848/// Compute the drag start and end based on the current mouse position. Ignores the state of the layer.
4949/// If you want to only draw whilst a layer exists, use [`Resize::calculate_points`].
50- pub fn calculate_points_ignore_layer ( & mut self , document : & DocumentMessageHandler , input : & InputPreprocessorMessageHandler , center : Key , lock_ratio : Key ) -> [ DVec2 ; 2 ] {
51- let start = self . drag_start ;
50+ pub fn calculate_points_ignore_layer ( & mut self , document : & DocumentMessageHandler , input : & InputPreprocessorMessageHandler , center : Key , lock_ratio : Key , in_document : bool ) -> [ DVec2 ; 2 ] {
51+ let start = self . viewport_drag_start ( document ) ;
5252let mouse = input. mouse . position ;
5353let document_to_viewport = document. navigation_handler . calculate_offset_transform ( input. viewport_bounds . center ( ) , & document. document_ptz ) ;
5454let document_mouse = document_to_viewport. inverse ( ) . transform_point2 ( mouse) ;
55- let mut document_points = [ start, document_mouse] ;
56-
55+ let mut points_viewport = [ start, mouse] ;
5756let ignore = if let Some ( layer) = self . layer { vec ! [ layer] } else { vec ! [ ] } ;
5857let ratio = input. keyboard . get ( lock_ratio as usize ) ;
5958let center = input. keyboard . get ( center as usize ) ;
60-
6159let snap_data = SnapData :: ignore ( document, input, & ignore) ;
6260let config = SnapTypeConfiguration :: default ( ) ;
6361if ratio {
64- let size = document_points[ 1 ] - document_points[ 0 ] ;
65- let size = size. abs ( ) . max ( size. abs ( ) . yx ( ) ) * size. signum ( ) ;
66- document_points[ 1 ] = document_points[ 0 ] + size;
67- let end = document_points[ 1 ] ;
62+ let viewport_size = points_viewport[ 1 ] - points_viewport[ 0 ] ;
63+ let raw_size = if in_document { document_to_viewport. inverse ( ) } else { DAffine2 :: IDENTITY } . transform_vector2 ( viewport_size) ;
64+ let adjusted_size = raw_size. abs ( ) . max ( raw_size. abs ( ) . yx ( ) ) * raw_size. signum ( ) ;
65+ let size = if in_document { document_to_viewport. transform_vector2 ( adjusted_size) } else { adjusted_size } ;
66+ points_viewport[ 1 ] = points_viewport[ 0 ] + size;
67+
68+ let end_document = document_to_viewport. inverse ( ) . transform_point2 ( points_viewport[ 1 ] ) ;
6869let constraint = SnapConstraint :: Line {
6970origin : self . drag_start ,
70- direction : end - self . drag_start ,
71+ direction : end_document - self . drag_start ,
7172} ;
7273if center {
73- let snapped = self . snap_manager . constrained_snap ( & snap_data, & SnapCandidatePoint :: handle ( end ) , constraint, config) ;
74- let far = SnapCandidatePoint :: handle ( 2. * self . drag_start - end ) ;
74+ let snapped = self . snap_manager . constrained_snap ( & snap_data, & SnapCandidatePoint :: handle ( end_document ) , constraint, config) ;
75+ let far = SnapCandidatePoint :: handle ( 2. * self . drag_start - end_document ) ;
7576let snapped_far = self . snap_manager . constrained_snap ( & snap_data, & far, constraint, config) ;
7677let best = if snapped_far. other_snap_better ( & snapped) { snapped } else { snapped_far } ;
77- document_points [ 0 ] = best. snapped_point_document ;
78- document_points [ 1 ] = self . drag_start * 2. - best. snapped_point_document ;
78+ points_viewport [ 0 ] = document_to_viewport . transform_point2 ( best. snapped_point_document ) ;
79+ points_viewport [ 1 ] = document_to_viewport . transform_point2 ( self . drag_start * 2. - best. snapped_point_document ) ;
7980self . snap_manager . update_indicator ( best) ;
8081} else {
81- let snapped = self . snap_manager . constrained_snap ( & snap_data, & SnapCandidatePoint :: handle ( end ) , constraint, config) ;
82- document_points [ 1 ] = snapped. snapped_point_document ;
82+ let snapped = self . snap_manager . constrained_snap ( & snap_data, & SnapCandidatePoint :: handle ( end_document ) , constraint, config) ;
83+ points_viewport [ 1 ] = document_to_viewport . transform_point2 ( snapped. snapped_point_document ) ;
8384self . snap_manager . update_indicator ( snapped) ;
8485}
8586} else if center {
8687let snapped = self . snap_manager . free_snap ( & snap_data, & SnapCandidatePoint :: handle ( document_mouse) , config) ;
8788let opposite = 2. * self . drag_start - document_mouse;
8889let snapped_far = self . snap_manager . free_snap ( & snap_data, & SnapCandidatePoint :: handle ( opposite) , config) ;
8990let best = if snapped_far. other_snap_better ( & snapped) { snapped } else { snapped_far } ;
90- document_points [ 0 ] = best. snapped_point_document ;
91- document_points [ 1 ] = self . drag_start * 2. - best. snapped_point_document ;
91+ points_viewport [ 0 ] = document_to_viewport . transform_point2 ( best. snapped_point_document ) ;
92+ points_viewport [ 1 ] = document_to_viewport . transform_point2 ( self . drag_start * 2. - best. snapped_point_document ) ;
9293self . snap_manager . update_indicator ( best) ;
9394} else {
9495let snapped = self . snap_manager . free_snap ( & snap_data, & SnapCandidatePoint :: handle ( document_mouse) , config) ;
95- document_points [ 1 ] = snapped. snapped_point_document ;
96+ points_viewport [ 1 ] = document_to_viewport . transform_point2 ( snapped. snapped_point_document ) ;
9697self . snap_manager . update_indicator ( snapped) ;
9798}
9899
99- document_points
100+ points_viewport
100101}
101102
102103pub fn calculate_transform ( & mut self , document : & DocumentMessageHandler , input : & InputPreprocessorMessageHandler , center : Key , lock_ratio : Key , skip_rerender : bool ) -> Option < Message > {
103- let viewport_points = self . calculate_points ( document, input, center, lock_ratio) . map ( |points| {
104- let document_to_viewport = document. metadata ( ) . document_to_viewport ;
105- [ document_to_viewport. transform_point2 ( points[ 0 ] ) , document_to_viewport. transform_point2 ( points[ 1 ] ) ]
106- } ) ?;
107-
104+ let points_viewport = self . calculate_points ( document, input, center, lock_ratio) ?;
108105Some (
109106GraphOperationMessage :: TransformSet {
110107layer : self . layer ?,
111- transform : DAffine2 :: from_scale_angle_translation ( viewport_points [ 1 ] - viewport_points [ 0 ] , 0. , viewport_points [ 0 ] ) ,
108+ transform : DAffine2 :: from_scale_angle_translation ( points_viewport [ 1 ] - points_viewport [ 0 ] , 0. , points_viewport [ 0 ] ) ,
112109transform_in : TransformIn :: Viewport ,
113110skip_rerender,
114111}
0 commit comments