Implement Select All/Deselect All layers (#242)
* Implement select all layers shortcut * Adjust menu entry for Select All Layers * Avoid selecting the root of the document when selecting all layers * Implement deselect all layers * Fix formatting * Add extensions.json so VS Code recommends useful extensions * Add rust-analyzer as the default Rust formatter
This commit is contained in:
parent
29faf704f6
commit
2d2954d045
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"recommendations": ["matklad.rust-analyzer", "dbaeumer.vscode-eslint", "octref.vetur", "formulahendry.auto-close-tag"]
|
||||||
|
}
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
{
|
{
|
||||||
"[rust]": {
|
"[rust]": {
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.formatOnPaste": true
|
"editor.formatOnPaste": true,
|
||||||
|
"editor.defaultFormatter": "matklad.rust-analyzer",
|
||||||
},
|
},
|
||||||
"[typescript, javascript, json, vue]": {
|
"[typescript, javascript, json, vue]": {
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,16 @@ const menuEntries: MenuListEntries = [
|
||||||
ref: undefined,
|
ref: undefined,
|
||||||
children: [[{ label: "Menu not yet populated" }]],
|
children: [[{ label: "Menu not yet populated" }]],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: "Layer",
|
||||||
|
ref: undefined,
|
||||||
|
children: [
|
||||||
|
[
|
||||||
|
{ label: "Select All", shortcut: ["Ctrl", "A"], action: async () => (await wasm).select_all_layers() },
|
||||||
|
{ label: "Deselect All", shortcut: ["Ctrl", "Alt", "A"], action: async () => (await wasm).deselect_all_layers() },
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: "View",
|
label: "View",
|
||||||
ref: undefined,
|
ref: undefined,
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,20 @@ pub fn undo() -> Result<(), JsValue> {
|
||||||
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::Undo)).map_err(convert_error)
|
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::Undo)).map_err(convert_error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Select all layers
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn select_all_layers() -> Result<(), JsValue> {
|
||||||
|
EDITOR_STATE.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::SelectAllLayers)).map_err(convert_error)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Select all layers
|
||||||
|
#[wasm_bindgen]
|
||||||
|
pub fn deselect_all_layers() -> Result<(), JsValue> {
|
||||||
|
EDITOR_STATE
|
||||||
|
.with(|editor| editor.borrow_mut().handle_message(DocumentMessage::DeselectAllLayers))
|
||||||
|
.map_err(convert_error)
|
||||||
|
}
|
||||||
|
|
||||||
/// Export the document
|
/// Export the document
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn export_document() -> Result<(), JsValue> {
|
pub fn export_document() -> Result<(), JsValue> {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@ use std::collections::VecDeque;
|
||||||
pub enum DocumentMessage {
|
pub enum DocumentMessage {
|
||||||
DispatchOperation(DocumentOperation),
|
DispatchOperation(DocumentOperation),
|
||||||
SelectLayers(Vec<Vec<LayerId>>),
|
SelectLayers(Vec<Vec<LayerId>>),
|
||||||
|
SelectAllLayers,
|
||||||
|
DeselectAllLayers,
|
||||||
DeleteLayer(Vec<LayerId>),
|
DeleteLayer(Vec<LayerId>),
|
||||||
DeleteSelectedLayers,
|
DeleteSelectedLayers,
|
||||||
DuplicateSelectedLayers,
|
DuplicateSelectedLayers,
|
||||||
|
|
@ -275,7 +277,6 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
|
||||||
responses.push_back(DocumentOperation::PasteLayer { layer: layer.clone(), path: vec![] }.into())
|
responses.push_back(DocumentOperation::PasteLayer { layer: layer.clone(), path: vec![] }.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SelectLayers(paths) => {
|
SelectLayers(paths) => {
|
||||||
self.clear_selection();
|
self.clear_selection();
|
||||||
for path in paths {
|
for path in paths {
|
||||||
|
|
@ -284,6 +285,17 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
|
||||||
// TODO: Correctly update layer panel in clear_selection instead of here
|
// TODO: Correctly update layer panel in clear_selection instead of here
|
||||||
responses.extend(self.handle_folder_changed(Vec::new()));
|
responses.extend(self.handle_folder_changed(Vec::new()));
|
||||||
}
|
}
|
||||||
|
SelectAllLayers => {
|
||||||
|
let all_layer_paths = self.active_document().layer_data.keys().filter(|path| !path.is_empty()).cloned().collect::<Vec<_>>();
|
||||||
|
for path in all_layer_paths {
|
||||||
|
responses.extend(self.select_layer(&path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DeselectAllLayers => {
|
||||||
|
self.clear_selection();
|
||||||
|
let children = self.active_document_mut().layer_panel(&[]).expect("The provided Path was not valid");
|
||||||
|
responses.push_back(FrontendMessage::ExpandFolder { path: vec![], children }.into());
|
||||||
|
}
|
||||||
Undo => {
|
Undo => {
|
||||||
// this is a temporary fix and will be addressed by #123
|
// this is a temporary fix and will be addressed by #123
|
||||||
if let Some(id) = self.active_document().document.root.as_folder().unwrap().list_layers().last() {
|
if let Some(id) = self.active_document().document.root.as_folder().unwrap().list_layers().last() {
|
||||||
|
|
@ -344,9 +356,9 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
|
||||||
}
|
}
|
||||||
fn actions(&self) -> ActionList {
|
fn actions(&self) -> ActionList {
|
||||||
if self.active_document().layer_data.values().any(|data| data.selected) {
|
if self.active_document().layer_data.values().any(|data| data.selected) {
|
||||||
actions!(DocumentMessageDiscriminant; Undo, DeleteSelectedLayers, DuplicateSelectedLayers, RenderDocument, ExportDocument, NewDocument, CloseActiveDocument, NextDocument, PrevDocument, MouseMove, TranslateUp, TranslateDown, CopySelectedLayers, PasteLayers, )
|
actions!(DocumentMessageDiscriminant; Undo, SelectAllLayers, DeselectAllLayers, DeleteSelectedLayers, DuplicateSelectedLayers, RenderDocument, ExportDocument, NewDocument, CloseActiveDocument, NextDocument, PrevDocument, MouseMove, TranslateUp, TranslateDown, CopySelectedLayers, PasteLayers, )
|
||||||
} else {
|
} else {
|
||||||
actions!(DocumentMessageDiscriminant; Undo, RenderDocument, ExportDocument, NewDocument, CloseActiveDocument, NextDocument, PrevDocument, MouseMove, TranslateUp, TranslateDown, PasteLayers)
|
actions!(DocumentMessageDiscriminant; Undo, SelectAllLayers, DeselectAllLayers, RenderDocument, ExportDocument, NewDocument, CloseActiveDocument, NextDocument, PrevDocument, MouseMove, TranslateUp, TranslateDown, PasteLayers)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,8 @@ impl Default for Mapping {
|
||||||
entry! {action=ToolMessage::SwapColors, key_down=KeyX, modifiers=[KeyShift]},
|
entry! {action=ToolMessage::SwapColors, key_down=KeyX, modifiers=[KeyShift]},
|
||||||
// Document Actions
|
// Document Actions
|
||||||
entry! {action=DocumentMessage::Undo, key_down=KeyZ, modifiers=[KeyControl]},
|
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::DeleteSelectedLayers, key_down=KeyDelete},
|
entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyDelete},
|
||||||
entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyX},
|
entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyX},
|
||||||
entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyBackspace},
|
entry! {action=DocumentMessage::DeleteSelectedLayers, key_down=KeyBackspace},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue