File size: 3,199 Bytes
82ea528
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import type { TLGraphNode } from './comfy/index.js';
import { ComfyWidgets, ComfyApp } from './comfy/index.js';

export const commonPrefix = '🪛';

export function displayContext(
  nodeType: TLGraphNode,
  appFromArg: ComfyApp,
  index = 0, serialize_widgets = false, isVirtualNode = false,
): void {
  function populate(this: TLGraphNode, text: string | string[]): void {
    if (this.widgets) {
      const pos = this.widgets.findIndex((w) => w.name === 'text');
      if (pos !== -1) {
        for (let i = pos; i < this.widgets.length; i++) {

          this.widgets[i]?.onRemove?.();
        }
        this.widgets.length = pos;
      }
    }
    // If you want to do not save properties in the node (be careful with F5)
    // BUG on isVirtualNode, with "true", it ignores OUTPUT_NODE on py file!
    this.serialize_widgets = serialize_widgets;
    this.isVirtualNode = isVirtualNode;

    const widget = ComfyWidgets.STRING(this, 'text', [
      'STRING', { multiline: true },
    ], appFromArg).widget;
    widget.inputEl.readOnly = true;
    widget.inputEl.style.opacity = 0.6;
    if (Array.isArray(text) && index !== undefined && text[index] !== undefined) {
      // @ts-ignore
      text = text[index];
    }
    widget.value = text || '';
    // eslint-disable-next-line @typescript-eslint/no-empty-function
    widget.serializeValue = async(): Promise<void> => {}; // just for no serialized to itself!

    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);
      appFromArg.graph.setDirtyCanvas(true, false);
    });
  }

  // When the node is executed we will be sent the input text, display this in the widget

  // @ts-ignore
  // eslint-disable-next-line @typescript-eslint/unbound-method
  const onExecutedOriginal = nodeType.prototype.onExecuted;
  nodeType.prototype.onExecuted = function(message: { text: string }): void {
    // @ts-ignore
    onExecutedOriginal?.apply(this, arguments);
    populate.call(this, message.text);
  };

  // eslint-disable-next-line @typescript-eslint/unbound-method
  const onConfigureOriginal = nodeType.prototype.onConfigure;
  nodeType.prototype.onConfigure = function(): void {
    // @ts-ignore
    onConfigureOriginal?.apply(this, arguments);
    if (this.widgets_values?.length) {
      populate.call(this, this.widgets_values);
    }
  };
}


// propagate the output value to the dependents nodes, it does not work with some nodes ¯\_(ツ)_/¯
// const propagateOutputToDependentsNodes = function(output: serializedLGraph, value: string) {
//   if (output.links?.length) {
//     for (const l of output.links) {
//       const link_info = app.graph.links[l];
//       const outNode = app.graph.getNodeById(link_info.target_id);
//       const outIn = outNode?.inputs?.[link_info.target_slot];
//       if (outIn.widget) {
//         const widget = outNode.widgets.find((w: IWidget) => w.name === outIn.widget.name);
//         if (!widget) {
//           continue;
//         }
//         widget.value = value;
//       }
//     }
//   }
// };