@@ -42,73 +42,70 @@ impl Resize {
42
42
self . layer . take ( ) ;
43
43
return None ;
44
44
}
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 ) )
46
46
}
47
47
48
48
/// Compute the drag start and end based on the current mouse position. Ignores the state of the layer.
49
49
/// 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 ) ;
52
52
let mouse = input. mouse . position ;
53
53
let document_to_viewport = document. navigation_handler . calculate_offset_transform ( input. viewport_bounds . center ( ) , & document. document_ptz ) ;
54
54
let 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] ;
57
56
let ignore = if let Some ( layer) = self . layer { vec ! [ layer] } else { vec ! [ ] } ;
58
57
let ratio = input. keyboard . get ( lock_ratio as usize ) ;
59
58
let center = input. keyboard . get ( center as usize ) ;
60
-
61
59
let snap_data = SnapData :: ignore ( document, input, & ignore) ;
62
60
let config = SnapTypeConfiguration :: default ( ) ;
63
61
if 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 ] ) ;
68
69
let constraint = SnapConstraint :: Line {
69
70
origin : self . drag_start ,
70
- direction : end - self . drag_start ,
71
+ direction : end_document - self . drag_start ,
71
72
} ;
72
73
if 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 ) ;
75
76
let snapped_far = self . snap_manager . constrained_snap ( & snap_data, & far, constraint, config) ;
76
77
let 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 ) ;
79
80
self . snap_manager . update_indicator ( best) ;
80
81
} 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 ) ;
83
84
self . snap_manager . update_indicator ( snapped) ;
84
85
}
85
86
} else if center {
86
87
let snapped = self . snap_manager . free_snap ( & snap_data, & SnapCandidatePoint :: handle ( document_mouse) , config) ;
87
88
let opposite = 2. * self . drag_start - document_mouse;
88
89
let snapped_far = self . snap_manager . free_snap ( & snap_data, & SnapCandidatePoint :: handle ( opposite) , config) ;
89
90
let 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 ) ;
92
93
self . snap_manager . update_indicator ( best) ;
93
94
} else {
94
95
let 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 ) ;
96
97
self . snap_manager . update_indicator ( snapped) ;
97
98
}
98
99
99
- document_points
100
+ points_viewport
100
101
}
101
102
102
103
pub 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) ?;
108
105
Some (
109
106
GraphOperationMessage :: TransformSet {
110
107
layer : 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 ] ) ,
112
109
transform_in : TransformIn :: Viewport ,
113
110
skip_rerender,
114
111
}
0 commit comments