diff --git a/src/components/LiteGraphCanvasSplitterOverlay.vue b/src/components/LiteGraphCanvasSplitterOverlay.vue index 316fc258d3..004796fe1f 100644 --- a/src/components/LiteGraphCanvasSplitterOverlay.vue +++ b/src/components/LiteGraphCanvasSplitterOverlay.vue @@ -155,7 +155,7 @@ const unifiedWidth = computed(() => const { focusMode } = storeToRefs(workspaceStore) -const { isSelectMode } = useAppMode() +const { isSelectMode, isBuilderMode } = useAppMode() const { activeSidebarTabId, activeSidebarTab } = storeToRefs(sidebarTabStore) const { bottomPanelVisible } = storeToRefs(useBottomPanelStore()) const { isOpen: rightSidePanelVisible } = storeToRefs(rightSidePanelStore) @@ -163,7 +163,9 @@ const showOffsideSplitter = computed( () => rightSidePanelVisible.value || isSelectMode.value ) -const sidebarPanelVisible = computed(() => activeSidebarTab.value !== null) +const sidebarPanelVisible = computed( + () => activeSidebarTab.value !== null && !isBuilderMode.value +) const sidebarStateKey = computed(() => { return unifiedWidth.value diff --git a/src/components/builder/AppBuilder.vue b/src/components/builder/AppBuilder.vue index 40d2158f4a..c5f59052b0 100644 --- a/src/components/builder/AppBuilder.vue +++ b/src/components/builder/AppBuilder.vue @@ -38,20 +38,28 @@ const workflowStore = useWorkflowStore() const { t } = useI18n() const canvas: LGraphCanvas = canvasStore.getCanvas() -const { mode, isArrangeMode } = useAppMode() +const { isSelectMode, isArrangeMode } = useAppMode() const hoveringSelectable = ref(false) provide(HideLayoutFieldKey, true) workflowStore.activeWorkflow?.changeTracker?.reset() +function resolveNode(nodeId: NodeId) { + return ( + app.rootGraph.getNodeById(nodeId) ?? + [...app.rootGraph.subgraphs.values()] + .flatMap((sg) => sg.nodes) + .find((n) => n.id == nodeId) + ) +} + // Prune stale entries whose node/widget no longer exists, so the // DraggableList model always matches the rendered items. watchEffect(() => { - const valid = appModeStore.selectedInputs.filter(([nodeId, widgetName]) => { - const node = app.rootGraph.getNodeById(nodeId) - return node?.widgets?.some((w) => w.name === widgetName) - }) + const valid = appModeStore.selectedInputs.filter(([nodeId, widgetName]) => + resolveNode(nodeId)?.widgets?.some((w) => w.name === widgetName) + ) if (valid.length < appModeStore.selectedInputs.length) { appModeStore.selectedInputs = valid } @@ -60,7 +68,7 @@ watchEffect(() => { const arrangeInputs = computed(() => appModeStore.selectedInputs .map(([nodeId, widgetName]) => { - const node = app.rootGraph.getNodeById(nodeId) + const node = resolveNode(nodeId) const widget = node?.widgets?.find((w) => w.name === widgetName) if (!node || !widget) return null return { nodeId, widgetName, node, widget } @@ -70,7 +78,7 @@ const arrangeInputs = computed(() => const inputsWithState = computed(() => appModeStore.selectedInputs.map(([nodeId, widgetName]) => { - const node = app.rootGraph.getNodeById(nodeId) + const node = resolveNode(nodeId) const widget = node?.widgets?.find((w) => w.name === widgetName) if (!node || !widget) return { nodeId, widgetName } @@ -168,14 +176,14 @@ function handleClick(e: MouseEvent) { if (!widget) { if (!node.constructor.nodeData?.output_node) return canvasInteractions.forwardEventToCanvas(e) - const index = appModeStore.selectedOutputs.findIndex((id) => id === node.id) + const index = appModeStore.selectedOutputs.findIndex((id) => id == node.id) if (index === -1) appModeStore.selectedOutputs.push(node.id) else appModeStore.selectedOutputs.splice(index, 1) return } const index = appModeStore.selectedInputs.findIndex( - ([nodeId, widgetName]) => node.id === nodeId && widget.name === widgetName + ([nodeId, widgetName]) => node.id == nodeId && widget.name === widgetName ) if (index === -1) appModeStore.selectedInputs.push([node.id, widget.name]) else appModeStore.selectedInputs.splice(index, 1) @@ -239,6 +247,7 @@ const renderedInputs = computed<[string, MaybeRef | undefined][]>( :disabled="!appModeStore.selectedInputs.length" class="border-border-subtle border-b" :tooltip="`${t('linearMode.builder.inputsDesc')}\n${t('linearMode.builder.inputsExample')}`" + :tooltip-delay="100" >