Add the Select Parent command (#2329)

* Select-Parent-Layer-Button

* check fail fixed

* check fail

* Add hotkey, fix top-level layers getting deselected, code review

---------

Co-authored-by: doxe-2611 <kolpe2611@gmail.com>
Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
prathmesh703 2025-03-01 09:13:24 +05:30 committed by GitHub
parent b6cdcba9e8
commit 17215ea66f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 35 additions and 0 deletions

View file

@ -336,6 +336,7 @@ pub fn input_mappings() -> Mapping {
entry!(KeyDown(KeyG); modifiers=[Accel], action_dispatch=DocumentMessage::GroupSelectedLayers { group_folder_type: GroupFolderType::Layer }),
entry!(KeyDown(KeyG); modifiers=[Accel, Shift], action_dispatch=DocumentMessage::UngroupSelectedLayers),
entry!(KeyDown(KeyN); modifiers=[Accel, Shift], action_dispatch=DocumentMessage::CreateEmptyFolder),
entry!(KeyDown(Backslash); modifiers=[Alt], action_dispatch=DocumentMessage::SelectParentLayer),
entry!(KeyDown(BracketLeft); modifiers=[Alt], action_dispatch=DocumentMessage::SelectionStepBack),
entry!(KeyDown(BracketRight); modifiers=[Alt], action_dispatch=DocumentMessage::SelectionStepForward),
entry!(KeyDown(MouseBack); action_dispatch=DocumentMessage::SelectionStepBack),

View file

@ -109,6 +109,7 @@ pub enum DocumentMessage {
RenderRulers,
RenderScrollbars,
SaveDocument,
SelectParentLayer,
SelectAllLayers,
SelectedLayersLower,
SelectedLayersLowerToBack,

View file

@ -931,6 +931,31 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
name,
})
}
DocumentMessage::SelectParentLayer => {
let selected_nodes = self.network_interface.selected_nodes(&[]).unwrap();
let selected_layers = selected_nodes.selected_layers(self.metadata());
let mut parent_layers = HashSet::new();
// Find the parent of each selected layer
for layer in selected_layers {
// Get this layer's parent
let Some(parent) = layer.parent(self.metadata()) else { continue };
// Either use the parent, or keep the same layer if it's already at the top level
let to_insert = if parent == LayerNodeIdentifier::ROOT_PARENT { layer } else { parent };
// Add the layer to the set of those which will become selected
parent_layers.insert(to_insert.to_node());
}
// Select each parent layer
if !parent_layers.is_empty() {
let nodes = parent_layers.into_iter().collect();
responses.add(NodeGraphMessage::SelectedNodesSet { nodes });
responses.add(BroadcastEvent::SelectionChanged);
}
}
DocumentMessage::SelectAllLayers => {
let metadata = self.metadata();
let all_layers_except_artboards_invisible_and_locked = metadata.all_layers().filter(|&layer| !self.network_interface.is_artboard(&layer.to_node(), &[])).filter(|&layer| {
@ -1358,6 +1383,7 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
ToggleOverlaysVisibility,
ToggleSnapping,
Undo,
SelectParentLayer,
SelectionStepForward,
SelectionStepBack,
ZoomCanvasTo100Percent,

View file

@ -260,6 +260,13 @@ impl LayoutHolder for MenuBarMessageHandler {
disabled: no_active_document || !has_selected_nodes,
..MenuBarEntry::default()
},
MenuBarEntry {
label: "Select Parent".into(),
shortcut: action_keys!(DocumentMessageDiscriminant::SelectParentLayer),
action: MenuBarEntry::create_action(|_| DocumentMessage::SelectParentLayer.into()),
disabled: no_active_document || !has_selected_nodes,
..MenuBarEntry::default()
},
MenuBarEntry {
label: "Previous Selection".into(),
icon: Some("HistoryUndo".into()),