import { app } from "scripts/app.js"; import { rgthreeApi } from "rgthree/common/rgthree_api.js"; import type { LGraphCanvas as TLGraphCanvas, IWidget, LGraphNode, ContextMenuEventListener, ContextMenu, IContextMenuItem, } from "../typings/litegraph.js"; const PASS_THROUGH = function (item: T) { return item as T; }; /** * Shows a lora chooser context menu. */ export async function showLoraChooser( event: PointerEvent, callback: ContextMenuEventListener, parentMenu?: ContextMenu | null, loras?: string[], ) { const canvas = app.canvas as TLGraphCanvas; if (!loras) { loras = ["None", ...(await rgthreeApi.getLoras())]; } new LiteGraph.ContextMenu(loras, { event: event, parentMenu, title: "Choose a lora", scale: Math.max(1, canvas.ds?.scale ?? 1), className: "dark", callback, }); } /** * Shows a context menu chooser of nodes. * * @param mapFn The function used to map each node to the context menu item. If null is returned * it will be filtered out (rather than use a separate filter method). */ export function showNodesChooser( event: PointerEvent, mapFn: (n: LGraphNode) => T | null, callback: ContextMenuEventListener, parentMenu?: ContextMenu, ) { const canvas = app.canvas as TLGraphCanvas; const nodesOptions: T[] = (app.graph._nodes as LGraphNode[]) .map(mapFn) .filter((e): e is NonNullable => e != null); nodesOptions.sort((a: any, b: any) => { return a.value - b.value; }); new LiteGraph.ContextMenu(nodesOptions, { event: event, parentMenu, title: "Choose a node id", scale: Math.max(1, canvas.ds?.scale ?? 1), className: "dark", callback, }); } /** * Shows a conmtext menu chooser for a specific node. * * @param mapFn The function used to map each node to the context menu item. If null is returned * it will be filtered out (rather than use a separate filter method). */ export function showWidgetsChooser( event: PointerEvent | MouseEvent, node: LGraphNode, mapFn: (n: IWidget) => T | null, callback: ContextMenuEventListener, parentMenu?: ContextMenu, ) { const options: T[] = (node.widgets || []) .map(mapFn) .filter((e): e is NonNullable => e != null); if (options.length) { const canvas = app.canvas as TLGraphCanvas; new LiteGraph.ContextMenu(options, { event, parentMenu, title: "Choose an input/widget", scale: Math.max(1, canvas.ds?.scale ?? 1), className: "dark", callback, }); } }