Skip to content

Commit a564c4e

Browse files
committed
Add shift modifier for multi selection
1 parent e275336 commit a564c4e

File tree

6 files changed

+36
-26
lines changed

6 files changed

+36
-26
lines changed

editor/src/communication/dispatcher.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ impl Dispatcher {
2929
| Message::Frontend(FrontendMessage::UpdateCanvas { .. })
3030
| Message::Frontend(FrontendMessage::SetCanvasZoom { .. })
3131
| Message::Frontend(FrontendMessage::SetCanvasRotation { .. })
32-
//| Message::Documents(DocumentsMessage::Document(DocumentMessage::DispatchOperation { .. }))
3332
) || MessageDiscriminant::from(&message).local_name().ends_with("MouseMove"))
3433
{
3534
log::trace!("Message: {:?}", message);
@@ -151,7 +150,7 @@ mod test {
151150
let document_before_copy = editor.dispatcher.documents_message_handler.active_document().document.clone();
152151
let shape_id = document_before_copy.root.as_folder().unwrap().layer_ids[1];
153152

154-
editor.handle_message(DocumentMessage::SelectLayers(vec![vec![shape_id]])).unwrap();
153+
editor.handle_message(DocumentMessage::SetSelectedLayers(vec![vec![shape_id]])).unwrap();
155154
editor.handle_message(DocumentsMessage::CopySelectedLayers).unwrap();
156155
editor.handle_message(DocumentsMessage::PasteLayers { path: vec![], insert_index: -1 }).unwrap();
157156

@@ -211,7 +210,7 @@ mod test {
211210
})
212211
.unwrap();
213212

214-
editor.handle_message(DocumentMessage::SelectLayers(vec![vec![folder_id]])).unwrap();
213+
editor.handle_message(DocumentMessage::SetSelectedLayers(vec![vec![folder_id]])).unwrap();
215214

216215
let document_before_copy = editor.dispatcher.documents_message_handler.active_document().document.clone();
217216

@@ -275,7 +274,7 @@ mod test {
275274
let rect_id = document_before_copy.root.as_folder().unwrap().layer_ids[RECT_INDEX];
276275
let ellipse_id = document_before_copy.root.as_folder().unwrap().layer_ids[ELLIPSE_INDEX];
277276

278-
editor.handle_message(DocumentMessage::SelectLayers(vec![vec![rect_id], vec![ellipse_id]])).unwrap();
277+
editor.handle_message(DocumentMessage::SetSelectedLayers(vec![vec![rect_id], vec![ellipse_id]])).unwrap();
279278
editor.handle_message(DocumentsMessage::CopySelectedLayers).unwrap();
280279
editor.handle_message(DocumentMessage::DeleteSelectedLayers).unwrap();
281280
editor.draw_rect(0., 800., 12., 200.);
@@ -309,7 +308,7 @@ mod test {
309308

310309
let verify_order = |handler: &mut DocumentMessageHandler| (handler.all_layers_sorted(), handler.non_selected_layers_sorted(), handler.selected_layers_sorted());
311310

312-
editor.handle_message(DocumentMessage::SelectLayers(vec![vec![0], vec![2]])).unwrap();
311+
editor.handle_message(DocumentMessage::SetSelectedLayers(vec![vec![0], vec![2]])).unwrap();
313312

314313
editor.handle_message(DocumentMessage::ReorderSelectedLayers(1)).unwrap();
315314
let (all, non_selected, selected) = verify_order(&mut editor.dispatcher.documents_message_handler.active_document_mut());

editor/src/document/document_file.rs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ pub enum DocumentMessage {
6666
#[child]
6767
Movement(MovementMessage),
6868
DispatchOperation(Box<DocumentOperation>),
69-
SelectLayers(Vec<Vec<LayerId>>),
69+
SetSelectedLayers(Vec<Vec<LayerId>>),
70+
AddSelectedLayers(Vec<Vec<LayerId>>),
7071
SelectAllLayers,
7172
SelectionChanged,
7273
DeselectAllLayers,
@@ -138,10 +139,7 @@ impl DocumentMessageHandler {
138139
self.layer_data(path).selected = true;
139140
let data = self.layer_panel_entry(path.to_vec()).ok()?;
140141
// TODO: Add deduplication
141-
(!path.is_empty()).then(||FrontendMessage::UpdateLayer {
142-
path: path.to_vec(),
143-
data,
144-
}.into())
142+
(!path.is_empty()).then(|| FrontendMessage::UpdateLayer { path: path.to_vec(), data }.into())
145143
}
146144
pub fn selected_layers_bounding_box(&self) -> Option<[DVec2; 2]> {
147145
let paths = self.selected_layers().map(|vec| &vec[..]);
@@ -365,8 +363,11 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
365363
responses.push_back(DocumentOperation::DuplicateLayer { path }.into())
366364
}
367365
}
368-
SelectLayers(paths) => {
366+
SetSelectedLayers(paths) => {
369367
self.clear_selection();
368+
responses.push_front(AddSelectedLayers(paths).into());
369+
}
370+
AddSelectedLayers(paths) => {
370371
for path in paths {
371372
responses.extend(self.select_layer(&path));
372373
}
@@ -375,11 +376,16 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
375376
responses.push_back(SelectMessage::UpdateSelectionBoundingBox.into());
376377
}
377378
SelectAllLayers => {
378-
let all_layer_paths = self.layer_data.keys().filter(|path| !path.is_empty() && !self.document.layer(path).unwrap().overlay ).cloned().collect::<Vec<_>>();
379-
responses.push_back(SelectLayers(all_layer_paths).into());
379+
let all_layer_paths = self
380+
.layer_data
381+
.keys()
382+
.filter(|path| !path.is_empty() && !self.document.layer(path).unwrap().overlay)
383+
.cloned()
384+
.collect::<Vec<_>>();
385+
responses.push_back(SetSelectedLayers(all_layer_paths).into());
380386
}
381387
DeselectAllLayers => {
382-
responses.push_back(SelectLayers(vec![]).into());
388+
responses.push_back(SetSelectedLayers(vec![]).into());
383389
}
384390
Undo => {
385391
// this is a temporary fix and will be addressed by #123
@@ -408,7 +414,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
408414
}
409415
.into(),
410416
),
411-
DocumentResponse::CreatedLayer { path } => (!self.document.layer(&path).unwrap().overlay).then(|| SelectLayers(vec![path]).into()),
417+
DocumentResponse::CreatedLayer { path } => (!self.document.layer(&path).unwrap().overlay).then(|| SetSelectedLayers(vec![path]).into()),
412418
DocumentResponse::DocumentChanged => unreachable!(),
413419
})
414420
.flatten(),

editor/src/input/input_mapper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ impl Default for Mapping {
129129
entry! {action=MovementMessage::DisableSnapping, key_up=KeyShift},
130130
// Select
131131
entry! {action=SelectMessage::MouseMove, message=InputMapperMessage::PointerMove},
132-
entry! {action=SelectMessage::DragStart, key_down=Lmb},
132+
entry! {action=SelectMessage::DragStart{add_to_selection: KeyShift}, key_down=Lmb},
133133
entry! {action=SelectMessage::DragStop, key_up=Lmb},
134134
entry! {action=SelectMessage::Abort, key_down=Rmb},
135135
entry! {action=SelectMessage::Abort, key_down=KeyEscape},

editor/src/input/keyboard.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::message_prelude::*;
2+
use serde::{Deserialize, Serialize};
23

34
pub const NUMBER_OF_KEYS: usize = Key::NumKeys as usize;
45
// Edit this to specify the storage type used
@@ -12,7 +13,7 @@ const KEY_MASK_STORAGE_LENGTH: usize = (NUMBER_OF_KEYS + STORAGE_SIZE_BITS - 1)
1213
pub type KeyStates = BitVector<KEY_MASK_STORAGE_LENGTH>;
1314

1415
#[impl_message(Message, InputMapperMessage, KeyDown)]
15-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
16+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
1617
pub enum Key {
1718
UnknownKey,
1819
// MouseKeys

editor/src/tool/tools/select.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use graphene::Quad;
88
use glam::{DAffine2, DVec2};
99
use serde::{Deserialize, Serialize};
1010

11+
use crate::input::keyboard::Key;
1112
use crate::input::{mouse::ViewportPosition, InputPreprocessor};
1213
use crate::tool::{DocumentToolData, Fsm, ToolActionHandlerData};
1314
use crate::{
@@ -25,7 +26,7 @@ pub struct Select {
2526
#[impl_message(Message, ToolMessage, Select)]
2627
#[derive(PartialEq, Clone, Debug, Serialize, Deserialize, Hash)]
2728
pub enum SelectMessage {
28-
DragStart,
29+
DragStart { add_to_selection: Key },
2930
DragStop,
3031
MouseMove,
3132
Abort,
@@ -136,7 +137,7 @@ impl Fsm for SelectToolFsmState {
136137
responses.push_back(response);
137138
self
138139
}
139-
(Ready, DragStart) => {
140+
(Ready, DragStart { add_to_selection }) => {
140141
data.drag_start = input.mouse.position;
141142
data.drag_current = input.mouse.position;
142143
let mut selected: Vec<_> = document.selected_layers().cloned().collect();
@@ -146,7 +147,7 @@ impl Fsm for SelectToolFsmState {
146147
if selected.is_empty() {
147148
if let Some(layer) = intersection.last() {
148149
selected.push(layer.clone());
149-
responses.push_back(DocumentMessage::SelectLayers(selected.clone()).into());
150+
responses.push_back(DocumentMessage::SetSelectedLayers(selected.clone()).into());
150151
}
151152
}
152153
// If the user clicks on a layer that is in their current selection, go into the dragging mode.
@@ -155,7 +156,9 @@ impl Fsm for SelectToolFsmState {
155156
data.layers_dragging = selected;
156157
Dragging
157158
} else {
158-
responses.push_back(DocumentMessage::DeselectAllLayers.into());
159+
if !input.keyboard.get(add_to_selection as usize) {
160+
responses.push_back(DocumentMessage::DeselectAllLayers.into());
161+
}
159162
data.drag_box_id = Some(add_boundnig_box(responses));
160163
DrawingBox
161164
}
@@ -176,8 +179,9 @@ impl Fsm for SelectToolFsmState {
176179
}
177180
(DrawingBox, MouseMove) => {
178181
data.drag_current = input.mouse.position;
179-
let start = data.drag_start;
180-
let size = data.drag_current - start;
182+
let half_pixel_offset = DVec2::new(0.5, 0.5);
183+
let start = data.drag_start + half_pixel_offset;
184+
let size = data.drag_current - start + half_pixel_offset;
181185

182186
responses.push_back(
183187
Operation::SetLayerTransformInViewport {
@@ -191,14 +195,14 @@ impl Fsm for SelectToolFsmState {
191195
(Dragging, DragStop) => Ready,
192196
(DrawingBox, DragStop) => {
193197
let quad = data.selection_quad();
194-
responses.push_back(DocumentMessage::SelectLayers(document.document.intersects_quad_root(quad)).into());
198+
responses.push_back(DocumentMessage::AddSelectedLayers(document.document.intersects_quad_root(quad)).into());
195199
responses.push_back(
196200
Operation::DeleteLayer {
197201
path: data.drag_box_id.take().unwrap(),
198202
}
199203
.into(),
200204
);
201-
data.drag_box_id = None;
205+
data.drag_box_id = None;
202206
Ready
203207
}
204208
(_, Abort) => {

frontend/wasm/src/document.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ pub fn set_rotation(new_radians: f64) -> Result<(), JsValue> {
310310
pub fn select_layers(paths: Vec<LayerId>) -> Result<(), JsValue> {
311311
let paths = paths.split(|id| *id == LayerId::MAX).map(|path| path.to_vec()).collect();
312312
EDITOR_STATE
313-
.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::SelectLayers(paths)))
313+
.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::SetSelectedLayers(paths)))
314314
.map_err(convert_error)
315315
}
316316

0 commit comments

Comments
 (0)