File size: 3,289 Bytes
1e3b872
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { app } from '../../../scripts/app.js'
// import { api } from '../../../scripts/api.js'
import { ComfyWidgets } from '../../../scripts/widgets.js'
import { $el } from '../../../scripts/ui.js'

function getRandomElements (arr, num) {
  var result = []
  var len = arr.length

  for (var i = 0; i < num; i++) {
    var randomIndex = Math.floor(Math.random() * len)
    result.push(arr[randomIndex])
  }

  return result
}

const createPrompt = (node, prompts, items, sample) => {
  const w = ComfyWidgets['STRING'](
    node,
    'text',
    ['STRING', { multiline: true }],
    app
  ).widget
  w.inputEl.readOnly = true
  w.inputEl.style.opacity = 0.6

  w.value = typeof prompts === 'string' ? prompts : prompts.join('\n\n')

  const w2 = ComfyWidgets['STRING'](
    node,
    'text',
    ['STRING', { multiline: true }],
    app
  ).widget
  w2.inputEl.readOnly = true
  w2.inputEl.style.opacity = 0.6

  w2.value = typeof items === 'string' ? items : JSON.stringify(items, null, 2)

  const w3 = ComfyWidgets['STRING'](
    node,
    'text',
    ['STRING', { multiline: true }],
    app
  ).widget
  w3.inputEl.readOnly = true
  w3.inputEl.style.opacity = 0.6
  w3.value = typeof sample === 'string' ? sample : sample.join('\n\n')
}

app.registerExtension({
  name: 'Mixlab.prompt.ClipInterrogator',
  async beforeRegisterNodeDef (nodeType, nodeData, app) {
    if (nodeData.name === 'ClipInterrogator') {
      function populate (prompts, items, random_samples) {
        if (this.widgets) {
          for (let i = 0; i < this.widgets.length; i++) {
            if (this.widgets[i].type !== 'combo') this.widgets[i].onRemove?.()
          }
          this.widgets.length = 2
        }

        createPrompt(this, prompts, items, random_samples)

        // console.log('ClipInterrogator', w, w2)
        requestAnimationFrame(() => {
          const sz = this.computeSize()
          if (sz[0] < this.size[0]) {
            sz[0] = this.size[0]
          }
          if (sz[1] < this.size[1]) {
            sz[1] = this.size[1]
          }
          this.onResize?.(sz)
          app.graph.setDirtyCanvas(true, false)
        })
      }

      // When the node is executed we will be sent the input text, display this in the widget
      const onExecuted = nodeType.prototype.onExecuted
      nodeType.prototype.onExecuted = function (message) {
        onExecuted?.apply(this, arguments)
        // console.log('##', message)
        populate.call(
          this,
          message.prompt,
          message.analysis,
          message.random_samples
        )
      }

      this.serialize_widgets = true //需要保存参数
    }
  },
  async loadedGraphNode (node, app) {
    // Fires every time a node is constructed
    // You can modify widgets/add handlers/etc here

    if (node.type === 'ClipInterrogator') {
      try {
        
        let widgets_values = node.widgets_values
        console.log(widgets_values )
        try {
          if (widgets_values[2] && widgets_values[3] && widgets_values[4])
            createPrompt(
              node,
              widgets_values[2],
              widgets_values[3],
              widgets_values[4]
            )
        } catch (error) {
          console.log(error)
        }
      } catch (error) {}
    }
  }
})