import { ComfyApp, app } from "../../scripts/app.js"; import { ComfyDialog, $el } from "../../scripts/ui.js"; import { api } from "../../scripts/api.js"; async function open_picker(node) { const resp = await api.fetchApi(`/impact/segs/picker/count?id=${node.id}`); const body = await resp.text(); let cnt = parseInt(body); var existingPicker = document.getElementById('impact-picker'); if (existingPicker) { existingPicker.parentNode.removeChild(existingPicker); } var gallery = document.createElement('div'); gallery.id = 'impact-picker'; gallery.style.position = "absolute"; gallery.style.height = "80%"; gallery.style.width = "80%"; gallery.style.top = "10%"; gallery.style.left = "10%"; gallery.style.display = 'flex'; gallery.style.flexWrap = 'wrap'; gallery.style.maxHeight = '600px'; gallery.style.overflow = 'auto'; gallery.style.backgroundColor = 'rgba(0,0,0,0.3)'; gallery.style.padding = '20px'; gallery.draggable = false; gallery.style.zIndex = 5000; var doneButton = document.createElement('button'); doneButton.textContent = 'Done'; doneButton.style.padding = '10px 10px'; doneButton.style.border = 'none'; doneButton.style.borderRadius = '5px'; doneButton.style.fontFamily = 'Arial, sans-serif'; doneButton.style.fontSize = '16px'; doneButton.style.fontWeight = 'bold'; doneButton.style.color = '#fff'; doneButton.style.background = 'linear-gradient(to bottom, #0070B8, #003D66)'; doneButton.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.4)'; doneButton.style.margin = "20px"; doneButton.style.height = "40px"; var cancelButton = document.createElement('button'); cancelButton.textContent = 'Cancel'; cancelButton.style.padding = '10px 10px'; cancelButton.style.border = 'none'; cancelButton.style.borderRadius = '5px'; cancelButton.style.fontFamily = 'Arial, sans-serif'; cancelButton.style.fontSize = '16px'; cancelButton.style.fontWeight = 'bold'; cancelButton.style.color = '#fff'; cancelButton.style.background = 'linear-gradient(to bottom, #ff70B8, #ff3D66)'; cancelButton.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.4)'; cancelButton.style.margin = "20px"; cancelButton.style.height = "40px"; const w = node.widgets.find((w) => w.name == 'picks'); let prev_selected = w.value.split(',').map(function(item) { return parseInt(item, 10); }); let images = []; doneButton.onclick = () => { var result = ''; for(let i in images) { if(images[i].isSelected) { if(result != '') result += ', '; result += (parseInt(i)+1); } } w.value = result; gallery.parentNode.removeChild(gallery); } cancelButton.onclick = () => { gallery.parentNode.removeChild(gallery); } var panel = document.createElement('div'); panel.style.clear = 'both'; panel.style.width = '100%'; panel.style.height = '40px'; panel.style.justifyContent = 'center'; panel.style.alignItems = 'center'; panel.style.display = 'flex'; panel.appendChild(doneButton); panel.appendChild(cancelButton); gallery.appendChild(panel); var hint = document.createElement('label'); hint.style.position = 'absolute'; hint.innerHTML = 'Click: Toggle Selection
Ctrl-click: Single Selection'; gallery.appendChild(hint); let max_size = 300; for(let i=0; i image.naturalHeight) { ratio = max_size/image.naturalWidth; } else { ratio = max_size/image.naturalHeight; } let width = image.naturalWidth * ratio; let height = image.naturalHeight * ratio; if(width < height) { this.style.marginLeft = (200-width)/2+"px"; } else{ this.style.marginTop = (200-height)/2+"px"; } this.style.width = width+"px"; this.style.height = height+"px"; this.style.objectFit = 'cover'; } image.addEventListener('click', function(event) { if(event.ctrlKey) { for(let i in images) { if(images[i].isSelected) { images[i].style.border = 'none'; images[i].isSelected = false; } } image.style.border = '2px solid #006699'; image.isSelected = true; return; } if(image.isSelected) { image.style.border = 'none'; image.isSelected = false; } else { image.style.border = '2px solid #006699'; image.isSelected = true; } }); gallery.appendChild(image); } document.body.appendChild(gallery); } app.registerExtension({ name: "Comfy.Impack.Picker", nodeCreated(node, app) { if(node.comfyClass == "ImpactSEGSPicker") { node.addWidget("button", "pick", "image", () => { open_picker(node); }); } } });