Spaces:
Configuration error
Configuration error
import { app } from "../../scripts/app.js"; | |
import { $el } from "../../scripts/ui.js"; | |
// Adds support for tooltips | |
function getHoveredWidget() { | |
if (!app) { | |
return; | |
} | |
const node = app.canvas.node_over; | |
if (!node.widgets) return; | |
const graphPos = app.canvas.graph_mouse; | |
const x = graphPos[0] - node.pos[0]; | |
const y = graphPos[1] - node.pos[1]; | |
for (const w of node.widgets) { | |
let widgetWidth, widgetHeight; | |
if (w.computeSize) { | |
const sz = w.computeSize(); | |
widgetWidth = sz[0]; | |
widgetHeight = sz[1]; | |
} else { | |
widgetWidth = w.width || node.size[0]; | |
widgetHeight = LiteGraph.NODE_WIDGET_HEIGHT; | |
} | |
if (w.last_y !== undefined && x >= 6 && x <= widgetWidth - 12 && y >= w.last_y && y <= w.last_y + widgetHeight) { | |
return w; | |
} | |
} | |
} | |
app.registerExtension({ | |
name: "Comfy.Tooltips", | |
setup() { | |
const tooltipEl = $el("div.comfy-graph-tooltip", { | |
parent: document.body, | |
}); | |
let idleTimeout; | |
const hideTooltip = () => { | |
tooltipEl.style.display = "none"; | |
}; | |
const showTooltip = (tooltip) => { | |
if (!tooltip) return; | |
tooltipEl.textContent = tooltip; | |
tooltipEl.style.display = "block"; | |
tooltipEl.style.left = app.canvas.mouse[0] + "px"; | |
tooltipEl.style.top = app.canvas.mouse[1] + "px"; | |
const rect = tooltipEl.getBoundingClientRect(); | |
if (rect.right > window.innerWidth) { | |
tooltipEl.style.left = app.canvas.mouse[0] - rect.width + "px"; | |
} | |
if (rect.top < 0) { | |
tooltipEl.style.top = app.canvas.mouse[1] + rect.height + "px"; | |
} | |
}; | |
const getInputTooltip = (nodeData, name) => { | |
const inputDef = nodeData.input?.required?.[name] ?? nodeData.input?.optional?.[name]; | |
return inputDef?.[1]?.tooltip; | |
}; | |
const onIdle = () => { | |
const { canvas } = app; | |
const node = canvas.node_over; | |
if (!node) return; | |
const nodeData = node.constructor.nodeData ?? {}; | |
if (node.constructor.title_mode !== LiteGraph.NO_TITLE && canvas.graph_mouse[1] < node.pos[1]) { | |
return showTooltip(nodeData.description); | |
} | |
if (node.flags?.collapsed) return; | |
const inputSlot = canvas.isOverNodeInput(node, canvas.graph_mouse[0], canvas.graph_mouse[1], [0, 0]); | |
if (inputSlot !== -1) { | |
const inputName = node.inputs[inputSlot].name; | |
return showTooltip(getInputTooltip(nodeData, inputName)); | |
} | |
const outputSlot = canvas.isOverNodeOutput(node, canvas.graph_mouse[0], canvas.graph_mouse[1], [0, 0]); | |
if (outputSlot !== -1) { | |
return showTooltip(nodeData.output_tooltips?.[outputSlot]); | |
} | |
const widget = getHoveredWidget(); | |
// Dont show for DOM widgets, these use native browser tooltips as we dont get proper mouse events on these | |
if (widget && !widget.element) { | |
return showTooltip(widget.tooltip ?? getInputTooltip(nodeData, widget.name)); | |
} | |
}; | |
const onMouseMove = (e) => { | |
hideTooltip(); | |
clearTimeout(idleTimeout); | |
if(e.target.nodeName !== "CANVAS") return | |
idleTimeout = setTimeout(onIdle, 500); | |
}; | |
app.ui.settings.addSetting({ | |
id: "Comfy.EnableTooltips", | |
name: "Enable Tooltips", | |
type: "boolean", | |
defaultValue: true, | |
onChange(value) { | |
if (value) { | |
window.addEventListener("mousemove", onMouseMove); | |
window.addEventListener("click", hideTooltip); | |
} else { | |
window.removeEventListener("mousemove", onMouseMove); | |
window.removeEventListener("click", hideTooltip); | |
} | |
}, | |
}); | |
}, | |
}); | |