| import { app } from "../../../scripts/app.js"; | |
| import { $el } from "../../../scripts/ui.js"; | |
| const colorShade = (col, amt) => { | |
| col = col.replace(/^#/, ""); | |
| if (col.length === 3) col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2]; | |
| let [r, g, b] = col.match(/.{2}/g); | |
| [r, g, b] = [parseInt(r, 16) + amt, parseInt(g, 16) + amt, parseInt(b, 16) + amt]; | |
| r = Math.max(Math.min(255, r), 0).toString(16); | |
| g = Math.max(Math.min(255, g), 0).toString(16); | |
| b = Math.max(Math.min(255, b), 0).toString(16); | |
| const rr = (r.length < 2 ? "0" : "") + r; | |
| const gg = (g.length < 2 ? "0" : "") + g; | |
| const bb = (b.length < 2 ? "0" : "") + b; | |
| return `#${rr}${gg}${bb}`; | |
| }; | |
| app.registerExtension({ | |
| name: "pysssss.CustomColors", | |
| setup() { | |
| let picker; | |
| let activeNode; | |
| const onMenuNodeColors = LGraphCanvas.onMenuNodeColors; | |
| LGraphCanvas.onMenuNodeColors = function (value, options, e, menu, node) { | |
| const r = onMenuNodeColors.apply(this, arguments); | |
| requestAnimationFrame(() => { | |
| const menus = document.querySelectorAll(".litecontextmenu"); | |
| for (let i = menus.length - 1; i >= 0; i--) { | |
| if (menus[i].firstElementChild.textContent.includes("No color") || menus[i].firstElementChild.value?.content?.includes("No color")) { | |
| $el( | |
| "div.litemenu-entry.submenu", | |
| { | |
| parent: menus[i], | |
| $: (el) => { | |
| el.onclick = () => { | |
| LiteGraph.closeAllContextMenus(); | |
| if (!picker) { | |
| picker = $el("input", { | |
| type: "color", | |
| parent: document.body, | |
| style: { | |
| display: "none", | |
| }, | |
| }); | |
| picker.onchange = () => { | |
| if (activeNode) { | |
| const fApplyColor = function(node){ | |
| if (picker.value) { | |
| if (node.constructor === LiteGraph.LGraphGroup) { | |
| node.color = picker.value; | |
| } else { | |
| node.color = colorShade(picker.value, 20); | |
| node.bgcolor = picker.value; | |
| } | |
| } | |
| } | |
| const graphcanvas = LGraphCanvas.active_canvas; | |
| if (!graphcanvas.selected_nodes || Object.keys(graphcanvas.selected_nodes).length <= 1){ | |
| fApplyColor(activeNode); | |
| } else { | |
| for (let i in graphcanvas.selected_nodes) { | |
| fApplyColor(graphcanvas.selected_nodes[i]); | |
| } | |
| } | |
| activeNode.setDirtyCanvas(true, true); | |
| } | |
| }; | |
| } | |
| activeNode = null; | |
| picker.value = node.bgcolor; | |
| activeNode = node; | |
| picker.click(); | |
| }; | |
| }, | |
| }, | |
| [ | |
| $el("span", { | |
| style: { | |
| paddingLeft: "4px", | |
| display: "block", | |
| }, | |
| textContent: "🎨 Custom", | |
| }), | |
| ] | |
| ); | |
| break; | |
| } | |
| } | |
| }); | |
| return r; | |
| }; | |
| }, | |
| }); | |