groupOptions.js 4.98 KB
Newer Older
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";

function setNodeMode(node, mode) {
    node.mode = mode;
    node.graph.change();
}

app.registerExtension({
    name: "Comfy.GroupOptions",
    setup() {
        const orig = LGraphCanvas.prototype.getCanvasMenuOptions;
        // graph_mouse
        LGraphCanvas.prototype.getCanvasMenuOptions = function () {
            const options = orig.apply(this, arguments);
            const group = this.graph.getGroupOnPos(this.graph_mouse[0], this.graph_mouse[1]);
            if (!group) {
                return options;
            }

            // Group nodes aren't recomputed until the group is moved, this ensures the nodes are up-to-date
            group.recomputeInsideNodes();
            const nodesInGroup = group._nodes;

            // No nodes in group, return default options
            if (nodesInGroup.length === 0) {
                return options;
            } else {
                // Add a separator between the default options and the group options
                options.push(null);
            }

            // Check if all nodes are the same mode
            let allNodesAreSameMode = true;
            for (let i = 1; i < nodesInGroup.length; i++) {
                if (nodesInGroup[i].mode !== nodesInGroup[0].mode) {
                    allNodesAreSameMode = false;
                    break;
                }
            }

            // Modes
            // 0: Always
            // 2: Never
            // 4: Bypass
            // If all nodes are the same mode, add a menu option to change the mode
            if (allNodesAreSameMode) {
                const mode = nodesInGroup[0].mode;
                // All nodes are always, option to disable, and bypass
                if (mode === 0) {
                    options.push({
                        content: "Disable Group Nodes",
                        callback: () => {
                            for (const node of nodesInGroup) {
                                setNodeMode(node, 2);
                            }
                        }
                    });
                    options.push({
                        content: "Bypass Group Nodes",
                        callback: () => {
                            for (const node of nodesInGroup) {
                                setNodeMode(node, 4);
                            }
                        }
                    })
                }
                // All nodes are never, option to enable, and bypass
                if (mode === 2) {
                    options.push({
                        content: "Enable Group Nodes",
                        callback: () => {
                            for (const node of nodesInGroup) {
                                setNodeMode(node, 0);
                            }
                        }
                    });
                    options.push({
                        content: "Bypass Group Nodes",
                        callback: () => {
                            for (const node of nodesInGroup) {
                                setNodeMode(node, 4);
                            }
                        }
                    })
                }
                // All nodes are bypass, option to enable, and disable
                if (mode === 4) {
                    options.push({
                        content: "Enable Group Nodes",
                        callback: () => {
                            for (const node of nodesInGroup) {
                                setNodeMode(node, 0);
                            }
                        }
                    });
                    options.push({
                        content: "Disable Group Nodes",
                        callback: () => {
                            for (const node of nodesInGroup) {
                                setNodeMode(node, 2);
                            }
                        }
                    })
                }
            } else {
                // Nodes are not all the same mode, add a menu option to change the mode to always, never, or bypass
                options.push({
                    content: "Enable Group Nodes",
                    callback: () => {
                        for (const node of nodesInGroup) {
                            setNodeMode(node, 0);
                        }
                    }
                });
                options.push({
                    content: "Disable Group Nodes",
                    callback: () => {
                        for (const node of nodesInGroup) {
                            setNodeMode(node, 2);
                        }
                    }
                });
                options.push({
                    content: "Bypass Group Nodes",
                    callback: () => {
                        for (const node of nodesInGroup) {
                            setNodeMode(node, 4);
                        }
                    }
                });
            }

            return options
        }
    }
});