mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-01 22:09:55 +00:00
98 lines
2.7 KiB
TypeScript
98 lines
2.7 KiB
TypeScript
import type { ColorOption } from '@comfyorg/litegraph'
|
|
import {
|
|
LGraphGroup,
|
|
LGraphNode,
|
|
LiteGraph,
|
|
isColorable
|
|
} from '@comfyorg/litegraph'
|
|
import type { IComboWidget } from '@comfyorg/litegraph/dist/types/widgets'
|
|
import _ from 'lodash'
|
|
|
|
type ImageNode = LGraphNode & { imgs: HTMLImageElement[] | undefined }
|
|
type VideoNode = LGraphNode & {
|
|
videoContainer: HTMLElement | undefined
|
|
imgs: HTMLVideoElement[] | undefined
|
|
}
|
|
|
|
export function isImageNode(node: LGraphNode | undefined): node is ImageNode {
|
|
if (!node) return false
|
|
return (
|
|
node.previewMediaType === 'image' ||
|
|
(node.previewMediaType !== 'video' && !!node.imgs?.length)
|
|
)
|
|
}
|
|
|
|
export function isVideoNode(node: LGraphNode | undefined): node is VideoNode {
|
|
if (!node) return false
|
|
return node.previewMediaType === 'video' || !!node.videoContainer
|
|
}
|
|
|
|
export function isAudioNode(node: LGraphNode | undefined): boolean {
|
|
return !!node && node.previewMediaType === 'audio'
|
|
}
|
|
|
|
export function addToComboValues(widget: IComboWidget, value: string) {
|
|
if (!widget.options) widget.options = { values: [] }
|
|
if (!widget.options.values) widget.options.values = []
|
|
if (!widget.options.values.includes(value)) {
|
|
widget.options.values.push(value)
|
|
}
|
|
}
|
|
|
|
export const isLGraphNode = (item: unknown): item is LGraphNode => {
|
|
return item instanceof LGraphNode
|
|
}
|
|
|
|
export const isLGraphGroup = (item: unknown): item is LGraphGroup => {
|
|
return item instanceof LGraphGroup
|
|
}
|
|
|
|
/**
|
|
* Get the color option of all canvas items if they are all the same.
|
|
* @param items - The items to get the color option of.
|
|
* @returns The color option of the item.
|
|
*/
|
|
export const getItemsColorOption = (items: unknown[]): ColorOption | null => {
|
|
const validItems = _.filter(items, isColorable)
|
|
if (_.isEmpty(validItems)) return null
|
|
|
|
const colorOptions = _.map(validItems, (item) => item.getColorOption())
|
|
|
|
return _.every(colorOptions, (option) =>
|
|
_.isEqual(option, _.head(colorOptions))
|
|
)
|
|
? _.head(colorOptions)!
|
|
: null
|
|
}
|
|
|
|
export function executeWidgetsCallback(
|
|
nodes: LGraphNode[],
|
|
callbackName: 'onRemove' | 'beforeQueued' | 'afterQueued'
|
|
) {
|
|
for (const node of nodes) {
|
|
for (const widget of node.widgets ?? []) {
|
|
widget[callbackName]?.()
|
|
}
|
|
}
|
|
}
|
|
|
|
export function getImageTop(node: LGraphNode) {
|
|
let shiftY: number
|
|
if (node.imageOffset != null) {
|
|
return node.imageOffset
|
|
} else if (node.widgets?.length) {
|
|
const w = node.widgets[node.widgets.length - 1]
|
|
shiftY = w.last_y ?? 0
|
|
if (w.computeSize) {
|
|
shiftY += w.computeSize()[1] + 4
|
|
} else if (w.computedHeight) {
|
|
shiftY += w.computedHeight
|
|
} else {
|
|
shiftY += LiteGraph.NODE_WIDGET_HEIGHT + 4
|
|
}
|
|
} else {
|
|
return node.computeSize()[1]
|
|
}
|
|
return shiftY
|
|
}
|