File size: 5,814 Bytes
8866644
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import {app} from "../../../../scripts/app.js";
import {$el} from "../../../../scripts/ui.js";
import {$t} from "../common/i18n.js";
import {findWidgetByName, toggleWidget} from "../common/utils.js";


const tags = {
    "selfie_multiclass_256x256": ["Background", "Hair", "Body", "Face", "Clothes", "Others",],
    "human_parsing_lip":["Background","Hat","Hair","Glove","Sunglasses","Upper-clothes","Dress","Coat","Socks","Pants","Jumpsuits","Scarf","Skirt","Face","Left-arm","Right-arm","Left-leg","Right-leg","Left-shoe","Right-shoe"],
}
function getTagList(tags) {
    let rlist=[]
    tags.forEach((k,i) => {
        rlist.push($el(
            "label.easyuse-prompt-styles-tag",
            {
                dataset: {
                    tag: i,
                    name: $t(k),
                    index: i
                },
                $: (el) => {
                    el.children[0].onclick = () => {
                        el.classList.toggle("easyuse-prompt-styles-tag-selected");
                    };
                },
            },
            [
                $el("input",{
                    type: 'checkbox',
                    name: i
                }),
                $el("span",{
                    textContent: $t(k),
                })
            ]
        ))
    });
    return rlist
}


app.registerExtension({
    name: 'comfy.easyUse.seg',
    async beforeRegisterNodeDef(nodeType, nodeData, app) {

        if (nodeData.name == 'easy humanSegmentation') {
            // 创建时
            const onNodeCreated = nodeType.prototype.onNodeCreated;
            nodeType.prototype.onNodeCreated = function () {
                onNodeCreated ? onNodeCreated?.apply(this, arguments) : undefined;
                const method = this.widgets.findIndex((w) => w.name == 'method');
                const list = $el("ul.easyuse-prompt-styles-list.no-top", []);
                let method_values = ''
                this.setProperty("values", [])

                let selector = this.addDOMWidget('mask_components',"btn",$el('div.easyuse-prompt-styles',[list]))

                Object.defineProperty(this.widgets[method],'value',{
                    set:(value)=>{
                        method_values = value
                        if(method_values){
                            selector.element.children[0].innerHTML = ''
                            if(method_values == 'selfie_multiclass_256x256'){
                                toggleWidget(this, findWidgetByName(this, 'confidence'), true)
                                this.setSize([300, 260]);
                            }else{
                                toggleWidget(this, findWidgetByName(this, 'confidence'))
                                this.setSize([300, 500]);
                            }
                            let list = getTagList(tags[method_values]);
                            selector.element.children[0].append(...list)
                        }
                    },
                    get: () => {
                        return method_values
                    }
                })

                let mask_select_values = ''

                Object.defineProperty(selector, "value", {
                    set: (value) => {
                        setTimeout(_=>{
                            selector.element.children[0].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
                                }
                            })
                        },100)
                    },
                    get: () => {
                        selector.element.children[0].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);
                                }
                            }
                        });
                        mask_select_values = this.properties["values"].join(',');
                        return mask_select_values;
                    }
                });

                let old_values = ''
                let mask_lists_dom = selector.element.children[0]

                // 初始化
                setTimeout(_=>{
                    if(!method_values) {
                        method_values = 'selfie_multiclass_256x256'
                        selector.element.children[0].innerHTML = ''
                        // 重新排序
                        let list = getTagList(tags[method_values]);
                        selector.element.children[0].append(...list)
                    }
                    if(method_values == 'selfie_multiclass_256x256'){
                        toggleWidget(this, findWidgetByName(this, 'confidence'), true)
                        this.setSize([300, 260]);
                    }else{
                        toggleWidget(this, findWidgetByName(this, 'confidence'))
                        this.setSize([300, 500]);
                    }
                },1)

                return onNodeCreated;
            }
        }
    }
})