Spaces:
Running
Running
import { is_UEnode } from "./use_everywhere_utilities.js"; | |
import { ComfyWidgets} from "../../scripts/widgets.js"; | |
import { app } from "../../scripts/app.js"; | |
import { LinkRenderController } from "./use_everywhere_ui.js"; | |
function update_picklist(node, inputname) { | |
const d = document.getElementById("uedynamiclist"); | |
while (d.firstChild) { d.removeChild(d.lastChild); }; | |
let options = []; | |
if (inputname=="title_regex") { options = LinkRenderController.instance().ue_list?.all_nodes_with_unmatched_input(node.input_type[0]); } | |
else if (inputname=="input_regex") { options = LinkRenderController.instance().ue_list?.all_unmatched_input_names(node.input_type[0]); } | |
else if (inputname=="group_regex") { options = LinkRenderController.instance().ue_list?.all_group_names(node.input_type[0]); } | |
options.forEach((option) => { | |
const theOption = document.createElement("option"); | |
theOption.setAttribute("value", option); | |
d.appendChild(theOption) | |
}) | |
} | |
function intersect(a, b) { | |
const x = Math.max(a.x, b.x); | |
const num1 = Math.min(a.x + a.width, b.x + b.width); | |
const y = Math.max(a.y, b.y); | |
const num2 = Math.min(a.y + a.height, b.y + b.height); | |
if (num1 >= x && num2 >= y) return [x, y, num1 - x, num2 - y]; | |
else return null; | |
} | |
function union(a,b) { | |
if (!b) return a; | |
if (!a) return b; | |
const x = Math.min(a.x, b.x); | |
const y = Math.min(a.y,b.y); | |
const width = Math.max(a.x+a.width, b.x+b.width) - x; | |
const height = Math.max(a.y+a.height, b.y+b.height) - x; | |
return { x:x, y:y, width:width, height:height }; | |
} | |
function getClipPath(node, element) { | |
const scale = app.canvas.ds.scale; | |
const widgetRect = element.getBoundingClientRect(); | |
var onTopOfMe = false; | |
var clip = null; | |
app.graph._nodes.forEach((other_node) => { | |
if (other_node.id == node.id) { | |
onTopOfMe = true; | |
} | |
else if (onTopOfMe) { | |
const MARGIN = other_node.is_selected ? 7 : 2; | |
const bounding = other_node.getBounding(); | |
const intersection = intersect( | |
{ x: widgetRect.x / scale, y: widgetRect.y / scale, width: widgetRect.width / scale, height: widgetRect.height / scale }, | |
{ | |
x: other_node.pos[0] + app.canvas.ds.offset[0] - MARGIN, | |
y: other_node.pos[1] + app.canvas.ds.offset[1] - LiteGraph.NODE_TITLE_HEIGHT - MARGIN, | |
width: bounding[2] + MARGIN + MARGIN, | |
height: bounding[3] + MARGIN + MARGIN, | |
} | |
); | |
if (intersection) { | |
clip = union(clip, { | |
x : intersection[0] - widgetRect.x / scale, | |
y : intersection[1] - widgetRect.y / scale, | |
width : intersection[2], | |
height : intersection[3] | |
}) | |
//const newpath = `0% 0%, 0% 100%, ${clipX} 100%, ${clipX} ${clipY}, calc(${clipX} + ${clipWidth}) ${clipY}, calc(${clipX} + ${clipWidth}) calc(${clipY} + ${clipHeight}), ${clipX} calc(${clipY} + ${clipHeight}), ${clipX} 100%, 100% 100%, 100% 0%`; | |
//path = path != '' ? `${path}, ${newpath}` : newpath; | |
} | |
} | |
}) | |
const path = clip ? `polygon(0% 0%, 0% 100%, ${clip.x}px 100%, ${clip.x}px ${clip.y}px, ${clip.x + clip.width}px ${clip.y}px, ${clip.x + clip.width}px ${clip.y + clip.height}px, ${clip.x}px ${clip.y + clip.height}px, ${clip.x}px 100%, 100% 100%, 100% 0%)` : ''; | |
return path; | |
} | |
function active_text_widget(node, inputname) { | |
const label = document.createElement("label"); | |
label.className = "graphdialog ueprompt"; | |
const label_text = document.createElement("span"); | |
label_text.innerText = `${inputname.substring(0,5)} `; | |
label_text.className = "ueprompttext"; | |
label.appendChild(label_text); | |
const span = document.createElement("span"); | |
span.className = "uepromptspan"; | |
label.appendChild(span); | |
const inputEl = document.createElement("input"); | |
inputEl.setAttribute("type", "text"); | |
inputEl.className = "uepromptinput"; | |
span.appendChild(inputEl); | |
const widget = node.addDOMWidget(inputname, "input", label, { | |
getValue() { return inputEl.value; }, | |
setValue(v) { inputEl.value = v; }, | |
onDraw(w) { | |
// are we the most recently selected node? | |
if (Object.values(app.canvas.selected_nodes)[0]?.id == node.id) { | |
// if so, turn off DOM clipping | |
w.element.style.clipPath = null; w.element.style.willChange = null; | |
} else { | |
w.element.style.zIndex = 0; | |
const p = getClipPath(node, w.element); | |
w.element.style.clipPath = p; | |
let a; | |
} | |
} | |
}); | |
//widget.element.hidden = true; | |
//widget.element.classList.add("ue_hide") | |
widget.element.style.display="block" | |
inputEl.onmousedown = function(e) { | |
const x = app.canvas.prompt("Value",widget.value,function(v) { this.value = v; }.bind(widget), e, false ); | |
const input = x.getElementsByClassName("value")[0]; | |
input.setAttribute("list", "uedynamiclist"); | |
input.parentNode.style.zIndex = `${parseInt(label.style.zIndex ? label.style.zIndex : '0')+1}`; | |
input.addEventListener("input", function (v) { | |
widget.value = this.value; | |
LinkRenderController.instance().mark_link_list_outdated(); | |
app.graph.setDirtyCanvas(true,true); | |
}.bind(input)); | |
update_picklist(node, inputname); | |
e.stopImmediatePropagation(); | |
} | |
widget.computeSize = function (parent_width) { | |
return parent_width ? [parent_width, 27] : [400, 20]; | |
} | |
inputEl.addEventListener("focus", () => { | |
if (inputEl.value==".*") inputEl.value = ""; | |
}); | |
widget.onModeChange = function (mode) { | |
label.style.opacity = mode==4 ? 0.2 : 1.0; | |
} | |
node.loaded_when_collapsed = function() { | |
node.widgets?.forEach((widget) => { | |
if (widget.element) { | |
widget.element.hidden = true; | |
widget.element.classList.add("ue_hide") | |
} | |
}) | |
} | |
return { widget }; | |
} | |
function activate(node, widget) { | |
if (node.flags?.collapsed) return; | |
widget.element.hidden = false; | |
widget.element.classList.remove("ue_hide") | |
} | |
function add_autoprompts() { | |
const STRING = ComfyWidgets.STRING; | |
ComfyWidgets.STRING = function (node, inputName, inputData, app) { | |
if (true || !is_UEnode(node) || !inputName?.includes("regex") || !app.ui.settings.getSettingValue('AE.autoprompt', true)) { | |
return STRING.apply(this, arguments); | |
} | |
const atw = active_text_widget(node, inputName); | |
const orig_onAdded = node.onAdded; | |
node.onAdded = function () { | |
orig_onAdded?.apply(this, arguments); | |
activate(node, atw.widget); | |
} | |
return atw; | |
} | |
const datalist = document.createElement("datalist"); | |
datalist.id = "uedynamiclist"; | |
document.body.append(datalist); | |
} | |
function node_added(node) { | |
const a = 1; | |
} | |
export { add_autoprompts } |