Delete selected layers (#173)

* Delete Layers
* Fix backend selection
* Fix shift selection
* Add desired shape add selection behavior
* Add X and Backspace as keybinds for layer deletion
* Change key storage to u128
* Remove unhelpful trace logging
* Reverse display direction for layers
This commit is contained in:
TrueDoctor
2021-06-10 09:24:59 +02:00
committed by Keavon Chambers
parent 4f40a1f291
commit e4b5aa3933
10 changed files with 81 additions and 28 deletions

View File

@@ -53,6 +53,7 @@ impl Document {
.layers()
.iter()
.zip(folder.layer_ids.iter())
.rev()
.map(|(layer, id)| {
let path = [path, &[*id]].concat();
layer_panel_entry(layer_data(self_layer_data, &path), layer, path)

View File

@@ -10,6 +10,7 @@ pub enum DocumentMessage {
DispatchOperation(DocumentOperation),
SelectLayers(Vec<Vec<LayerId>>),
DeleteLayer(Vec<LayerId>),
DeleteSelectedLayers,
AddFolder(Vec<LayerId>),
RenameLayer(Vec<LayerId>, String),
ToggleLayerVisibility(Vec<LayerId>),
@@ -56,6 +57,14 @@ impl DocumentMessageHandler {
FrontendMessage::ExpandFolder { path, children }.into()
})
}
fn clear_selection(&mut self) {
self.active_document_mut().layer_data.values_mut().for_each(|layer_data| layer_data.selected = false);
}
fn select_layer(&mut self, path: &[LayerId]) -> Option<Message> {
self.active_document_mut().layer_data(&path).selected = true;
// TODO: Add deduplication
(!path.is_empty()).then(|| self.handle_folder_changed(path[..path.len() - 1].to_vec())).flatten()
}
}
impl Default for DocumentMessageHandler {
@@ -95,11 +104,18 @@ impl MessageHandler<DocumentMessage, ()> for DocumentMessageHandler {
self.active_document_mut().layer_data(&path).expanded ^= true;
responses.extend(self.handle_folder_changed(path));
}
SelectLayers(paths) => {
DeleteSelectedLayers => {
// TODO: Replace with drain_filter https://github.com/rust-lang/rust/issues/59618
let paths: Vec<Vec<LayerId>> = self.active_document().layer_data.iter().filter_map(|(path, data)| data.selected.then(|| path.clone())).collect();
for path in paths {
self.active_document_mut().layer_data(&path).selected ^= true;
responses.extend(self.handle_folder_changed(path));
// TODO: Add deduplication
self.active_document_mut().layer_data.remove(&path);
responses.push_back(DocumentOperation::DeleteLayer { path }.into())
}
}
SelectLayers(paths) => {
self.clear_selection();
for path in paths {
responses.extend(self.select_layer(&path));
}
}
Undo => {
@@ -116,6 +132,14 @@ impl MessageHandler<DocumentMessage, ()> for DocumentMessageHandler {
.into_iter()
.map(|response| match response {
DocumentResponse::FolderChanged { path } => self.handle_folder_changed(path),
DocumentResponse::SelectLayer { path } => {
if !self.active_document().document.work_mounted {
self.clear_selection();
self.select_layer(&path)
} else {
None
}
}
DocumentResponse::DocumentChanged => unreachable!(),
})
.flatten(),
@@ -134,5 +158,11 @@ impl MessageHandler<DocumentMessage, ()> for DocumentMessageHandler {
message => todo!("document_action_handler does not implement: {}", message.to_discriminant().global_name()),
}
}
advertise_actions!(DocumentMessageDiscriminant; Undo, RenderDocument, ExportDocument);
fn actions(&self) -> ActionList {
if self.active_document().layer_data.values().any(|data| data.selected) {
actions!(DocumentMessageDiscriminant; Undo, DeleteSelectedLayers, RenderDocument, ExportDocument)
} else {
actions!(DocumentMessageDiscriminant; Undo, RenderDocument, ExportDocument)
}
}
}