Display recommended widgets on conversion.

This code will need refactoring later.
This commit is contained in:
Austin Mroz
2025-09-26 09:37:06 -05:00
parent 92f2578357
commit 992e4a7f8a
2 changed files with 37 additions and 1 deletions

View File

@@ -6,6 +6,7 @@ import {
DEFAULT_DARK_COLOR_PALETTE,
DEFAULT_LIGHT_COLOR_PALETTE
} from '@/constants/coreColorPalettes'
import { promoteRecommendedWidgets } from '@/core/graph/subgraph/proxyWidgetUtils'
import { t } from '@/i18n'
import {
LGraphEventMode,
@@ -858,6 +859,7 @@ export function useCoreCommands(): ComfyCommand[] {
const { node } = res
canvas.select(node)
promoteRecommendedWidgets(node)
canvasStore.updateSelectedItems()
}
},

View File

@@ -4,7 +4,10 @@ import type {
} from '@/lib/litegraph/src/litegraph'
import { SubgraphNode } from '@/lib/litegraph/src/subgraph/SubgraphNode'
import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets.ts'
import { parseProxyWidgets } from '@/schemas/proxyWidget'
import {
type ProxyWidgetsProperty,
parseProxyWidgets
} from '@/schemas/proxyWidget'
import { useSubgraphNavigationStore } from '@/stores/subgraphNavigationStore'
function pushWidgets(node: SubgraphNode, ...widgets: [string, string][]) {
@@ -90,3 +93,34 @@ export function addWidgetPromotionOptions(
})
}
}
//FIXME: This currently has ugly duplication with the sidebar pane
//Refactor all the computed widget logic into a separate file (composable?)
type WidgetItem = [LGraphNode, IBaseWidget]
const recommendedNodes = [
'CLIPTextEncode',
'LoadImage',
'SaveImage',
'PreviewImage'
]
const recommendedWidgetNames = ['seed']
function nodeWidgets(n: LGraphNode): WidgetItem[] {
if (!n.widgets) return []
return n.widgets.map((w: IBaseWidget) => [n, w])
}
export function promoteRecommendedWidgets(subgraphNode: SubgraphNode) {
const interiorNodes = subgraphNode.subgraph.nodes
const filteredWidgets: WidgetItem[] = interiorNodes
.flatMap(nodeWidgets)
//widget has connected link. Should not be eligible for promotion
.filter(([_, w]: WidgetItem) => !w.computedDisabled)
.filter(
([node, widget]: WidgetItem) =>
recommendedNodes.includes(node.type) ||
recommendedWidgetNames.includes(widget.name)
)
const pw: ProxyWidgetsProperty = filteredWidgets.map(([n, w]: WidgetItem) => [
`${n.id}`,
w.name
])
subgraphNode.properties.proxyWidgets = JSON.stringify(pw)
}