Skip to content

Commit d2fc919

Browse files
0SlowPoke0Keavon
andauthored
Add recursive folder expand/collapse to the Layers panel (#2419)
* added_recursion_fix * Add tooltip and tidy up color visibility --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent 7a3bb99 commit d2fc919

File tree

5 files changed

+36
-13
lines changed

5 files changed

+36
-13
lines changed

editor/src/messages/portfolio/document/document_message.rs

+1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ pub enum DocumentMessage {
171171
AddTransaction,
172172
ToggleLayerExpansion {
173173
id: NodeId,
174+
recursive: bool,
174175
},
175176
ToggleSelectedVisibility,
176177
ToggleSelectedLocked,

editor/src/messages/portfolio/document/document_message_handler.rs

+17-3
Original file line numberDiff line numberDiff line change
@@ -1192,13 +1192,27 @@ impl MessageHandler<DocumentMessage, DocumentMessageData<'_>> for DocumentMessag
11921192
responses.add_front(DocumentMessage::CommitTransaction);
11931193
responses.add_front(DocumentMessage::StartTransaction);
11941194
}
1195-
DocumentMessage::ToggleLayerExpansion { id } => {
1195+
DocumentMessage::ToggleLayerExpansion { id, recursive } => {
11961196
let layer = LayerNodeIdentifier::new(id, &self.network_interface, &[]);
1197-
if self.collapsed.0.contains(&layer) {
1198-
self.collapsed.0.retain(|&collapsed_layer| collapsed_layer != layer);
1197+
let metadata = self.metadata();
1198+
1199+
let is_collapsed = self.collapsed.0.contains(&layer);
1200+
1201+
if is_collapsed {
1202+
if recursive {
1203+
let children: HashSet<_> = layer.children(metadata).collect();
1204+
self.collapsed.0.retain(|collapsed_layer| !children.contains(collapsed_layer) && collapsed_layer != &layer);
1205+
} else {
1206+
self.collapsed.0.retain(|collapsed_layer| collapsed_layer != &layer);
1207+
}
11991208
} else {
1209+
if recursive {
1210+
let children_to_add: Vec<_> = layer.children(metadata).filter(|child| !self.collapsed.0.contains(child)).collect();
1211+
self.collapsed.0.extend(children_to_add);
1212+
}
12001213
self.collapsed.0.push(layer);
12011214
}
1215+
12021216
responses.add(NodeGraphMessage::SendGraph);
12031217
}
12041218
DocumentMessage::ToggleSelectedLocked => responses.add(NodeGraphMessage::ToggleSelectedLocked),

frontend/src/components/Editor.svelte

+5-2
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,11 @@
152152
transparent calc((3px * sqrt(2) / 2) + 0.5px),
153153
transparent calc(6px * sqrt(2) / 2)
154154
);
155-
--inheritance-dots-background: url('data:image/svg+xml;utf8,\
156-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 6" width="6px" height="6px" fill="%23444"><rect width="1" height="1" /><rect x="3" y="3" width="1" height="1" /></svg>\
155+
--inheritance-dots-background-4-dimgray: url('data:image/svg+xml;utf8,\
156+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 4" width="4px" height="4px" fill="%23444"><rect width="1" height="1" /><rect x="2" y="2" width="1" height="1" /></svg>\
157+
');
158+
--inheritance-dots-background-6-lowergray: url('data:image/svg+xml;utf8,\
159+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 4" width="4px" height="4px" fill="%23666"><rect width="1" height="1" /><rect x="2" y="2" width="1" height="1" /></svg>\
157160
');
158161
159162
// Array of 2x3 dots (fill: --color-e-nearwhite)

frontend/src/components/panels/Layers.svelte

+11-6
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,11 @@
135135
editor.handle.toggleLayerLock(id);
136136
}
137137
138-
function handleExpandArrowClick(id: bigint) {
139-
editor.handle.toggleLayerExpansion(id);
138+
function handleExpandArrowClickWithModifiers(e: MouseEvent, id: bigint) {
139+
const accel = platformIsMac() ? e.metaKey : e.ctrlKey;
140+
const collapseRecursive = e.altKey || accel;
141+
editor.handle.toggleLayerExpansion(id, collapseRecursive);
142+
e.stopPropagation();
140143
}
141144
142145
async function onEditLayerName(listing: LayerListingInfo) {
@@ -432,8 +435,10 @@
432435
class="expand-arrow"
433436
class:expanded={listing.entry.expanded}
434437
disabled={!listing.entry.childrenPresent}
435-
title={listing.entry.expanded ? "Collapse" : `Expand${listing.entry.ancestorOfSelected ? "\n(A selected layer is contained within)" : ""}`}
436-
on:click|stopPropagation={() => handleExpandArrowClick(listing.entry.id)}
438+
title={listing.entry.expanded
439+
? "Collapse (Click) / Collapse All (Alt Click)"
440+
: `Expand (Click) / Expand All (Alt Click)${listing.entry.ancestorOfSelected ? "\n(A selected layer is contained within)" : ""}`}
441+
on:click={(e) => handleExpandArrowClickWithModifiers(e, listing.entry.id)}
437442
tabindex="0"
438443
></button>
439444
{/if}
@@ -545,11 +550,11 @@
545550
}
546551
547552
&.ancestor-of-selected .expand-arrow:not(.expanded) {
548-
background-image: var(--inheritance-stripes-background);
553+
background-image: var(--inheritance-dots-background-6-lowergray);
549554
}
550555
551556
&.descendant-of-selected {
552-
background-image: var(--inheritance-dots-background);
557+
background-image: var(--inheritance-dots-background-4-dimgray);
553558
}
554559
555560
&.selected-but-not-in-selected-network {

frontend/wasm/src/editor_api.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -700,9 +700,9 @@ impl EditorHandle {
700700

701701
/// Toggle expansions state of a layer from the layer list
702702
#[wasm_bindgen(js_name = toggleLayerExpansion)]
703-
pub fn toggle_layer_expansion(&self, id: u64) {
703+
pub fn toggle_layer_expansion(&self, id: u64, recursive: bool) {
704704
let id = NodeId(id);
705-
let message = DocumentMessage::ToggleLayerExpansion { id };
705+
let message = DocumentMessage::ToggleLayerExpansion { id, recursive };
706706
self.dispatch(message);
707707
}
708708

0 commit comments

Comments
 (0)