diff --git a/editor/src/messages/input_mapper/default_mapping.rs b/editor/src/messages/input_mapper/default_mapping.rs
index 4920f8d72a..eec0b96e95 100644
--- a/editor/src/messages/input_mapper/default_mapping.rs
+++ b/editor/src/messages/input_mapper/default_mapping.rs
@@ -58,6 +58,7 @@ pub fn default_mapping() -> Mapping {
entry!(KeyDown(KeyC); modifiers=[Accel], action_dispatch=NodeGraphMessage::Copy),
entry!(KeyDown(KeyD); modifiers=[Accel], action_dispatch=NodeGraphMessage::DuplicateSelectedNodes),
entry!(KeyDown(KeyH); modifiers=[Accel], action_dispatch=NodeGraphMessage::ToggleSelectedVisibility),
+ entry!(KeyDown(KeyL); modifiers=[Accel], action_dispatch=NodeGraphMessage::ToggleSelectedLocked),
//
// TransformLayerMessage
entry!(KeyDown(Enter); action_dispatch=TransformLayerMessage::ApplyTransformOperation),
diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs
index fb8e99688b..3e21c61c10 100644
--- a/editor/src/messages/portfolio/document/document_message_handler.rs
+++ b/editor/src/messages/portfolio/document/document_message_handler.rs
@@ -1363,7 +1363,7 @@ impl DocumentMessageHandler {
let has_selection = self.selected_nodes.selected_layers(self.metadata()).next().is_some();
let selection_all_visible = self.selected_nodes.selected_layers(self.metadata()).all(|layer| self.metadata().node_is_visible(layer.to_node()));
- let selection_all_locked = false; // TODO: Implement
+ let selection_all_locked = self.selected_nodes.selected_layers(self.metadata()).all(|layer| self.metadata().node_is_locked(layer.to_node()));
let layers_panel_options_bar = WidgetLayout::new(vec![LayoutGroup::Row {
widgets: vec![
@@ -1417,8 +1417,8 @@ impl DocumentMessageHandler {
IconButton::new(if selection_all_locked { "PadlockLocked" } else { "PadlockUnlocked" }, 24)
.hover_icon(Some((if selection_all_locked { "PadlockUnlocked" } else { "PadlockLocked" }).into()))
.tooltip(if selection_all_locked { "Unlock Selected" } else { "Lock Selected" })
- .tooltip_shortcut(action_keys!(DialogMessageDiscriminant::RequestComingSoonDialog))
- .on_update(|_| DialogMessage::RequestComingSoonDialog { issue: Some(1127) }.into())
+ .tooltip_shortcut(action_keys!(NodeGraphMessageDiscriminant::ToggleSelectedLocked))
+ .on_update(|_| NodeGraphMessage::ToggleSelectedLocked.into())
.disabled(!has_selection)
.widget_holder(),
IconButton::new(if selection_all_visible { "EyeVisible" } else { "EyeHidden" }, 24)
diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs
index 1f7f605d5a..c03c91a964 100644
--- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs
+++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs
@@ -830,6 +830,11 @@ impl NodeGraphMessageHandler {
.filter(|&ancestor| ancestor != layer)
.all(|layer| network.nodes.get(&layer.to_node()).map(|node| node.visible).unwrap_or_default());
+ let parents_unlocked = layer
+ .ancestors(metadata)
+ .filter(|&ancestor| ancestor != layer)
+ .all(|layer| network.nodes.get(&layer.to_node()).map(|node| !node.locked).unwrap_or_default());
+
let data = LayerPanelEntry {
id: node_id,
layer_classification,
@@ -841,8 +846,8 @@ impl NodeGraphMessageHandler {
tooltip: if cfg!(debug_assertions) { format!("Layer ID: {node_id}") } else { "".into() },
visible: node.visible,
parents_visible,
- unlocked: true,
- parents_unlocked: true,
+ unlocked: !node.locked,
+ parents_unlocked,
};
responses.add(FrontendMessage::UpdateDocumentLayerDetails { data });
}
diff --git a/frontend/assets/icon-16px-solid/lock.svg b/frontend/assets/icon-16px-solid/lock.svg
deleted file mode 100644
index 6fbb87df15..0000000000
--- a/frontend/assets/icon-16px-solid/lock.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/frontend/assets/icon-16px-solid/unlock.svg b/frontend/assets/icon-16px-solid/unlock.svg
deleted file mode 100644
index 960def4e9b..0000000000
--- a/frontend/assets/icon-16px-solid/unlock.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/frontend/src/components/panels/Layers.svelte b/frontend/src/components/panels/Layers.svelte
index aecfe9d282..4b9f325af2 100644
--- a/frontend/src/components/panels/Layers.svelte
+++ b/frontend/src/components/panels/Layers.svelte
@@ -428,7 +428,7 @@
(toggleLayerVisibility(listing.entry.id), e?.stopPropagation())}
+ action={(e) => (toggleLayerLock(listing.entry.id), e?.stopPropagation())}
size={24}
icon={listing.entry.parentsUnlocked ? "PadlockLocked" : "PadlockUnlocked"}
hoverIcon={listing.entry.parentsUnlocked ? "PadlockUnlocked" : "PadlockLocked"}
@@ -444,13 +444,6 @@
hoverIcon={listing.entry.visible ? "EyeHide" : "EyeShow"}
tooltip={listing.entry.visible ? "Hide" : "Show"}
/>
- (toggleLayerLock(listing.entry.id), e?.stopPropagation())}
- size={24}
- icon={listing.entry.locked ? "Lock" : "Unlock"}
- tooltip={listing.entry.locked ? "Locked" : "Unlocked"}
- />
{/each}
diff --git a/frontend/src/utility-functions/icons.ts b/frontend/src/utility-functions/icons.ts
index d58b15545c..6820676312 100644
--- a/frontend/src/utility-functions/icons.ts
+++ b/frontend/src/utility-functions/icons.ts
@@ -145,7 +145,6 @@ import Rescale from "@graphite-frontend/assets/icon-16px-solid/rescale.svg";
import Reset from "@graphite-frontend/assets/icon-16px-solid/reset.svg";
import Settings from "@graphite-frontend/assets/icon-16px-solid/settings.svg";
import Trash from "@graphite-frontend/assets/icon-16px-solid/trash.svg";
-import Unlock from "@graphite-frontend/assets/icon-16px-solid/unlock.svg";
import ViewModeNormal from "@graphite-frontend/assets/icon-16px-solid/view-mode-normal.svg";
import ViewModeOutline from "@graphite-frontend/assets/icon-16px-solid/view-mode-outline.svg";
import ViewModePixels from "@graphite-frontend/assets/icon-16px-solid/view-mode-pixels.svg";
@@ -219,7 +218,6 @@ const SOLID_16PX = {
Reset: { svg: Reset, size: 16 },
Settings: { svg: Settings, size: 16 },
Trash: { svg: Trash, size: 16 },
- Unlock: { svg: Unlock, size: 16 },
ViewModeNormal: { svg: ViewModeNormal, size: 16 },
ViewModeOutline: { svg: ViewModeOutline, size: 16 },
ViewModePixels: { svg: ViewModePixels, size: 16 },
diff --git a/frontend/src/wasm-communication/messages.ts b/frontend/src/wasm-communication/messages.ts
index 95d8be992b..cf1367cc3f 100644
--- a/frontend/src/wasm-communication/messages.ts
+++ b/frontend/src/wasm-communication/messages.ts
@@ -126,7 +126,7 @@ export class FrontendNode {
readonly visible!: boolean;
- readonly locked!: boolean;
+ readonly unlocked!: boolean;
readonly errors!: string | undefined;
}