@@ -6,7 +6,7 @@ use crate::messages::input_mapper::utility_types::input_mouse::ViewportPosition;
6
6
use crate :: messages:: portfolio:: document:: graph_operation:: utility_types:: TransformIn ;
7
7
use crate :: messages:: portfolio:: document:: overlays:: utility_types:: OverlayContext ;
8
8
use crate :: messages:: portfolio:: document:: utility_types:: document_metadata:: { DocumentMetadata , LayerNodeIdentifier } ;
9
- use crate :: messages:: portfolio:: document:: utility_types:: network_interface:: NodeNetworkInterface ;
9
+ use crate :: messages:: portfolio:: document:: utility_types:: network_interface:: { NodeNetworkInterface , ShallowestSelectionIter } ;
10
10
use crate :: messages:: preferences:: SelectionMode ;
11
11
use crate :: messages:: tool:: common_functionality:: auto_panning:: AutoPanning ;
12
12
use crate :: messages:: tool:: common_functionality:: compass_rose:: { Axis , CompassRose } ;
@@ -25,8 +25,10 @@ use graphene_std::renderer::Quad;
25
25
use graphene_std:: renderer:: Rect ;
26
26
use graphene_std:: transform:: ReferencePoint ;
27
27
28
+ mod drag_state;
28
29
mod duplicate;
29
30
pub mod options;
31
+ use drag_state:: * ;
30
32
31
33
#[ derive( Default , ExtractField ) ]
32
34
pub struct SelectTool {
@@ -162,85 +164,6 @@ impl Default for SelectToolFsmState {
162
164
}
163
165
}
164
166
165
- /// Represents the current drag in progress
166
- #[ derive( Clone , Debug , Default ) ]
167
- struct DragState {
168
- pub start_document : DVec2 ,
169
- pub current_document : DVec2 ,
170
- /// Selection mode is set when the drag exceeds a certain distance. Once resolved, the selection mode cannot change.
171
- resolved_selection_mode : Option < SelectionMode > ,
172
- }
173
-
174
- impl DragState {
175
- pub fn new ( input : & InputPreprocessorMessageHandler , metadata : & DocumentMetadata ) -> Self {
176
- let document_mouse = metadata. document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ;
177
- Self {
178
- start_document : document_mouse,
179
- current_document : document_mouse,
180
- resolved_selection_mode : None ,
181
- }
182
- }
183
- pub fn set_current ( & mut self , input : & InputPreprocessorMessageHandler , metadata : & DocumentMetadata ) {
184
- self . current_document = metadata. document_to_viewport . inverse ( ) . transform_point2 ( input. mouse . position ) ;
185
- }
186
-
187
- pub fn start_viewport ( & self , metadata : & DocumentMetadata ) -> DVec2 {
188
- metadata. document_to_viewport . transform_point2 ( self . start_document )
189
- }
190
-
191
- pub fn current_viewport ( & self , metadata : & DocumentMetadata ) -> DVec2 {
192
- metadata. document_to_viewport . transform_point2 ( self . current_document )
193
- }
194
-
195
- pub fn start_current_viewport ( & self , metadata : & DocumentMetadata ) -> [ DVec2 ; 2 ] {
196
- [ self . start_viewport ( metadata) , self . current_viewport ( metadata) ]
197
- }
198
-
199
- pub fn total_drag_delta_document ( & self ) -> DVec2 {
200
- self . current_document - self . start_document
201
- }
202
-
203
- pub fn total_drag_delta_viewport ( & self , metadata : & DocumentMetadata ) -> DVec2 {
204
- metadata. document_to_viewport . transform_vector2 ( self . total_drag_delta_document ( ) )
205
- }
206
-
207
- pub fn inverse_drag_delta_viewport ( & self , metadata : & DocumentMetadata ) -> DVec2 {
208
- -self . total_drag_delta_viewport ( metadata)
209
- }
210
-
211
- fn update_selection_mode ( & mut self , metadata : & DocumentMetadata , preferences : & PreferencesMessageHandler ) -> SelectionMode {
212
- if let Some ( resolved_selection_mode) = self . resolved_selection_mode {
213
- return resolved_selection_mode;
214
- }
215
- if preferences. get_selection_mode ( ) != SelectionMode :: Directional {
216
- self . resolved_selection_mode = Some ( preferences. get_selection_mode ( ) ) ;
217
- return preferences. get_selection_mode ( ) ;
218
- }
219
-
220
- let [ start, current] = self . start_current_viewport ( metadata) ;
221
-
222
- // Drag direction cannot be resolved TODO: why not consider only X distance?
223
- if start. distance_squared ( current) >= DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD . powi ( 2 ) {
224
- let selection_mode = if current. x < start. x { SelectionMode :: Touched } else { SelectionMode :: Enclosed } ;
225
- self . resolved_selection_mode = Some ( selection_mode) ;
226
- return selection_mode;
227
- }
228
-
229
- SelectionMode :: default ( )
230
- }
231
-
232
- /// A viewport quad representing the drag bounds. Expanded if the start == end
233
- pub fn expanded_selection_box_viewport ( & self , metadata : & DocumentMetadata ) -> [ DVec2 ; 2 ] {
234
- let [ start, current] = self . start_current_viewport ( metadata) ;
235
- if start == current {
236
- let tolerance = DVec2 :: splat ( SELECTION_TOLERANCE ) ;
237
- [ current - tolerance, current + tolerance]
238
- } else {
239
- [ start, current]
240
- }
241
- }
242
- }
243
-
244
167
#[ derive( Clone , Debug , Default ) ]
245
168
struct SelectToolData {
246
169
drag : DragState ,
@@ -879,6 +802,7 @@ impl Fsm for SelectToolFsmState {
879
802
880
803
let snap_data = SnapData :: ignore ( document, input, ignore) ;
881
804
let [ start, current] = tool_data. drag . start_current_viewport ( document. metadata ( ) ) ;
805
+
882
806
let e0 = tool_data
883
807
. bounding_box_manager
884
808
. as_ref ( )
@@ -893,17 +817,16 @@ impl Fsm for SelectToolFsmState {
893
817
} ;
894
818
895
819
// TODO: Cache the result of `shallowest_unique_layers` to avoid this heavy computation every frame of movement, see https://github.com/GraphiteEditor/Graphite/pull/481
896
- for layer in document. network_interface . shallowest_unique_layers ( & [ ] ) {
820
+ for layer in ShallowestSelectionIter :: new ( document. metadata ( ) , & tool_data . layers_dragging ) {
897
821
responses. add_front ( GraphOperationMessage :: TransformChange {
898
822
layer,
899
823
transform : DAffine2 :: from_translation ( mouse_delta) ,
900
824
transform_in : TransformIn :: Viewport ,
901
825
skip_rerender : false ,
902
826
} ) ;
903
827
}
904
- tool_data. drag . current_document += document. metadata ( ) . document_to_viewport . inverse ( ) . transform_vector2 ( mouse_delta) ;
905
828
906
- info ! ( "current {} mouse {}" , tool_data. drag. current_viewport ( document. metadata( ) ) , input . mouse . position ) ;
829
+ tool_data. drag . offset_viewport ( mouse_delta , document. metadata ( ) ) ;
907
830
908
831
// Auto-panning
909
832
let messages = [
0 commit comments