From 52fb1d7001b528227b3ab1be54c34eef80615b9b Mon Sep 17 00:00:00 2001 From: space-nuko <24979496+space-nuko@users.noreply.github.com> Date: Sat, 29 Apr 2023 04:01:49 -0700 Subject: [PATCH] Widget instead of node arrangement --- src/lib/components/ComfyPane.svelte | 177 ------------------- src/lib/components/ComfyUIPane.svelte | 107 +++++------- src/lib/components/ComfyUIPane.ts | 7 - src/lib/components/WidgetContainer.svelte | 198 ++++++++++++++++++++++ src/lib/stores/layoutState.ts | 65 +++++++ src/lib/stores/uiState.ts | 7 +- 6 files changed, 310 insertions(+), 251 deletions(-) delete mode 100644 src/lib/components/ComfyPane.svelte delete mode 100644 src/lib/components/ComfyUIPane.ts create mode 100644 src/lib/components/WidgetContainer.svelte create mode 100644 src/lib/stores/layoutState.ts diff --git a/src/lib/components/ComfyPane.svelte b/src/lib/components/ComfyPane.svelte deleted file mode 100644 index 0233f0f..0000000 --- a/src/lib/components/ComfyPane.svelte +++ /dev/null @@ -1,177 +0,0 @@ - - - -
- {#each dragItems as dragItem(dragItem.id)} - {@const node = dragItem.node} - {@const id = node.id} -
- - - {#each $nodeState[id].widgetStates as item} - - {#if dragItem[SHADOW_ITEM_MARKER_PROPERTY_NAME]} -
- {/if} - {/each} - {#if $uiState.unlocked} -
- {/if} - -
- {/each} -
- - diff --git a/src/lib/components/ComfyUIPane.svelte b/src/lib/components/ComfyUIPane.svelte index 962c878..29df71d 100644 --- a/src/lib/components/ComfyUIPane.svelte +++ b/src/lib/components/ComfyUIPane.svelte @@ -4,101 +4,76 @@ import type { IWidget } from "@litegraph-ts/core"; import ComfyApp from "./ComfyApp"; import type { SerializedPanes } from "./ComfyApp" - import ComfyPane from "./ComfyPane.svelte"; + import WidgetContainer from "./WidgetContainer.svelte"; import nodeState from "$lib/stores/nodeState"; - import type { DragItem } from "./ComfyUIPane"; + import layoutState, { type ContainerLayout, type DragItem } from "$lib/stores/layoutState"; export let app: ComfyApp; let dragConfigured: boolean = false; export let dragItems: DragItem[][] = [] export let totalId = 0; - - function findLeastPopulatedPaneIndex(): number { - let minWidgetCount = 2 ** 64; - let minIndex = 0; - let state = get(nodeState); - for (let i = 0; i < dragItems.length; i++) { - let widgetCount = 0; - for (let j = 0; j < dragItems[i].length; j++) { - const nodeID = dragItems[i][j].node.id; - widgetCount += state[nodeID].widgetStates.length; - } - if (widgetCount < minWidgetCount) { - minWidgetCount = widgetCount - minIndex = i; - } - } - return minIndex - } - - function addUIForNewNode(node: LGraphNode, paneIndex?: number) { - if (!paneIndex) - paneIndex = findLeastPopulatedPaneIndex(); - dragItems[paneIndex].push({ id: totalId++, node: node }); - } - - $: if(app && !dragConfigured) { - dragConfigured = true; - app.eventBus.on("nodeAdded", addUIForNewNode); - } + // + // function addUIForNewNode(node: LGraphNode, paneIndex?: number) { + // if (!paneIndex) + // paneIndex = findLeastPopulatedPaneIndex(); + // dragItems[paneIndex].push({ id: totalId++, node: node }); + // } + // + // $: if(app && !dragConfigured) { + // dragConfigured = true; + // app.eventBus.on("nodeAdded", addUIForNewNode); + // } /* * Serialize UI panel order so it can be restored when workflow is loaded */ export function serialize(): any { - let panels = [] - for (let i = 0; i < dragItems.length; i++) { - panels[i] = []; - for (let j = 0; j < dragItems[i].length; j++) { - panels[i].push({ nodeId: dragItems[i][j].node.id }); - } - } - return { - panels - } } export function restore(panels: SerializedPanes) { - let nodeIdToDragItem: Record = {}; - for (let i = 0; i < dragItems.length; i++) { - for (const dragItem of dragItems[i]) { - nodeIdToDragItem[dragItem.node.id] = dragItem + const a: ContainerLayout = { + type: "container", + id: "0", + attrs: { + title: "root!", + direction: "horizontal" } } + $layoutState.root = a; + $layoutState.children[0] = [ + { + type: "widget", + id: "1", + nodeId: 7, + widgetName: "text", + attrs: { - for (let i = 0; i < panels.panels.length; i++) { - dragItems[i].length = 0; - for (const panel of panels.panels[i]) { - const dragItem = nodeIdToDragItem[panel.nodeId]; - if (dragItem) { - delete nodeIdToDragItem[panel.nodeId]; - dragItems[i].push(dragItem) } - } - } + }, + { + type: "widget", + id: "2", + nodeId: 6, + widgetName: "text", + attrs: { - // Put everything left over into other columns - if (Object.keys(nodeIdToDragItem).length > 0) { - console.warn("Extra panels without ordering found", nodeIdToDragItem, panels) - for (const nodeId in nodeIdToDragItem) { - const dragItem = nodeIdToDragItem[nodeId]; - const paneIndex = findLeastPopulatedPaneIndex(); - dragItems[paneIndex].push(dragItem); - } - } + } + }, + ] + $layoutState.children[1] = [] + $layoutState.children[2] = [] }
- - - +
diff --git a/src/lib/components/ComfyUIPane.ts b/src/lib/components/ComfyUIPane.ts deleted file mode 100644 index c555e03..0000000 --- a/src/lib/components/ComfyUIPane.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { LGraphNode } from "@litegraph-ts/core" - -export type DragItem = { - id: number, - node: LGraphNode, - isNodeExecuting?: boolean -} diff --git a/src/lib/components/WidgetContainer.svelte b/src/lib/components/WidgetContainer.svelte new file mode 100644 index 0000000..6c70a56 --- /dev/null +++ b/src/lib/components/WidgetContainer.svelte @@ -0,0 +1,198 @@ + + + +{#if container} + {@const node = container.node} + {@const id = container.id} + + +
+ {#each children.filter(item => item.id !== SHADOW_PLACEHOLDER_ITEM_ID) as item(item.id)} +
+ + {#if item[SHADOW_ITEM_MARKER_PROPERTY_NAME]} +
+ {/if} +
+ {/each} +
+ +{:else if widget} + + {#if $uiState.unlocked} +
+ {/if} +{/if} + + diff --git a/src/lib/stores/layoutState.ts b/src/lib/stores/layoutState.ts new file mode 100644 index 0000000..a169c46 --- /dev/null +++ b/src/lib/stores/layoutState.ts @@ -0,0 +1,65 @@ +import { get, writable } from 'svelte/store'; +import type { Readable, Writable } from 'svelte/store'; +import type ComfyApp from "$lib/components/ComfyApp" +import type { LGraphNode, IWidget } from "@litegraph-ts/core" + +export type LayoutState = { + root: IDragItem | null, + children: Record, +} + +export type Properties = { + direction: string, +} + +export interface IDragItem { + type: string, + id: number, + isNodeExecuting?: boolean, + properties: Properties +} + +export interface ContainerLayout extends IDragItem { + type: "container", +} + +export interface WidgetLayout extends IDragItem { + type: "widget", + nodeId: number, + widgetName: string +} + +type LayoutStateOps = { + findDefaultContainerForInsertion: () => ContainerLayout | null, + reset: () => void, +} + +export type WritableLayoutStateStore = Writable & LayoutStateOps; +const store: Writable = writable({ + root: null, + children: [] +}) + +function findDefaultContainerForInsertion(): ContainerLayout | null { + const state = get(store); + if ("children" in state.root) { + const container = state.root as ContainerLayout; + const found = state.children[container.id].find((di) => {"children" in di}) + if (found && "children" in found) + return found as ContainerLayout; + return container; + } + return null +} + +function reset() { + // TODO +} + +const uiStateStore: WritableLayoutStateStore = +{ + ...store, + findDefaultContainerForInsertion, + reset +} +export default uiStateStore; diff --git a/src/lib/stores/uiState.ts b/src/lib/stores/uiState.ts index 0fbb6b8..507232f 100644 --- a/src/lib/stores/uiState.ts +++ b/src/lib/stores/uiState.ts @@ -10,7 +10,12 @@ export type UIState = { } export type WritableUIStateStore = Writable; -const store: WritableUIStateStore = writable({ unlocked: false, graphLocked: true, nodesLocked:false }) +const store: WritableUIStateStore = writable( + { + graphLocked: true, + nodesLocked: false, + unlocked: true, + }) const uiStateStore: WritableUIStateStore = {