@@ -167,15 +167,9 @@ impl Fsm for SelectToolFsmState {
167
167
let mut buffer = Vec :: new ( ) ;
168
168
let mut selected: Vec < _ > = document. selected_layers ( ) . map ( |path| path. to_vec ( ) ) . collect ( ) ;
169
169
let quad = data. selection_quad ( ) ;
170
- let intersection = document. graphene_document . intersects_quad_root ( quad) ;
171
- // If no layer is currently selected and the user clicks on a shape, select that.
172
- if selected. is_empty ( ) {
173
- if let Some ( layer) = intersection. last ( ) {
174
- selected. push ( layer. clone ( ) ) ;
175
- buffer. push ( DocumentMessage :: SetSelectedLayers ( selected. clone ( ) ) . into ( ) ) ;
176
- }
177
- }
170
+ let mut intersection = document. graphene_document . intersects_quad_root ( quad) ;
178
171
// If the user clicks on a layer that is in their current selection, go into the dragging mode.
172
+ // If the user clicks on new shape, make that layer their new selection.
179
173
// Otherwise enter the box select mode
180
174
let state = if selected. iter ( ) . any ( |path| intersection. contains ( path) ) {
181
175
buffer. push ( DocumentMessage :: StartTransaction . into ( ) ) ;
@@ -184,9 +178,19 @@ impl Fsm for SelectToolFsmState {
184
178
} else {
185
179
if !input. keyboard . get ( add_to_selection as usize ) {
186
180
buffer. push ( DocumentMessage :: DeselectAllLayers . into ( ) ) ;
181
+ data. layers_dragging . clear ( ) ;
182
+ }
183
+
184
+ if let Some ( intersection) = intersection. pop ( ) {
185
+ selected = vec ! [ intersection] ;
186
+ buffer. push ( DocumentMessage :: AddSelectedLayers ( selected. clone ( ) ) . into ( ) ) ;
187
+ buffer. push ( DocumentMessage :: StartTransaction . into ( ) ) ;
188
+ data. layers_dragging . append ( & mut selected) ;
189
+ Dragging
190
+ } else {
191
+ data. drag_box_id = Some ( add_bounding_box ( & mut buffer) ) ;
192
+ DrawingBox
187
193
}
188
- data. drag_box_id = Some ( add_bounding_box ( & mut buffer) ) ;
189
- DrawingBox
190
194
} ;
191
195
buffer. into_iter ( ) . rev ( ) . for_each ( |message| responses. push_front ( message) ) ;
192
196
0 commit comments