@@ -93,7 +93,7 @@ impl Fsm for SelectToolFsmState {
9393 self ,
9494 event : ToolMessage ,
9595 document : & DocumentMessageHandler ,
96- tool_data : & DocumentToolData ,
96+ _tool_data : & DocumentToolData ,
9797 data : & mut Self :: ToolData ,
9898 input : & InputPreprocessor ,
9999 responses : & mut VecDeque < Message > ,
@@ -108,14 +108,19 @@ impl Fsm for SelectToolFsmState {
108108 let mut selected: Vec < _ > = document. selected_layers ( ) . cloned ( ) . collect ( ) ;
109109 let quad = data. selection_quad ( ) ;
110110 let intersection = document. document . intersects_quad_root ( quad) ;
111+ // If no layer is currently selected and the user clicks on a shape, select that.
111112 if selected. is_empty ( ) {
112113 if let Some ( layer) = intersection. last ( ) {
113114 selected. push ( layer. clone ( ) ) ;
114115 responses. push_back ( DocumentMessage :: SelectLayers ( selected. clone ( ) ) . into ( ) ) ;
115116 }
116117 }
117- if !selected. iter ( ) . any ( |path| intersection. contains ( path) ) {
118- log:: debug!( "drawing stuff" ) ;
118+ // If the user clicks on a layer that is in their current selection, go into the dragging mode.
119+ // Otherwise enter the box select mode
120+ if selected. iter ( ) . any ( |path| intersection. contains ( path) ) {
121+ data. layers_dragging = selected;
122+ Dragging
123+ } else {
119124 responses. push_back ( DocumentMessage :: DeselectAllLayers . into ( ) ) ;
120125 data. box_id = Some ( vec ! [ generate_hash( & * responses, input, document. document. hash( ) ) ] ) ;
121126 responses. push_back (
@@ -127,14 +132,9 @@ impl Fsm for SelectToolFsmState {
127132 . into ( ) ,
128133 ) ;
129134 DrawingBox
130- } else {
131- data. layers_dragging = selected;
132- log:: debug!( "dragging stuff around: {:?}" , data. layers_dragging) ;
133- Dragging
134135 }
135136 }
136137 ( Dragging , MouseMove ) => {
137- log:: debug!( "dragging delta: {:?}" , input. mouse. position. as_f64( ) - data. drag_current. as_f64( ) ) ;
138138 for path in data. layers_dragging . iter ( ) {
139139 responses. push_back (
140140 Operation :: TransformLayerInViewport {
@@ -152,7 +152,6 @@ impl Fsm for SelectToolFsmState {
152152 let start = data. drag_start . as_f64 ( ) ;
153153 let size = data. drag_current . as_f64 ( ) - start;
154154
155- log:: debug!( "changing transform {:?} {:?} {:?}" , data. box_id, start, size) ;
156155 responses. push_back (
157156 Operation :: SetLayerTransformInViewport {
158157 path : data. box_id . clone ( ) . unwrap ( ) ,
@@ -173,97 +172,6 @@ impl Fsm for SelectToolFsmState {
173172 responses. push_back ( Operation :: DeleteLayer { path : data. box_id . take ( ) . unwrap ( ) } . into ( ) ) ;
174173 Ready
175174 }
176- /*
177- let (point_1, point_2) = {
178- let (x, y) = (data.drag_start.x as f64, data.drag_start.y as f64);
179- (
180- DVec2::new(x - SELECTION_TOLERANCE, y - SELECTION_TOLERANCE),
181- DVec2::new(x + SELECTION_TOLERANCE, y + SELECTION_TOLERANCE),
182- )
183- };
184-
185- let quad = [
186- DVec2::new(point_1.x, point_1.y),
187- DVec2::new(point_2.x, point_1.y),
188- DVec2::new(point_2.x, point_2.y),
189- DVec2::new(point_1.x, point_2.y),
190- ];
191-
192- if let Some(intersection) = document.document.intersects_quad_root(quad).last() {
193- // TODO: Replace root transformations with functions of the transform api
194- let transformed_start = document.document.root.transform.inverse().transform_vector2(data.drag_start.as_f64());
195- if document.layer_data.get(intersection).map_or(false, |layer_data| layer_data.selected) {
196- data.layers_dragging = document
197- .layer_data
198- .iter()
199- .filter_map(|(path, layer_data)| {
200- layer_data
201- .selected
202- .then(|| document.document.layer(path).ok().map(|layer| (path.clone(), layer.transform.translation - transformed_start)))
203- .flatten()
204- })
205- .collect();
206- } else {
207- responses.push_back(DocumentMessage::SelectLayers(vec![intersection.clone()]).into());
208- data.layers_dragging = vec![(intersection.clone(), document.document.layer(intersection).unwrap().transform.translation - transformed_start)]
209- }
210- } else {
211- responses.push_back(DocumentMessage::StartTransaction.into());
212- data.layers_dragging = Vec::new();
213- }
214-
215- Dragging
216- }
217- (Dragging, MouseMove) => {
218- data.drag_current = input.mouse.position;
219-
220- if data.layers_dragging.is_empty() {
221- responses.push_back(DocumentMessage::RollbackTransaction.into());
222- responses.push_back(make_operation(data, tool_data, transform));
223- } else {
224- for (path, offset) in &data.layers_dragging {
225- responses.push_back(DocumentMessage::DragLayer(path.clone(), *offset).into());
226- }
227- }
228-
229- Dragging
230- }
231- (Dragging, DragStop) => {
232- data.drag_current = input.mouse.position;
233-
234- if data.layers_dragging.is_empty() {
235- responses.push_back(DocumentMessage::RollbackTransaction.into());
236- responses.push_back(DocumentMessage::AbortTransaction.into());
237-
238- if data.drag_start == data.drag_current {
239- responses.push_back(DocumentMessage::SelectLayers(vec![]).into());
240- } else {
241- let (point_1, point_2) = (
242- DVec2::new(data.drag_start.x as f64, data.drag_start.y as f64),
243- DVec2::new(data.drag_current.x as f64, data.drag_current.y as f64),
244- );
245-
246- let quad = [
247- DVec2::new(point_1.x, point_1.y),
248- DVec2::new(point_2.x, point_1.y),
249- DVec2::new(point_2.x, point_2.y),
250- DVec2::new(point_1.x, point_2.y),
251- ];
252-
253- responses.push_back(DocumentMessage::SelectLayers(document.document.intersects_quad_root(quad)).into());
254- }
255- } else {
256- data.layers_dragging = Vec::new();
257- }
258-
259- Ready
260- }
261- (Dragging, Abort) => {
262- responses.push_back(DocumentMessage::AbortTransaction.into());
263- data.layers_dragging = Vec::new();
264-
265- Ready
266- }
267175 ( _, Align ( axis, aggregate) ) => {
268176 responses. push_back ( DocumentMessage :: AlignSelectedLayers ( axis, aggregate) . into ( ) ) ;
269177
@@ -278,26 +186,11 @@ impl Fsm for SelectToolFsmState {
278186 responses. push_back ( DocumentMessage :: FlipSelectedLayers ( FlipAxis :: Y ) . into ( ) ) ;
279187
280188 self
281- }*/
189+ }
282190 _ => self ,
283191 }
284192 } else {
285193 self
286194 }
287195 }
288196}
289-
290- fn make_operation ( data : & SelectToolData , _tool_data : & DocumentToolData , transform : DAffine2 ) -> Message {
291- let x0 = data. drag_start . x as f64 ;
292- let y0 = data. drag_start . y as f64 ;
293- let x1 = data. drag_current . x as f64 ;
294- let y1 = data. drag_current . y as f64 ;
295-
296- Operation :: AddRect {
297- path : vec ! [ ] ,
298- insert_index : -1 ,
299- transform : ( transform. inverse ( ) * glam:: DAffine2 :: from_scale_angle_translation ( DVec2 :: new ( x1 - x0, y1 - y0) , 0. , DVec2 :: new ( x0, y0) ) ) . to_cols_array ( ) ,
300- style : style:: PathStyle :: new ( Some ( Stroke :: new ( Color :: from_rgb8 ( 0x31 , 0x94 , 0xD6 ) , 2.0 ) ) , Some ( Fill :: none ( ) ) ) ,
301- }
302- . into ( )
303- }
0 commit comments