import { app } from "../../scripts/app.js"; import { RgthreeBaseVirtualNode } from "./base_node.js"; import { NodeTypesString } from "./constants.js"; import { rgthree } from "./rgthree.js"; export class Label extends RgthreeBaseVirtualNode { constructor(title = Label.title) { super(title); this.comfyClass = NodeTypesString.LABEL; this.resizable = false; this.properties["fontSize"] = 12; this.properties["fontFamily"] = "Arial"; this.properties["fontColor"] = "#ffffff"; this.properties["textAlign"] = "left"; this.properties["backgroundColor"] = "transparent"; this.properties["padding"] = 0; this.properties["borderRadius"] = 0; this.color = "#fff0"; this.bgcolor = "#fff0"; this.onConstructed(); } draw(ctx) { var _a, _b; this.flags = this.flags || {}; this.flags.allow_interaction = !this.flags.pinned; ctx.save(); this.color = "#fff0"; this.bgcolor = "#fff0"; const fontColor = this.properties["fontColor"] || "#ffffff"; const backgroundColor = this.properties["backgroundColor"] || ""; ctx.font = `${Math.max(this.properties["fontSize"] || 0, 1)}px ${(_a = this.properties["fontFamily"]) !== null && _a !== void 0 ? _a : "Arial"}`; const padding = (_b = Number(this.properties["padding"])) !== null && _b !== void 0 ? _b : 0; const lines = this.title.replace(/\n*$/, "").split("\n"); const maxWidth = Math.max(...lines.map((s) => ctx.measureText(s).width)); this.size[0] = maxWidth + padding * 2; this.size[1] = this.properties["fontSize"] * lines.length + padding * 2; if (backgroundColor) { ctx.beginPath(); const borderRadius = Number(this.properties["borderRadius"]) || 0; ctx.roundRect(0, 0, this.size[0], this.size[1], [borderRadius]); ctx.fillStyle = backgroundColor; ctx.fill(); } ctx.textAlign = "left"; let textX = padding; if (this.properties["textAlign"] === "center") { ctx.textAlign = "center"; textX = this.size[0] / 2; } else if (this.properties["textAlign"] === "right") { ctx.textAlign = "right"; textX = this.size[0] - padding; } ctx.textBaseline = "top"; ctx.fillStyle = fontColor; let currentY = padding; for (let i = 0; i < lines.length; i++) { ctx.fillText(lines[i] || " ", textX, currentY); currentY += this.properties["fontSize"]; } ctx.restore(); } onDblClick(event, pos, canvas) { LGraphCanvas.active_canvas.showShowNodePanel(this); } onShowCustomPanelInfo(panel) { var _a, _b; (_a = panel.querySelector('div.property[data-property="Mode"]')) === null || _a === void 0 ? void 0 : _a.remove(); (_b = panel.querySelector('div.property[data-property="Color"]')) === null || _b === void 0 ? void 0 : _b.remove(); } inResizeCorner(x, y) { return this.resizable; } getHelp() { return `

The rgthree-comfy ${this.type.replace("(rgthree)", "")} node allows you to add a floating label to your workflow.

The text shown is the "Title" of the node and you can adjust the the font size, font family, font color, text alignment as well as a background color, padding, and background border radius from the node's properties. You can double-click the node to open the properties panel.

`; } } Label.type = NodeTypesString.LABEL; Label.title = NodeTypesString.LABEL; Label.title_mode = LiteGraph.NO_TITLE; Label.collapsable = false; Label["@fontSize"] = { type: "number" }; Label["@fontFamily"] = { type: "string" }; Label["@fontColor"] = { type: "string" }; Label["@textAlign"] = { type: "combo", values: ["left", "center", "right"] }; Label["@backgroundColor"] = { type: "string" }; Label["@padding"] = { type: "number" }; Label["@borderRadius"] = { type: "number" }; const oldDrawNode = LGraphCanvas.prototype.drawNode; LGraphCanvas.prototype.drawNode = function (node, ctx) { if (node.constructor === Label) { node.bgcolor = "transparent"; node.color = "transparent"; const v = oldDrawNode.apply(this, arguments); node.draw(ctx); return v; } const v = oldDrawNode.apply(this, arguments); return v; }; const oldGetNodeOnPos = LGraph.prototype.getNodeOnPos; LGraph.prototype.getNodeOnPos = function (x, y, nodes_list, margin) { var _a, _b; if (nodes_list && rgthree.processingMouseDown && ((_a = rgthree.lastAdjustedMouseEvent) === null || _a === void 0 ? void 0 : _a.type.includes("down")) && ((_b = rgthree.lastAdjustedMouseEvent) === null || _b === void 0 ? void 0 : _b.which) === 1) { let isDoubleClick = LiteGraph.getTime() - LGraphCanvas.active_canvas.last_mouseclick < 300; if (!isDoubleClick) { nodes_list = [...nodes_list].filter((n) => { var _a; return !(n instanceof Label) || !((_a = n.flags) === null || _a === void 0 ? void 0 : _a.pinned); }); } } return oldGetNodeOnPos.apply(this, [x, y, nodes_list, margin]); }; app.registerExtension({ name: "rgthree.Label", registerCustomNodes() { Label.setUp(); }, });