From d48c0ace549733dd1ee451e6eef3b65f22d28a88 Mon Sep 17 00:00:00 2001 From: Johnpaul Date: Tue, 9 Sep 2025 20:51:15 +0100 Subject: [PATCH] feat: add isDeletable computed property and isRemovableItem helper function --- .../graph/selectionToolbox/DeleteButton.vue | 7 +----- src/composables/graph/useSelectionState.ts | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/graph/selectionToolbox/DeleteButton.vue b/src/components/graph/selectionToolbox/DeleteButton.vue index 9f95ff515..966b8628e 100644 --- a/src/components/graph/selectionToolbox/DeleteButton.vue +++ b/src/components/graph/selectionToolbox/DeleteButton.vue @@ -16,7 +16,6 @@ diff --git a/src/composables/graph/useSelectionState.ts b/src/composables/graph/useSelectionState.ts index 8504bafe0..9480462b2 100644 --- a/src/composables/graph/useSelectionState.ts +++ b/src/composables/graph/useSelectionState.ts @@ -1,11 +1,7 @@ import { computed } from 'vue' import { useNodeLibrarySidebarTab } from '@/composables/sidebarTabs/useNodeLibrarySidebarTab' -import { - LGraphEventMode, - LGraphNode, - SubgraphNode -} from '@/lib/litegraph/src/litegraph' +import { LGraphEventMode, LGraphNode } from '@/lib/litegraph/src/litegraph' import { useCanvasStore } from '@/stores/graphStore' import { useNodeDefStore } from '@/stores/nodeDefStore' import { useNodeHelpStore } from '@/stores/workspace/nodeHelpStore' @@ -18,6 +14,9 @@ interface NodeSelectionState { pinned: boolean bypassed: boolean } +interface RemovableItem { + removable?: boolean +} /** * Centralized computed selection state + shared helper actions to avoid duplication @@ -59,7 +58,7 @@ export function useSelectionState() { ) const hasSubgraphs = computed(() => - selectedItems.value.some((i) => i instanceof SubgraphNode) + selectedItems.value.some((i) => (i as LGraphNode)?.isSubgraphNode?.()) ) const hasImageNode = computed(() => isSingleImageNode.value) @@ -112,6 +111,15 @@ export function useSelectionState() { nodeHelpStore.openHelp(def) } + const isRemovableItem = (item: unknown): item is RemovableItem => + item != null && typeof item === 'object' && ('removable' in item || true) + + const isDeletable = computed(() => + selectedItems.value + .filter(isRemovableItem) + .some((x) => x.removable !== false) + ) + return { selectedItems, selectedNodes, @@ -127,6 +135,7 @@ export function useSelectionState() { hasImageNode, hasOutputNodesSelected, selectedNodesStates, - computeSelectionFlags + computeSelectionFlags, + isDeletable } }