Spaces:
Configuration error
Configuration error
| // 1.0.3 | |
| import { app } from "../../../../scripts/app.js"; | |
| import { api } from "../../../../scripts/api.js"; | |
| import { $el } from "../../../../scripts/ui.js"; | |
| import { $t } from "../common/i18n.js"; | |
| // θ·ει£ζ Όε葨 | |
| let styles_list_cache = {} | |
| let styles_image_cache = {} | |
| async function getStylesList(name){ | |
| if(styles_list_cache[name]) return styles_list_cache[name] | |
| else{ | |
| const resp = await api.fetchApi(`/easyuse/prompt/styles?name=${name}`); | |
| if (resp.status === 200) { | |
| let data = await resp.json(); | |
| styles_list_cache[name] = data; | |
| return data; | |
| } | |
| return undefined; | |
| } | |
| } | |
| async function getStylesImage(name, styles_name){ | |
| if(!styles_image_cache[styles_name]) styles_image_cache[styles_name] = {} | |
| if(styles_image_cache[styles_name][name]) return styles_image_cache[styles_name][name] | |
| else{ | |
| const resp = await api.fetchApi(`/easyuse/prompt/styles/image?name=${name}&styles_name=${styles_name}`); | |
| if (resp.status === 200) { | |
| const text = await resp.text() | |
| if(text.startsWith('http')){ | |
| styles_image_cache[styles_name][name] = text | |
| return text | |
| } | |
| const url = `/easyuse/prompt/styles/image?name=${name}&styles_name=${styles_name}` | |
| styles_image_cache[styles_name][name] = url | |
| return url | |
| } | |
| return undefined; | |
| } | |
| } | |
| function getTagList(tags, styleName, language='en-US') { | |
| let rlist=[] | |
| tags.forEach((k,i) => { | |
| rlist.push($el( | |
| "label.easyuse-prompt-styles-tag", | |
| { | |
| dataset: { | |
| tag: k['name'], | |
| name: language == 'zh-CN' && k['name_cn'] ? k['name_cn'] : k['name'], | |
| imgName: k['imgName'], | |
| index: i | |
| }, | |
| $: (el) => { | |
| el.children[0].onclick = () => { | |
| el.classList.toggle("easyuse-prompt-styles-tag-selected"); | |
| }; | |
| el.onmousemove = (e) => { | |
| displayImage(el.dataset.imgName, styleName, e) | |
| }; | |
| el.onmouseout = () => { | |
| hiddenImage() | |
| }; | |
| el.onmouseover = (e) => { | |
| displayImage(el.dataset.imgName, styleName) | |
| }; | |
| }, | |
| }, | |
| [ | |
| $el("input",{ | |
| type: 'checkbox', | |
| name: k['name'] | |
| }), | |
| $el("span",{ | |
| textContent: language == 'zh-CN' && k['name_cn'] ? k['name_cn'] : k['name'], | |
| }) | |
| ] | |
| )) | |
| }); | |
| return rlist | |
| } | |
| const foocus_base_path = "https://raw.githubusercontent.com/lllyasviel/Fooocus/main/sdxl_styles/samples/" | |
| const empty_img = "data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QNLaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA5LjEtYzAwMSA3OS4xNDYyODk5Nzc3LCAyMDIzLzA2LzI1LTIzOjU3OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuMSAoMjAyMzA5MDUubS4yMzE2IDk3OWM4NmQpICAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjA3NEU1QzNCNUJBMTFFRUExMUVDNkZDRjI0NzlBN0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjA3NEU1QzRCNUJBMTFFRUExMUVDNkZDRjI0NzlBN0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpGMDc0RTVDMUI1QkExMUVFQTExRUM2RkNGMjQ3OUE3RCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGMDc0RTVDMkI1QkExMUVFQTExRUM2RkNGMjQ3OUE3RCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv/uAA5BZG9i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" | |
| async function displayImage(imgName, styleName) { | |
| var e = event || window.event; | |
| var img = document.getElementById("show_image_id"); | |
| var pxy= img.parentElement.getBoundingClientRect(); | |
| if(imgName) { | |
| const url = await getStylesImage(imgName, styleName) | |
| img.src = url | |
| img.onerror = _ =>{ | |
| img.src = empty_img | |
| } | |
| } | |
| var scale = app?.canvas?.ds?.scale || 1; | |
| var x = (e.pageX-pxy.x-100)/scale; | |
| var y = (e.pageY-pxy.y+25)/scale; | |
| img.style.left = x+"px"; | |
| img.style.top = y+"px"; | |
| img.style.display = "block"; | |
| img.style.borderRadius = "10px"; | |
| img.style.borderColor = "var(--fg-color)" | |
| img.style.borderWidth = "1px"; | |
| img.style.borderStyle = "solid"; | |
| } | |
| function hiddenImage(){ //theEventη¨ζ₯δΌ ε ₯δΊδ»ΆοΌFirefoxηζΉεΌ | |
| var img = document.getElementById('show_image_id'); | |
| img.style.display = "none"; | |
| } | |
| // StylePromptSelector | |
| app.registerExtension({ | |
| name: 'comfy.easyUse.styleSelector', | |
| async beforeRegisterNodeDef(nodeType, nodeData, app) { | |
| if(nodeData.name == 'easy stylesSelector'){ | |
| // εε»ΊζΆ | |
| const onNodeCreated = nodeType.prototype.onNodeCreated; | |
| nodeType.prototype.onNodeCreated = function() { | |
| onNodeCreated ? onNodeCreated?.apply(this, arguments) : undefined; | |
| const styles_id = this.widgets.findIndex((w) => w.name == 'styles'); | |
| const language = localStorage['AGL.Locale'] || localStorage['Comfy.Settings.AGL.Locale'] || 'en-US' | |
| const list = $el("ul.easyuse-prompt-styles-list",[]); | |
| let styles_values = '' | |
| this.setProperty("values", []) | |
| let selector = this.addDOMWidget('select_styles',"btn",$el('div.easyuse-prompt-styles',[$el('div.tools', [ | |
| $el('button.delete',{ | |
| textContent: $t('Empty All'), | |
| style:{}, | |
| onclick:()=>{ | |
| selector.element.children[0].querySelectorAll(".search").forEach(el=>{ | |
| el.value = '' | |
| }) | |
| selector.element.children[1].querySelectorAll(".easyuse-prompt-styles-tag-selected").forEach(el => { | |
| el.classList.remove("easyuse-prompt-styles-tag-selected"); | |
| el.children[0].checked = false | |
| }) | |
| selector.element.children[1].querySelectorAll(".easyuse-prompt-styles-tag").forEach(el => { | |
| el.classList.remove('hide') | |
| }) | |
| this.setProperty("values", []) | |
| }} | |
| ), | |
| $el('textarea.search',{ | |
| dir:"ltr", | |
| style:{"overflow-y": "scroll"}, | |
| rows:1, | |
| placeholder:$t("π Type here to search styles ..."), | |
| oninput:(e)=>{ | |
| let value = e.target.value | |
| selector.element.children[1].querySelectorAll(".easyuse-prompt-styles-tag").forEach(el => { | |
| const name = el.dataset.name.toLowerCase() | |
| const tag = el.dataset.tag.toLowerCase() | |
| const lower_value = value.toLowerCase() | |
| if(name.indexOf(lower_value) != -1 || tag.indexOf(lower_value) != -1 || el.classList.value.indexOf("easyuse-prompt-styles-tag-selected")!=-1){ | |
| el.classList.remove('hide') | |
| } | |
| else{ | |
| el.classList.add('hide') | |
| } | |
| }) | |
| } | |
| }) | |
| ]),list, | |
| $el('img',{id:'show_image_id', | |
| style:{display:'none',position:'absolute'}, | |
| src:``, | |
| onerror:()=>{ | |
| this.src = empty_img | |
| } | |
| }) | |
| ])); | |
| Object.defineProperty(this.widgets[styles_id],'value',{ | |
| set:(value)=>{ | |
| styles_values = value | |
| if(styles_values){ | |
| getStylesList(styles_values).then(_=>{ | |
| selector.element.children[1].innerHTML='' | |
| if(styles_list_cache[styles_values]){ | |
| let tags = styles_list_cache[styles_values] | |
| // ιζ°ζεΊ | |
| if(selector.value) tags = tags.sort((a,b)=> selector.value.includes(b.name) - selector.value.includes(a.name)) | |
| this.properties["values"] = [] | |
| let list = getTagList(tags, value, language); | |
| selector.element.children[1].append(...list) | |
| selector.element.children[1].querySelectorAll(".easyuse-prompt-styles-tag").forEach(el => { | |
| if (this.properties["values"].includes(el.dataset.tag)) { | |
| el.classList.add("easyuse-prompt-styles-tag-selected"); | |
| } | |
| if(this.size?.[0]<150 || this.size?.[1]<150) this.setSize([425, 500]); | |
| }) | |
| } | |
| }) | |
| } | |
| }, | |
| get: () => { | |
| return styles_values | |
| } | |
| }) | |
| let style_select_values = '' | |
| Object.defineProperty(selector, "value", { | |
| set: (value) => { | |
| setTimeout(_=>{ | |
| selector.element.children[1].querySelectorAll(".easyuse-prompt-styles-tag").forEach(el => { | |
| let arr = value.split(',') | |
| if (arr.includes(el.dataset.tag)) { | |
| el.classList.add("easyuse-prompt-styles-tag-selected"); | |
| el.children[0].checked = true | |
| } | |
| }) | |
| },300) | |
| }, | |
| get: () => { | |
| selector.element.children[1].querySelectorAll(".easyuse-prompt-styles-tag").forEach(el => { | |
| if(el.classList.value.indexOf("easyuse-prompt-styles-tag-selected")>=0){ | |
| if(!this.properties["values"].includes(el.dataset.tag)){ | |
| this.properties["values"].push(el.dataset.tag); | |
| } | |
| }else{ | |
| if(this.properties["values"].includes(el.dataset.tag)){ | |
| this.properties["values"]= this.properties["values"].filter(v=>v!=el.dataset.tag); | |
| } | |
| } | |
| }); | |
| style_select_values = this.properties["values"].join(','); | |
| return style_select_values; | |
| } | |
| }); | |
| let old_values = '' | |
| let style_lists_dom = selector.element.children[1] | |
| style_lists_dom.addEventListener('mouseenter', function (e) { | |
| let value = '' | |
| style_lists_dom.querySelectorAll(".easyuse-prompt-styles-tag-selected").forEach(el=> value+=el.dataset.tag) | |
| old_values = value | |
| }) | |
| style_lists_dom.addEventListener('mouseleave', function (e) { | |
| let value = '' | |
| style_lists_dom.querySelectorAll(".easyuse-prompt-styles-tag-selected").forEach(el=> value+=el.dataset.tag) | |
| let new_values = value | |
| if(old_values != new_values){ | |
| // console.log("ιι‘ΉεηδΊεε") | |
| // θ·εζη΄’εΌ | |
| const search_value = document.getElementsByClassName('search')[0]['value'] | |
| // ιζ°ζεΊ | |
| const tags = styles_list_cache[styles_values].sort((a,b)=> new_values.includes(b.name) - new_values.includes(a.name)) | |
| style_lists_dom.innerHTML = '' | |
| let list = getTagList(tags, styles_values, language); | |
| style_lists_dom.append(...list) | |
| style_lists_dom.querySelectorAll(".easyuse-prompt-styles-tag").forEach(el => { | |
| if (new_values.includes(el.dataset.tag)) { | |
| el.classList.add("easyuse-prompt-styles-tag-selected"); | |
| el.children[0].checked = true; | |
| } | |
| if(search_value){ | |
| if(el.dataset.name.indexOf(search_value) != -1 || el.dataset.tag.indexOf(search_value) != -1 || el.classList.value.indexOf("easyuse-prompt-styles-tag-selected")!=-1){ | |
| el.classList.remove('hide') | |
| } | |
| else{ | |
| el.classList.add('hide') | |
| } | |
| } | |
| }) | |
| } | |
| }) | |
| // εε§ε | |
| setTimeout(_=>{ | |
| if(!styles_values) { | |
| styles_values = 'fooocus_styles' | |
| getStylesList(styles_values).then(_=>{ | |
| selector.element.children[1].innerHTML='' | |
| if(styles_list_cache[styles_values]){ | |
| let tags = styles_list_cache[styles_values] | |
| // ιζ°ζεΊ | |
| if(selector.value) tags = tags.sort((a,b)=> selector.value.includes(b.name) - selector.value.includes(a.name)) | |
| let list = getTagList(tags, styles_values, language); | |
| selector.element.children[1].append(...list) | |
| } | |
| }) | |
| } | |
| if(this.size?.[0]<150 || this.size?.[1]<150) this.setSize([425, 500]); | |
| // | |
| },100) | |
| return onNodeCreated; | |
| } | |
| } | |
| } | |
| }) |