diff --git a/frontend/src/components/panels/Layers.svelte b/frontend/src/components/panels/Layers.svelte index 4d32b3ff..1e9c164f 100644 --- a/frontend/src/components/panels/Layers.svelte +++ b/frontend/src/components/panels/Layers.svelte @@ -6,6 +6,7 @@ import IconLabel from "/src/components/widgets/labels/IconLabel.svelte"; import Separator from "/src/components/widgets/labels/Separator.svelte"; import WidgetLayout from "/src/components/widgets/WidgetLayout.svelte"; + import { createDragToggleManager, destroyDragToggleManager } from "/src/managers/drag-toggle"; import type { NodeGraphStore } from "/src/stores/node-graph"; import { layersPanelControlBarLeftLayout, layersPanelControlBarRightLayout, layersPanelBottomBarLayout } from "/src/stores/portfolio"; import type { PortfolioStore } from "/src/stores/portfolio"; @@ -68,9 +69,14 @@ let layerToClipUponClick: LayerListingInfo | undefined = undefined; let layerToClipAltKeyPressed = false; + // Drag-toggle: tracked here so the template can render the invisible lock placeholder during a `layer-lock` gesture + let activeDragToggleGroup: string | undefined = undefined; + $: rebuildLayerHierarchy($portfolio.layerStructure, $portfolio.layerCache); onMount(() => { + createDragToggleManager(dragToggleListener); + addEventListener("pointerup", draggingPointerUp); addEventListener("pointermove", draggingPointerMove); addEventListener("mousedown", draggingMouseDown); @@ -83,6 +89,8 @@ }); onDestroy(() => { + destroyDragToggleManager(dragToggleListener); + removeEventListener("pointerup", draggingPointerUp); removeEventListener("pointermove", draggingPointerMove); removeEventListener("mousedown", draggingMouseDown); @@ -94,6 +102,10 @@ removeEventListener("keyup", clippingKeyPress); }); + function dragToggleListener(group: string | undefined) { + activeDragToggleGroup = group; + } + function toggleNodeVisibilityLayerPanel(id: bigint) { editor.toggleNodeVisibilityLayerPanel(id); } @@ -614,6 +626,17 @@ hoverIcon={listing.entry.unlocked ? "PadlockLocked" : "PadlockUnlocked"} tooltipLabel={listing.entry.unlocked ? "Lock" : "Unlock"} tooltipDescription={!listing.parentsUnlocked ? "A parent of this layer is locked and that status is being inherited." : ""} + data-drag-toggle-group="layer-lock" + data-drag-toggle-state={listing.entry.unlocked ? "unlocked" : "locked"} + /> + {:else if activeDragToggleGroup === "layer-lock"} + (toggleLayerLock(listing.entry.id), e?.stopPropagation())} + size={24} + icon="PadlockUnlocked" + data-drag-toggle-group="layer-lock" + data-drag-toggle-state="unlocked" /> {/if}