From f128434e5024757a585a49e7bc63b23c98898bed Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Wed, 2 Mar 2022 21:55:32 -0800 Subject: [PATCH] Add "New Folder"/"Delete Selected" buttons to layer panel Closes #532 --- .../src/document/document_message_handler.rs | 2 ++ editor/src/input/input_mapper.rs | 25 ++++++++--------- frontend/assets/16px-solid/new-layer.svg | 4 +++ frontend/assets/16px-solid/trash.svg | 7 +++++ frontend/src/components/panels/Document.vue | 1 + frontend/src/components/panels/LayerTree.vue | 28 +++++++++++++++++++ frontend/src/utilities/icons.ts | 4 +++ frontend/wasm/src/api.rs | 12 ++++++-- 8 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 frontend/assets/16px-solid/new-layer.svg create mode 100644 frontend/assets/16px-solid/trash.svg diff --git a/editor/src/document/document_message_handler.rs b/editor/src/document/document_message_handler.rs index 1d5598b1..19025502 100644 --- a/editor/src/document/document_message_handler.rs +++ b/editor/src/document/document_message_handler.rs @@ -750,6 +750,7 @@ impl MessageHandler for Docum CreateEmptyFolder { mut container_path } => { let id = generate_uuid(); container_path.push(id); + responses.push_back(DocumentMessage::DeselectAllLayers.into()); responses.push_back(DocumentOperation::CreateFolder { path: container_path.clone() }.into()); responses.push_back( DocumentMessage::SetLayerExpansion { @@ -1251,6 +1252,7 @@ impl MessageHandler for Docum SetSnapping, DebugPrintDocument, ZoomCanvasToFitAll, + CreateEmptyFolder, ); if self.layer_metadata.values().any(|data| data.selected) { diff --git a/editor/src/input/input_mapper.rs b/editor/src/input/input_mapper.rs index 57126d77..99a74ae6 100644 --- a/editor/src/input/input_mapper.rs +++ b/editor/src/input/input_mapper.rs @@ -28,7 +28,6 @@ impl Default for Mapping { let mappings = mapping![ // Higher priority than entries in sections below - entry! {action=PortfolioMessage::Paste { clipboard: Clipboard::User }, key_down=KeyV, modifiers=[KeyControl]}, entry! {action=MovementMessage::PointerMove { snap_angle: KeyControl, wait_for_snap_angle_release: true, snap_zoom: KeyControl, zoom_from_viewport: None }, message=InputMapperMessage::PointerMove}, // Transform layers entry! {action=TransformLayerMessage::ApplyTransformOperation, key_down=KeyEnter}, @@ -142,15 +141,13 @@ impl Default for Mapping { // Colors entry! {action=ToolMessage::ResetColors, key_down=KeyX, modifiers=[KeyShift, KeyControl]}, entry! {action=ToolMessage::SwapColors, key_down=KeyX, modifiers=[KeyShift]}, - // Editor Actions + // Editor actions entry! {action=FrontendMessage::TriggerFileUpload, key_down=KeyO, modifiers=[KeyControl]}, - // Document Actions - entry! {action=PortfolioMessage::Paste { clipboard: Clipboard::User }, key_down=KeyV, modifiers=[KeyControl]}, + // Document actions entry! {action=DocumentMessage::Redo, key_down=KeyZ, modifiers=[KeyControl, KeyShift]}, entry! {action=DocumentMessage::Undo, key_down=KeyZ, modifiers=[KeyControl]}, entry! {action=DocumentMessage::DeselectAllLayers, key_down=KeyA, modifiers=[KeyControl, KeyAlt]}, entry! {action=DocumentMessage::SelectAllLayers, key_down=KeyA, modifiers=[KeyControl]}, - entry! {action=DocumentMessage::CreateEmptyFolder { container_path: vec![] }, key_down=KeyN, modifiers=[KeyControl, KeyShift]}, entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyDelete}, entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyBackspace}, entry! {action=DocumentMessage::ExportDocument, key_down=KeyE, modifiers=[KeyControl]}, @@ -158,11 +155,15 @@ impl Default for Mapping { entry! {action=DocumentMessage::SaveDocument, key_down=KeyS, modifiers=[KeyControl, KeyShift]}, entry! {action=DocumentMessage::DebugPrintDocument, key_down=Key9}, entry! {action=DocumentMessage::ZoomCanvasToFitAll, key_down=Key0, modifiers=[KeyControl]}, - // Initiate Transform Layers + entry! {action=DocumentMessage::DuplicateSelectedLayers, key_down=KeyD, modifiers=[KeyControl]}, + entry! {action=DocumentMessage::GroupSelectedLayers, key_down=KeyG, modifiers=[KeyControl]}, + entry! {action=DocumentMessage::UngroupSelectedLayers, key_down=KeyG, modifiers=[KeyControl, KeyShift]}, + entry! {action=DocumentMessage::CreateEmptyFolder { container_path: vec![] }, key_down=KeyN, modifiers=[KeyControl, KeyShift]}, + // Layer transformation entry! {action=TransformLayerMessage::BeginGrab, key_down=KeyG}, entry! {action=TransformLayerMessage::BeginRotate, key_down=KeyR}, entry! {action=TransformLayerMessage::BeginScale, key_down=KeyS}, - // Document movement + // Movement actions entry! {action=MovementMessage::RotateCanvasBegin, key_down=Mmb, modifiers=[KeyControl]}, entry! {action=MovementMessage::ZoomCanvasBegin, key_down=Mmb, modifiers=[KeyShift]}, entry! {action=MovementMessage::TranslateCanvasBegin, key_down=Mmb}, @@ -181,17 +182,15 @@ impl Default for Mapping { entry! {action=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(-1., 0.) }, key_down=KeyPageDown, modifiers=[KeyShift]}, entry! {action=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., 1.) }, key_down=KeyPageUp}, entry! {action=MovementMessage::TranslateCanvasByViewportFraction { delta: DVec2::new(0., -1.) }, key_down=KeyPageDown}, - // Document actions + // Portfolio actions entry! {action=PortfolioMessage::NewDocument, key_down=KeyN, modifiers=[KeyControl]}, entry! {action=PortfolioMessage::NextDocument, key_down=KeyTab, modifiers=[KeyControl]}, entry! {action=PortfolioMessage::PrevDocument, key_down=KeyTab, modifiers=[KeyControl, KeyShift]}, entry! {action=PortfolioMessage::CloseAllDocumentsWithConfirmation, key_down=KeyW, modifiers=[KeyControl, KeyAlt]}, entry! {action=PortfolioMessage::CloseActiveDocumentWithConfirmation, key_down=KeyW, modifiers=[KeyControl]}, - entry! {action=DocumentMessage::DuplicateSelectedLayers, key_down=KeyD, modifiers=[KeyControl]}, + entry! {action=PortfolioMessage::Paste { clipboard: Clipboard::User }, key_down=KeyV, modifiers=[KeyControl]}, entry! {action=PortfolioMessage::Copy { clipboard: Clipboard::User }, key_down=KeyC, modifiers=[KeyControl]}, entry! {action=PortfolioMessage::Cut { clipboard: Clipboard::User }, key_down=KeyX, modifiers=[KeyControl]}, - entry! {action=DocumentMessage::GroupSelectedLayers, key_down=KeyG, modifiers=[KeyControl]}, - entry! {action=DocumentMessage::UngroupSelectedLayers, key_down=KeyG, modifiers=[KeyControl, KeyShift]}, // Nudging entry! {action=DocumentMessage::NudgeSelectedLayers { delta_x: -SHIFT_NUDGE_AMOUNT, delta_y: -SHIFT_NUDGE_AMOUNT }, key_down=KeyArrowUp, modifiers=[KeyShift, KeyArrowLeft]}, entry! {action=DocumentMessage::NudgeSelectedLayers { delta_x: SHIFT_NUDGE_AMOUNT, delta_y: -SHIFT_NUDGE_AMOUNT }, key_down=KeyArrowUp, modifiers=[KeyShift, KeyArrowRight]}, @@ -218,10 +217,10 @@ impl Default for Mapping { entry! {action=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT }, key_down=KeyArrowRight, modifiers=[KeyArrowDown]}, entry! {action=DocumentMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: 0. }, key_down=KeyArrowRight}, // Reorder Layers - entry! {action=DocumentMessage::ReorderSelectedLayers { relative_index_offset: isize::MAX }, key_down=KeyRightCurlyBracket, modifiers=[KeyControl]}, // TODO: Use KeyRightBracket with ctrl+shift modifiers once input system is fixed + entry! {action=DocumentMessage::ReorderSelectedLayers { relative_index_offset: isize::MAX }, key_down=KeyRightCurlyBracket, modifiers=[KeyControl]}, // TODO: Use KeyRightBracket with Ctrl+Shift modifiers once input system is fixed entry! {action=DocumentMessage::ReorderSelectedLayers { relative_index_offset: 1 }, key_down=KeyRightBracket, modifiers=[KeyControl]}, entry! {action=DocumentMessage::ReorderSelectedLayers { relative_index_offset: -1 }, key_down=KeyLeftBracket, modifiers=[KeyControl]}, - entry! {action=DocumentMessage::ReorderSelectedLayers { relative_index_offset: isize::MIN }, key_down=KeyLeftCurlyBracket, modifiers=[KeyControl]}, // TODO: Use KeyLeftBracket with ctrl+shift modifiers once input system is fixed + entry! {action=DocumentMessage::ReorderSelectedLayers { relative_index_offset: isize::MIN }, key_down=KeyLeftCurlyBracket, modifiers=[KeyControl]}, // TODO: Use KeyLeftBracket with Ctrl+Shift modifiers once input system is fixed // Global Actions entry! {action=GlobalMessage::LogInfo, key_down=Key1}, entry! {action=GlobalMessage::LogDebug, key_down=Key2}, diff --git a/frontend/assets/16px-solid/new-layer.svg b/frontend/assets/16px-solid/new-layer.svg new file mode 100644 index 00000000..c7f5b34d --- /dev/null +++ b/frontend/assets/16px-solid/new-layer.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/16px-solid/trash.svg b/frontend/assets/16px-solid/trash.svg new file mode 100644 index 00000000..d05d76b5 --- /dev/null +++ b/frontend/assets/16px-solid/trash.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frontend/src/components/panels/Document.vue b/frontend/src/components/panels/Document.vue index 74eccad8..2befae31 100644 --- a/frontend/src/components/panels/Document.vue +++ b/frontend/src/components/panels/Document.vue @@ -53,6 +53,7 @@ + diff --git a/frontend/src/components/panels/LayerTree.vue b/frontend/src/components/panels/LayerTree.vue index 0cac727f..8f6c6acb 100644 --- a/frontend/src/components/panels/LayerTree.vue +++ b/frontend/src/components/panels/LayerTree.vue @@ -28,6 +28,14 @@

The contents of this popover menu are coming soon

+ + + + + + + + ) { - let message = DocumentMessage::CreateEmptyFolder { container_path }; + /// Creates an empty folder at the document root + pub fn create_empty_folder(&self) { + let message = DocumentMessage::CreateEmptyFolder { container_path: vec![] }; self.dispatch(message); }