@elicdavis/node-flow 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,761 @@
1
+ interface Vector2 {
2
+ x: number;
3
+ y: number;
4
+ }
5
+
6
+ declare enum FontWeight {
7
+ Normal = "",
8
+ Bold = "bold"
9
+ }
10
+ declare enum FontStyle {
11
+ Normal = "",
12
+ Italic = "italic"
13
+ }
14
+ interface TextStyleConfig {
15
+ size?: number;
16
+ color?: string;
17
+ font?: string;
18
+ weight?: FontWeight;
19
+ style?: FontStyle;
20
+ }
21
+
22
+ interface ContextMenuItemConfig {
23
+ name?: string;
24
+ textStyle?: TextStyleConfig;
25
+ group?: string;
26
+ callback?: () => void;
27
+ }
28
+ interface ContextMenuConfig {
29
+ name?: string;
30
+ textStyle?: TextStyleConfig;
31
+ group?: string;
32
+ subMenus?: Array<ContextMenuConfig>;
33
+ items?: Array<ContextMenuItemConfig>;
34
+ }
35
+
36
+ declare class Camera {
37
+ zoom: number;
38
+ position: Vector2;
39
+ constructor();
40
+ screenSpaceToGraphSpace(screenPosition: Vector2, out: Vector2): void;
41
+ graphSpaceToScreenSpace(graphPosition: Vector2, out: Vector2): void;
42
+ reset(): void;
43
+ }
44
+
45
+ interface ConnectionRendererParams {
46
+ ctx: CanvasRenderingContext2D;
47
+ start: Vector2;
48
+ end: Vector2;
49
+ graphScale: number;
50
+ mouseOver: boolean;
51
+ inNode: FlowNode | null;
52
+ inPort: Port | null;
53
+ outNode: FlowNode | null;
54
+ outPort: Port | null;
55
+ }
56
+ type ConnectionRenderer = (params: ConnectionRendererParams) => void;
57
+ declare class Connection {
58
+ #private;
59
+ constructor(inNode: FlowNode | null, inNodePortIndex: number, outNode: FlowNode | null, outNodePortIndex: number, renderer: ConnectionRenderer);
60
+ render(ctx: CanvasRenderingContext2D, graphScale: number, mouseOver: boolean, mousePosition: Vector2 | undefined): void;
61
+ inNode(): FlowNode | null;
62
+ outNode(): FlowNode | null;
63
+ clearPort(mousePosition: Vector2): void;
64
+ clearPorts(): void;
65
+ setInput(node: FlowNode, portIndex: number, replace?: boolean): void;
66
+ setOutput(node: FlowNode, portIndex: number): void;
67
+ clearInput(): void;
68
+ clearOutput(): void;
69
+ mouseOverPort(mousePosition: Vector2): Port | null;
70
+ outPort(): Port | null;
71
+ inPort(): Port | null;
72
+ referencesNode(node: FlowNode): boolean;
73
+ }
74
+
75
+ declare enum CursorStyle {
76
+ Default = "default",
77
+ Pointer = "pointer",
78
+ Grab = "grab",
79
+ Grabbing = "grabbing",
80
+ Wait = "wait",
81
+ Help = "help",
82
+ Crosshair = "crosshair",
83
+ Cell = "cell",
84
+ Text = "text",
85
+ Move = "move",
86
+ NotAllowed = "not-allowed",
87
+ ZoomIn = "zoom-in",
88
+ ZoomOut = "zoom-out",
89
+ None = "none",
90
+ ContextMenu = "context-menu"
91
+ }
92
+
93
+ interface RenderResults {
94
+ cursorStyle?: CursorStyle;
95
+ }
96
+ interface GraphSubsystem {
97
+ render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined;
98
+ openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null;
99
+ /**
100
+ * Event for when the graph is clicked.
101
+ *
102
+ * Returns whether or not the subsystem had one of it's elements clicked on
103
+ *
104
+ * @param mousePosition Where the mouse is on the graph
105
+ * @param ctrlKey Whether or not the ctrl key is pressed
106
+ */
107
+ clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean;
108
+ mouseDragEvent(delta: Vector2, scale: number): boolean;
109
+ fileDrop(file: File): boolean;
110
+ clickEnd(): void;
111
+ }
112
+
113
+ type RenderLambda = () => void;
114
+ /**
115
+ * Generic subsystem meant for other sybsystems to pass whatever to to render
116
+ * at a certain time.
117
+ *
118
+ * Initial inspriation is for a subsytem to submit something to render on top
119
+ * of all other subsystems.
120
+ */
121
+ declare class PassSubsystem {
122
+ #private;
123
+ constructor();
124
+ queue(lambda: RenderLambda): void;
125
+ render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined;
126
+ openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null;
127
+ clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean;
128
+ mouseDragEvent(delta: Vector2, scale: number): boolean;
129
+ fileDrop(file: File): boolean;
130
+ clickEnd(): void;
131
+ }
132
+
133
+ interface Box {
134
+ Position: Vector2;
135
+ Size: Vector2;
136
+ }
137
+
138
+ declare enum PortType {
139
+ Input = "INPUT",
140
+ Output = "OUTPUT",
141
+ InputArray = "INPUTARRAY"
142
+ }
143
+ interface PortStyle {
144
+ size?: number;
145
+ fillColor?: string;
146
+ borderColor?: string;
147
+ borderSize?: number;
148
+ }
149
+ type ConnectionChangeCallback = (connection: Connection, connectionIndex: number, port: Port, portType: PortType, node: FlowNode) => void;
150
+ interface PortConfig {
151
+ name?: string;
152
+ type?: string;
153
+ array?: boolean;
154
+ emptyStyle?: PortStyle;
155
+ filledStyle?: PortStyle;
156
+ onConnectionAdded?: ConnectionChangeCallback;
157
+ onConnectionRemoved?: ConnectionChangeCallback;
158
+ }
159
+ declare class Port {
160
+ #private;
161
+ constructor(node: FlowNode, portType: PortType, config?: PortConfig);
162
+ addConnection(connection: Connection): void;
163
+ replaceConnection(connection: Connection, index: number): void;
164
+ addConnectionAddedListener(callback: ConnectionChangeCallback): void;
165
+ connections(): Array<Connection>;
166
+ addConnectionRemovedListener(callback: ConnectionChangeCallback): void;
167
+ clearConnection(connection: Connection): void;
168
+ getDataType(): string;
169
+ getPortType(): PortType;
170
+ getDisplayName(): string;
171
+ filledStyleColor(): string;
172
+ render(ctx: CanvasRenderingContext2D, position: Vector2, camera: Camera, mousePosition: Vector2 | undefined, postProcess: PassSubsystem): Box;
173
+ }
174
+
175
+ interface Widget {
176
+ Size(): Vector2;
177
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
178
+ ClickStart(): void;
179
+ ClickEnd(): void;
180
+ }
181
+
182
+ interface StrokeStyleConfig {
183
+ size?: number;
184
+ color?: string;
185
+ }
186
+
187
+ interface BoxStyleConfig {
188
+ border?: StrokeStyleConfig;
189
+ color?: string;
190
+ radius?: number;
191
+ }
192
+
193
+ interface Metadata {
194
+ [name: string]: any;
195
+ }
196
+
197
+ type AnyPropertyChangeCallback = (propertyName: string, oldValue: any, newValue: any) => void;
198
+ type PropertyChangeCallback = (oldValue: any, newValue: any) => void;
199
+ type TitleChangeCallback = (node: FlowNode, oldTitle: string, newTitle: string) => void;
200
+ type InfoChangeCallback = (node: FlowNode, oldInfo: string, newInfo: string) => void;
201
+ interface WidgetConfig {
202
+ type?: string;
203
+ config?: any;
204
+ }
205
+ interface FlowNodeTitleConfig {
206
+ textStyle?: TextStyleConfig;
207
+ color?: string;
208
+ padding?: number;
209
+ }
210
+ interface FlowNodeStyle {
211
+ title?: FlowNodeTitleConfig;
212
+ idle?: BoxStyleConfig;
213
+ mouseOver?: BoxStyleConfig;
214
+ grabbed?: BoxStyleConfig;
215
+ selected?: BoxStyleConfig;
216
+ portText?: TextStyleConfig;
217
+ }
218
+ interface FlowNodeConfig {
219
+ position?: Vector2;
220
+ title?: string;
221
+ subTitle?: string;
222
+ info?: string;
223
+ locked?: boolean;
224
+ data?: Metadata;
225
+ contextMenu?: ContextMenuConfig;
226
+ metadata?: any;
227
+ canEditTitle?: boolean;
228
+ canEditInfo?: boolean;
229
+ canEditPorts?: boolean;
230
+ inputs?: Array<PortConfig>;
231
+ outputs?: Array<PortConfig>;
232
+ onGrab?: () => void;
233
+ onRelease?: () => void;
234
+ onSelect?: () => void;
235
+ onUnselect?: () => void;
236
+ onDragStop?: (FlowNode: FlowNode) => void;
237
+ onFileDrop?: (file: File) => void;
238
+ onTitleChange?: TitleChangeCallback;
239
+ onInfoChange?: InfoChangeCallback;
240
+ widgets?: Array<WidgetConfig>;
241
+ style?: FlowNodeStyle;
242
+ }
243
+ declare enum NodeState {
244
+ Idle = 0,
245
+ MouseOver = 1,
246
+ Grabbed = 2
247
+ }
248
+ interface NodeIntersection {
249
+ Node?: FlowNode;
250
+ Port?: Port;
251
+ PortIndex?: number;
252
+ PortIsInput?: boolean;
253
+ Widget?: Widget;
254
+ WidgetIndex?: number;
255
+ }
256
+ declare class FlowNode {
257
+ #private;
258
+ constructor(config?: FlowNodeConfig);
259
+ metadata(): any;
260
+ selected(): boolean;
261
+ select(): void;
262
+ raiseDragStoppedEvent(): void;
263
+ addTitleChangeListener(callback: TitleChangeCallback): void;
264
+ addInfoChangeListener(callback: InfoChangeCallback): void;
265
+ addDragStoppedListener(callback: (node: FlowNode) => void): void;
266
+ addAnyPropertyChangeListener(callback: AnyPropertyChangeCallback): void;
267
+ addPropertyChangeListener(name: string, callback: PropertyChangeCallback): void;
268
+ setProperty(name: string, value: any): void;
269
+ getProperty(name: string): any;
270
+ contextMenu(): ContextMenuConfig;
271
+ unselect(): void;
272
+ addUnselectListener(callback: () => void): void;
273
+ addSelectListener(callback: () => void): void;
274
+ dropFile(file: File): void;
275
+ addFileDropListener(callback: (file: File) => void): void;
276
+ locked(): boolean;
277
+ lock(): void;
278
+ unlock(): void;
279
+ setPosition(position: Vector2): void;
280
+ getPosition(): Vector2;
281
+ calculateBounds(ctx: CanvasRenderingContext2D, camera: Camera): Box;
282
+ addInput(config: PortConfig): Port;
283
+ addOutput(config: PortConfig): Port;
284
+ addWidget(widget: Widget): void;
285
+ getWidget(index: number): Widget;
286
+ widgetCount(): number;
287
+ translate(delta: Vector2): void;
288
+ inBounds(ctx: CanvasRenderingContext2D, camera: Camera, position: Vector2): NodeIntersection;
289
+ canEditTitle(): boolean;
290
+ canEditPorts(): boolean;
291
+ title(): string;
292
+ setTitle(newTitle: string): void;
293
+ setInfo(newInfo: string): void;
294
+ inputPortPosition(index: number): Box;
295
+ inputPort(index: number): Port;
296
+ inputs(): number;
297
+ outputPortPosition(index: number): Box;
298
+ outputPort(index: number): Port;
299
+ outputs(): number;
300
+ render(ctx: CanvasRenderingContext2D, camera: Camera, state: NodeState, mousePosition: Vector2 | undefined, postProcess: PassSubsystem): void;
301
+ }
302
+
303
+ type NodeAddedCallback = (node: FlowNode) => void;
304
+ type NodeRemovedCallback = (node: FlowNode) => void;
305
+ interface ConnectionRendererConfiguration {
306
+ size?: number;
307
+ color?: string;
308
+ mouseOverSize?: number;
309
+ mouseOverColor?: string;
310
+ renderer?: ConnectionRenderer;
311
+ }
312
+ interface NodeSubsystemConfig {
313
+ idleConnection?: ConnectionRendererConfiguration;
314
+ nodes?: NodeFactoryConfig;
315
+ }
316
+ declare class NodeSubsystem {
317
+ #private;
318
+ constructor(postProcessPass: PassSubsystem, config?: NodeSubsystemConfig);
319
+ addPublisher(identifier: string, publisher: Publisher): void;
320
+ addOnNodeCreatedListener(callback: NodeCreatedCallback): void;
321
+ nodeFactory(): NodeFactory;
322
+ addOnNodeAddedListener(callback: NodeAddedCallback): void;
323
+ addOnNodeRemovedListener(callback: NodeRemovedCallback): void;
324
+ clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): boolean;
325
+ mouseDragEvent(delta: Vector2, scale: number): boolean;
326
+ clearNodeInputConnection(node: FlowNode, index: number): void;
327
+ clickEnd(): void;
328
+ connectNodes(nodeOut: FlowNode, outPort: number, nodeIn: FlowNode, inPort: number): Connection | undefined;
329
+ getNodes(): Array<FlowNode>;
330
+ /**
331
+ * Returns all nodes who are connected to the inputs of the
332
+ * node in question
333
+ *
334
+ * @param nodeIndex index of the node to examine inputs to
335
+ */
336
+ connectedInputsNodeReferencesByIndex(nodeIndex: number): Array<FlowNode>;
337
+ connectedInputsNodeReferences(node: FlowNode): Array<FlowNode>;
338
+ connectedOutputsNodeReferences(nodeIndex: number): Array<FlowNode>;
339
+ addNode(node: FlowNode): void;
340
+ fileDrop(file: File): boolean;
341
+ organize(ctx: CanvasRenderingContext2D): void;
342
+ openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig | null;
343
+ render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults | undefined;
344
+ }
345
+
346
+ interface PublisherNodes {
347
+ [name: string]: FlowNodeConfig;
348
+ }
349
+ interface PublisherConfig {
350
+ name?: string;
351
+ description?: string;
352
+ version?: string;
353
+ nodes?: PublisherNodes;
354
+ }
355
+ declare class Publisher {
356
+ #private;
357
+ constructor(config?: PublisherConfig);
358
+ nodes(): Map<string, FlowNodeConfig>;
359
+ register(nodeType: string, config: FlowNodeConfig): void;
360
+ contextMenu(graph: NodeSubsystem, position: Vector2): ContextMenuConfig;
361
+ create(nodeType: string): FlowNode;
362
+ }
363
+
364
+ type NodeCreatedCallback = (publisher: string, nodeType: string, node: FlowNode) => void;
365
+ interface NodeFactoryPublishers {
366
+ [name: string]: PublisherConfig;
367
+ }
368
+ interface NodeFactoryConfig {
369
+ publishers?: NodeFactoryPublishers;
370
+ onNodeCreated?: NodeCreatedCallback;
371
+ }
372
+ declare class NodeFactory {
373
+ #private;
374
+ constructor(config?: NodeFactoryConfig);
375
+ addOnNodeCreatedListener(callback: NodeCreatedCallback): void;
376
+ addPublisher(identifier: string, publisher: Publisher): void;
377
+ create(publisher: string, nodeType: string): FlowNode;
378
+ newNodeSubmenus(graph: NodeSubsystem, position: Vector2): Array<ContextMenuConfig>;
379
+ openMenu(graph: NodeSubsystem, position: Vector2): ContextMenuConfig;
380
+ }
381
+
382
+ type NoteContentChangeCallback = (node: FlowNote, newContents: string) => void;
383
+ type NoteWidthChangeCallback = (node: FlowNote, newWidth: number) => void;
384
+ interface FlowNoteConfig {
385
+ text?: string;
386
+ style?: TextStyleConfig;
387
+ metadata?: Metadata;
388
+ position?: Vector2;
389
+ width?: number;
390
+ locked?: boolean;
391
+ onWidthChange?: NoteWidthChangeCallback;
392
+ onContentChange?: NoteContentChangeCallback;
393
+ }
394
+ declare enum DragHandle {
395
+ None = 0,
396
+ Left = 1,
397
+ Right = 2
398
+ }
399
+ declare class FlowNote {
400
+ #private;
401
+ constructor(config?: FlowNoteConfig);
402
+ setText(text: string): void;
403
+ setMetadataProperty(name: string, value: any): void;
404
+ getMetadataProperty(name: string): any;
405
+ text(): string;
406
+ width(): number;
407
+ position(): Vector2;
408
+ translate(delta: Vector2): void;
409
+ setPosition(position: Vector2): void;
410
+ handleSelected(): DragHandle;
411
+ selectHandle(handle: DragHandle): void;
412
+ setWidth(newWidth: number): void;
413
+ addWidthChangeListener(callback: NoteWidthChangeCallback): void;
414
+ addContentChangeListener(callback: NoteContentChangeCallback): void;
415
+ render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): void;
416
+ leftResizeHandleBox(): Box;
417
+ rightResizeHandleBox(): Box;
418
+ edittingLayout(): boolean;
419
+ setHovering(hovering: boolean): void;
420
+ editContent(): void;
421
+ lock(): void;
422
+ unlock(): void;
423
+ bounds(): Box;
424
+ }
425
+
426
+ type NoteAddedCallback = (addedNote: FlowNote) => void;
427
+ type NoteRemovedCallback = (noteRemoved: FlowNote) => void;
428
+ type NoteDragStartCallback = (nodeDragged: FlowNote) => void;
429
+ type NoteDragStopCallback = (nodeDragged: FlowNote) => void;
430
+ interface NoteSubsystemConfig {
431
+ onNoteAdded?: NoteAddedCallback;
432
+ onNoteRemoved?: NoteRemovedCallback;
433
+ onNoteDragStop?: NoteDragStopCallback;
434
+ onNoteDragStart?: NoteDragStartCallback;
435
+ notes?: Array<FlowNoteConfig>;
436
+ }
437
+
438
+ type GraphRenderer = (canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, position: Vector2, scale: number) => void;
439
+ interface FlowNodeGraphConfiguration {
440
+ backgroundRenderer?: GraphRenderer;
441
+ backgroundColor?: string;
442
+ idleConnection?: ConnectionRendererConfiguration;
443
+ contextMenu?: ContextMenuConfig;
444
+ nodes?: NodeFactoryConfig;
445
+ board?: NoteSubsystemConfig;
446
+ }
447
+ declare class GraphView {
448
+ #private;
449
+ constructor(subsystems: Array<GraphSubsystem>);
450
+ clickStart(mousePosition: Vector2, camera: Camera, ctrlKey: boolean): void;
451
+ fileDrop(file: File): boolean;
452
+ openContextMenu(ctx: CanvasRenderingContext2D, position: Vector2): ContextMenuConfig;
453
+ clickEnd(): void;
454
+ mouseDragEvent(delta: Vector2, scale: number): boolean;
455
+ render(ctx: CanvasRenderingContext2D, camera: Camera, mousePosition: Vector2 | undefined): RenderResults;
456
+ }
457
+ declare class NodeFlowGraph {
458
+ #private;
459
+ constructor(canvas: HTMLCanvasElement, config?: FlowNodeGraphConfiguration);
460
+ addNoteAddedListener(callback: NoteAddedCallback): void;
461
+ addNoteRemovedListener(callback: NoteRemovedCallback): void;
462
+ addNoteDragStartListener(callback: NoteDragStartCallback): void;
463
+ addNoteDragStopListener(callback: NoteDragStopCallback): void;
464
+ zoom(amount: number): void;
465
+ currentView(): GraphView;
466
+ organize(): void;
467
+ addPublisher(identifier: string, publisher: Publisher): void;
468
+ getNodes(): Array<FlowNode>;
469
+ connectedInputsNodeReferences(nodeIndex: number): Array<FlowNode>;
470
+ connectedOutputsNodeReferences(nodeIndex: number): Array<FlowNode>;
471
+ connectNodes(nodeOut: FlowNode, outPort: number, nodeIn: FlowNode, inPort: number): Connection | undefined;
472
+ addNode(node: FlowNode): void;
473
+ addNote(note: FlowNote): void;
474
+ addOnNodeCreatedListener(callback: NodeCreatedCallback): void;
475
+ addOnNodeAddedListener(callback: NodeAddedCallback): void;
476
+ addOnNodeRemovedListener(callback: NodeRemovedCallback): void;
477
+ }
478
+
479
+ declare const Theme: {
480
+ FontFamily: string;
481
+ Graph: {
482
+ BackgroundColor: string;
483
+ };
484
+ Node: {
485
+ FontColor: string;
486
+ BackgroundColor: string;
487
+ Title: {
488
+ Color: string;
489
+ FontColor: string;
490
+ Padding: number;
491
+ };
492
+ BorderRadius: number;
493
+ Border: {
494
+ Idle: string;
495
+ MouseOver: string;
496
+ Grabbed: string;
497
+ Selected: string;
498
+ };
499
+ Port: {
500
+ FontColor: string;
501
+ };
502
+ };
503
+ BoxSelect: {
504
+ Color: string;
505
+ Size: number;
506
+ Radius: number;
507
+ LineDashLength: number;
508
+ };
509
+ Widget: {
510
+ FontColor: string;
511
+ BackgroundColor: string;
512
+ Border: {
513
+ Color: string;
514
+ Size: number;
515
+ Radius: number;
516
+ };
517
+ Hover: {
518
+ BackgroundColor: string;
519
+ };
520
+ Slider: {
521
+ FillColor: string;
522
+ };
523
+ Button: {
524
+ Click: {
525
+ BackgroundColor: string;
526
+ };
527
+ };
528
+ };
529
+ ContextMenu: {
530
+ BackgroundColor: string;
531
+ HighlightColor: string;
532
+ FontColor: string;
533
+ };
534
+ Note: {
535
+ FontColor: string;
536
+ FontSize: number;
537
+ EntrySpacing: number;
538
+ LineSpacing: number;
539
+ DotSize: number;
540
+ HeaderLineWidth: number;
541
+ H1: {
542
+ FontSize: number;
543
+ };
544
+ H2: {
545
+ FontSize: number;
546
+ };
547
+ H3: {
548
+ FontSize: number;
549
+ };
550
+ CodeBlock: {
551
+ BackgroundColor: string;
552
+ Padding: number;
553
+ BorderRadius: number;
554
+ };
555
+ };
556
+ };
557
+
558
+ interface TextBoxStyleConfig {
559
+ box?: BoxStyleConfig;
560
+ text?: TextStyleConfig;
561
+ textAlign?: CanvasTextAlign;
562
+ textBaseline?: CanvasTextBaseline;
563
+ }
564
+
565
+ interface NumberWidgetConfig {
566
+ value?: number;
567
+ property?: string;
568
+ idleBoxStyle?: TextBoxStyleConfig;
569
+ highlightBoxStyle?: TextBoxStyleConfig;
570
+ callback?: (newNumber: number) => void;
571
+ }
572
+ declare class NumberWidget {
573
+ #private;
574
+ constructor(node: FlowNode, config?: NumberWidgetConfig);
575
+ Size(): Vector2;
576
+ Set(newNumber: number): void;
577
+ ClickStart(): void;
578
+ ClickEnd(): void;
579
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
580
+ }
581
+
582
+ interface ColorWidgetConfig {
583
+ value?: string;
584
+ property?: string;
585
+ textStyle?: TextStyleConfig;
586
+ callback?: (newColor: string) => void;
587
+ }
588
+ declare class ColorWidget {
589
+ #private;
590
+ constructor(node: FlowNode, config?: ColorWidgetConfig);
591
+ Size(): Vector2;
592
+ Set(value: string): void;
593
+ ClickStart(): void;
594
+ ClickEnd(): void;
595
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
596
+ }
597
+
598
+ interface StringWidgetConfig {
599
+ property?: string;
600
+ value?: string;
601
+ textBoxStyle?: TextBoxStyleConfig;
602
+ callback?: (newString: string) => void;
603
+ }
604
+ declare class StringWidget {
605
+ #private;
606
+ constructor(node: FlowNode, config?: StringWidgetConfig);
607
+ Size(): Vector2;
608
+ Set(value: string): void;
609
+ ClickStart(): void;
610
+ ClickEnd(): void;
611
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
612
+ }
613
+
614
+ interface ButtonWidgetConfig {
615
+ text?: string;
616
+ callback?: () => void;
617
+ idleStyle?: TextBoxStyleConfig;
618
+ hoverStyle?: TextBoxStyleConfig;
619
+ clickStyle?: TextBoxStyleConfig;
620
+ }
621
+ declare class ButtonWidget {
622
+ #private;
623
+ constructor(config?: ButtonWidgetConfig);
624
+ Size(): Vector2;
625
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
626
+ ClickStart(): void;
627
+ ClickEnd(): void;
628
+ }
629
+
630
+ interface ToggleStyleConfig {
631
+ idle?: TextBoxStyleConfig;
632
+ hover?: TextBoxStyleConfig;
633
+ lightColor?: string;
634
+ lightBorderColor?: string;
635
+ lightBlur?: number;
636
+ }
637
+ interface ToggleWidgetConfig {
638
+ property?: string;
639
+ value?: boolean;
640
+ text?: string;
641
+ callback?: () => void;
642
+ enabledStyle?: ToggleStyleConfig;
643
+ disabledStyle?: ToggleStyleConfig;
644
+ }
645
+ declare class ToggleWidget {
646
+ #private;
647
+ constructor(node: FlowNode, config?: ToggleWidgetConfig);
648
+ Size(): Vector2;
649
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
650
+ Toggle(): void;
651
+ Set(value: boolean): void;
652
+ ClickStart(): void;
653
+ ClickEnd(): void;
654
+ }
655
+
656
+ interface SliderWidgetConfig {
657
+ property?: string;
658
+ min?: number;
659
+ max?: number;
660
+ value?: number;
661
+ backgroundColor?: string;
662
+ borderColor?: string;
663
+ fillColor?: string;
664
+ textStyle?: TextStyleConfig;
665
+ change?: (newValue: number) => void;
666
+ release?: (newValue: number) => void;
667
+ snapIncrement?: number;
668
+ }
669
+ declare class SliderWidget {
670
+ #private;
671
+ constructor(node: FlowNode, config?: SliderWidgetConfig);
672
+ SetValue(newValue: number): void;
673
+ Size(): Vector2;
674
+ ClickStart(): void;
675
+ ClickEnd(): void;
676
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
677
+ }
678
+
679
+ interface ImageWidgetConfig {
680
+ image?: string;
681
+ maxWidth?: number;
682
+ maxHeight?: number;
683
+ blob?: Blob;
684
+ }
685
+ /**
686
+ * constructor(lightNode, nodeManager, id, parameterData, app) {
687
+ this.lightNode = lightNode;
688
+ this.id = id;
689
+ this.app = app;
690
+ this.lightNode.title = parameterData.name;
691
+
692
+ this.lightNode.onDropFile = (file) => {
693
+ // console.log(file)
694
+ var reader = new FileReader();
695
+ reader.onload = (evt) => {
696
+ console.log(evt.target.result)
697
+ nodeManager.nodeParameterChanged({
698
+ id: id,
699
+ data: evt.target.result,
700
+ binary: true
701
+ });
702
+ }
703
+ reader.readAsArrayBuffer(file);
704
+
705
+ const url = URL.createObjectURL(file);
706
+ // this.loadImage(this._url, function (img) {
707
+ // that.size[1] = (img.height / img.width) * that.size[0];
708
+ // });
709
+ this.loadImgFromURL(url);
710
+ }
711
+ }
712
+
713
+ loadImgFromURL(url) {
714
+ const img = document.createElement("img");
715
+ img.src = url;
716
+ img.onload = () => {
717
+ // if (callback) {
718
+ // callback(this);
719
+ // }
720
+ // console.log("Image loaded, size: " + img.width + "x" + img.height);
721
+ // this.dirty = true;
722
+ // that.boxcolor = "#9F9";f
723
+ // that.setDirtyCanvas(true);
724
+ this.lightNode.widgets[0].image = img
725
+ this.lightNode.setSize(this.lightNode.computeSize());
726
+ };
727
+ img.onerror = () => {
728
+ console.log("error loading the image:" + url);
729
+ }
730
+ }
731
+
732
+ update(parameterData) {
733
+ console.log("image parameter", parameterData)
734
+ const curVal = parameterData.currentValue;
735
+ this.app.RequestManager.getParameterValue(this.id, (response) => {
736
+ const url = URL.createObjectURL(response);
737
+ this.loadImgFromURL(url)
738
+ })
739
+ }
740
+ */
741
+ declare class ImageWidget {
742
+ #private;
743
+ constructor(config?: ImageWidgetConfig);
744
+ SetBlob(blob: Blob): void;
745
+ SetUrl(url: string): void;
746
+ Size(): Vector2;
747
+ ClickStart(): void;
748
+ ClickEnd(): void;
749
+ Draw(ctx: CanvasRenderingContext2D, position: Vector2, scale: number, mousePosition: Vector2 | undefined): Box;
750
+ }
751
+
752
+ type WidgetBuilder = (node: FlowNode, confg?: any) => Widget;
753
+ declare class WidgetFactory {
754
+ #private;
755
+ constructor();
756
+ register(widgetType: string, builder: WidgetBuilder): void;
757
+ create(node: FlowNode, widgetType: string, config: any): Widget;
758
+ }
759
+ declare const GlobalWidgetFactory: WidgetFactory;
760
+
761
+ export { ButtonWidget, ColorWidget, FlowNode, type FlowNodeConfig, FlowNote, GlobalWidgetFactory, ImageWidget, NodeFlowGraph, NumberWidget, Publisher, type PublisherConfig, SliderWidget, StringWidget, Theme, ToggleWidget };