@babylonjs/shared-ui-components 5.45.0 → 5.45.2

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.
@@ -85,6 +85,9 @@ export declare class GraphCanvasComponent extends React.Component<IGraphCanvasCo
85
85
  constructor(props: IGraphCanvasComponentProps);
86
86
  populateConnectedEntriesBeforeRemoval(item: GraphNode, items: GraphNode[], inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[]): void;
87
87
  automaticRewire(inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[], firstOnly?: boolean): void;
88
+ smartAddOverLink(node: GraphNode, link: NodeLink): void;
89
+ smartAddOverNode(node: GraphNode, source: GraphNode): void;
90
+ deleteSelection(onRemove: (nodeData: INodeData) => void, autoReconnect?: boolean): void;
88
91
  handleKeyDown(evt: KeyboardEvent, onRemove: (nodeData: INodeData) => void, mouseLocationX: number, mouseLocationY: number, dataGenerator: (nodeData: INodeData) => any, rootElement: HTMLDivElement): void;
89
92
  pasteSelection(copiedNodes: GraphNode[], currentX: number, currentY: number, dataGenerator: (nodeData: INodeData) => any, selectNew?: boolean): GraphNode[];
90
93
  reconnectNewNodes(nodeIndex: number, newNodes: GraphNode[], sourceNodes: GraphNode[], done: boolean[]): void;
@@ -13,6 +13,7 @@ import styles from "./graphCanvas.modules.scss";
13
13
  import commonStyles from "./common.modules.scss";
14
14
  import { TypeLedger } from "./typeLedger.js";
15
15
  import { RefreshNode } from "./tools.js";
16
+ import { SearchBoxComponent } from "./searchBox.js";
16
17
  export class GraphCanvasComponent extends React.Component {
17
18
  constructor(props) {
18
19
  super(props);
@@ -279,47 +280,96 @@ export class GraphCanvasComponent extends React.Component {
279
280
  });
280
281
  }
281
282
  }
282
- handleKeyDown(evt, onRemove, mouseLocationX, mouseLocationY, dataGenerator, rootElement) {
283
- if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {
284
- // Delete
285
- const selectedItems = this.selectedNodes;
286
- const inputs = [];
287
- const outputs = [];
288
- if (selectedItems.length > 0) {
289
- for (const selectedItem of selectedItems) {
290
- if (evt.altKey) {
291
- this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);
292
- }
293
- selectedItem.dispose();
294
- onRemove(selectedItem.content);
295
- this.removeDataFromCache(selectedItem.content.data);
283
+ smartAddOverLink(node, link) {
284
+ // Connect the ports
285
+ const inputs = [];
286
+ const outputs = [];
287
+ const availableNodeInputs = [];
288
+ const availableNodeOutputs = [];
289
+ const leftNode = link.nodeA;
290
+ const rightNode = link.nodeB;
291
+ // Delete previous
292
+ link.dispose();
293
+ // Get the ports
294
+ availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));
295
+ availableNodeOutputs.push(...node.content.outputs);
296
+ inputs.push(...leftNode.content.outputs);
297
+ outputs.push(...rightNode.content.inputs.filter((i) => !i.isConnected));
298
+ // Reconnect
299
+ this.automaticRewire(inputs, availableNodeInputs, true);
300
+ this.automaticRewire(availableNodeOutputs, outputs, true);
301
+ this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
302
+ }
303
+ smartAddOverNode(node, source) {
304
+ // Connect the ports
305
+ const inputs = [];
306
+ const availableNodeInputs = [];
307
+ // Get the ports
308
+ availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));
309
+ inputs.push(...source.content.outputs);
310
+ // Reconnect
311
+ this.automaticRewire(inputs, availableNodeInputs, true);
312
+ this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
313
+ }
314
+ deleteSelection(onRemove, autoReconnect = false) {
315
+ // Delete
316
+ const selectedItems = this.selectedNodes;
317
+ const inputs = [];
318
+ const outputs = [];
319
+ let needRebuild = false;
320
+ if (selectedItems.length > 0) {
321
+ needRebuild = true;
322
+ for (const selectedItem of selectedItems) {
323
+ if (autoReconnect) {
324
+ this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);
296
325
  }
326
+ selectedItem.dispose();
327
+ onRemove(selectedItem.content);
328
+ this.removeDataFromCache(selectedItem.content.data);
297
329
  }
298
- if (this.selectedLink) {
299
- this.selectedLink.dispose();
300
- }
301
- if (this.selectedFrames.length) {
302
- for (const frame of this.selectedFrames) {
303
- if (frame.isCollapsed) {
304
- while (frame.nodes.length > 0) {
305
- onRemove(frame.nodes[0].content);
306
- this.removeDataFromCache(frame.nodes[0].content.data);
307
- frame.nodes[0].dispose();
308
- }
309
- frame.isCollapsed = false;
310
- }
311
- else {
312
- frame.nodes.forEach((node) => {
313
- node.enclosingFrameId = -1;
314
- });
330
+ }
331
+ if (this.selectedLink) {
332
+ needRebuild = true;
333
+ this.selectedLink.dispose();
334
+ }
335
+ if (this.selectedFrames.length) {
336
+ needRebuild = true;
337
+ for (const frame of this.selectedFrames) {
338
+ if (frame.isCollapsed) {
339
+ while (frame.nodes.length > 0) {
340
+ onRemove(frame.nodes[0].content);
341
+ this.removeDataFromCache(frame.nodes[0].content.data);
342
+ frame.nodes[0].dispose();
315
343
  }
316
- frame.dispose();
344
+ frame.isCollapsed = false;
345
+ }
346
+ else {
347
+ frame.nodes.forEach((node) => {
348
+ node.enclosingFrameId = -1;
349
+ });
317
350
  }
351
+ frame.dispose();
318
352
  }
319
- // Reconnect if required
320
- this.automaticRewire(inputs, outputs);
321
- this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);
322
- this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
353
+ }
354
+ if (!needRebuild) {
355
+ return;
356
+ }
357
+ // Reconnect if required
358
+ this.automaticRewire(inputs, outputs);
359
+ this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);
360
+ this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
361
+ }
362
+ handleKeyDown(evt, onRemove, mouseLocationX, mouseLocationY, dataGenerator, rootElement) {
363
+ if (this.stateManager.modalIsDisplayed) {
364
+ return;
365
+ }
366
+ if (evt.code === "Space" && evt.target === this.props.stateManager.hostDocument.body) {
367
+ this.stateManager.modalIsDisplayed = true;
368
+ this.props.stateManager.onSearchBoxRequiredObservable.notifyObservers({ x: mouseLocationX, y: mouseLocationY });
369
+ return;
370
+ }
371
+ if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {
372
+ this.deleteSelection(onRemove, evt.altKey);
323
373
  return;
324
374
  }
325
375
  if ((!evt.ctrlKey && !evt.metaKey) || this.props.stateManager.lockObject.lock) {
@@ -684,6 +734,9 @@ export class GraphCanvasComponent extends React.Component {
684
734
  this.updateTransform();
685
735
  }
686
736
  onMove(evt) {
737
+ if (this.stateManager.modalIsDisplayed) {
738
+ return;
739
+ }
687
740
  // Selection box
688
741
  if (this._selectionBox) {
689
742
  const rootRect = this.canvasContainer.getBoundingClientRect();
@@ -772,6 +825,9 @@ export class GraphCanvasComponent extends React.Component {
772
825
  this._mouseStartPointY = evt.clientY;
773
826
  }
774
827
  onDown(evt) {
828
+ if (this.stateManager.modalIsDisplayed) {
829
+ return;
830
+ }
775
831
  this._rootContainer.setPointerCapture(evt.pointerId);
776
832
  // Port dragging
777
833
  if (evt.nativeEvent.srcElement && evt.nativeEvent.srcElement.nodeName === "IMG") {
@@ -840,6 +896,9 @@ export class GraphCanvasComponent extends React.Component {
840
896
  this._mouseStartPointY = evt.clientY;
841
897
  }
842
898
  onUp(evt) {
899
+ if (this.stateManager.modalIsDisplayed) {
900
+ return;
901
+ }
843
902
  this._mouseStartPointX = null;
844
903
  this._mouseStartPointY = null;
845
904
  this._rootContainer.releasePointerCapture(evt.pointerId);
@@ -884,6 +943,9 @@ export class GraphCanvasComponent extends React.Component {
884
943
  }
885
944
  }
886
945
  onWheel(evt) {
946
+ if (this.stateManager.modalIsDisplayed) {
947
+ return;
948
+ }
887
949
  const delta = evt.deltaY < 0 ? 0.1 : -0.1;
888
950
  const oldZoom = this.zoom;
889
951
  this.zoom = Math.min(Math.max(this._minZoom, this.zoom + delta * this.zoom), this._maxZoom);
@@ -1132,7 +1194,7 @@ export class GraphCanvasComponent extends React.Component {
1132
1194
  this.stateManager.onSelectionChangedObservable.notifyObservers({ selection: frame });
1133
1195
  }
1134
1196
  render() {
1135
- return (_jsx("div", { ref: this._hostCanvasRef, id: "graph-canvas", className: styles["graph-canvas"], onWheel: (evt) => this.onWheel(evt), onPointerMove: (evt) => this.onMove(evt), onPointerDown: (evt) => this.onDown(evt), onPointerUp: (evt) => this.onUp(evt), children: _jsxs("div", { id: "graph-container", className: styles["graph-container"], ref: this._rootContainerRef, children: [_jsx("div", { id: "graph-canvas-container", className: styles["graph-canvas-container"], ref: this._graphCanvasRef }), _jsx("div", { id: "frame-container", className: styles["frame-container"], ref: this._frameContainerRef }), _jsx("svg", { id: "graph-svg-container", className: styles["graph-svg-container"], ref: this._svgCanvasRef }), _jsx("div", { id: "selection-container", className: styles["selection-container"], ref: this._selectionContainerRef })] }) }));
1197
+ return (_jsxs("div", { ref: this._hostCanvasRef, id: "graph-canvas", className: styles["graph-canvas"], onWheel: (evt) => this.onWheel(evt), onPointerMove: (evt) => this.onMove(evt), onPointerDown: (evt) => this.onDown(evt), onPointerUp: (evt) => this.onUp(evt), children: [_jsxs("div", { id: "graph-container", className: styles["graph-container"], ref: this._rootContainerRef, children: [_jsx("div", { id: "graph-canvas-container", className: styles["graph-canvas-container"], ref: this._graphCanvasRef }), _jsx("div", { id: "frame-container", className: styles["frame-container"], ref: this._frameContainerRef }), _jsx("svg", { id: "graph-svg-container", className: styles["graph-svg-container"], ref: this._svgCanvasRef }), _jsx("div", { id: "selection-container", className: styles["selection-container"], ref: this._selectionContainerRef })] }), _jsx(SearchBoxComponent, { stateManager: this.stateManager })] }));
1136
1198
  }
1137
1199
  }
1138
1200
  GraphCanvasComponent.NodeWidth = 100;
@@ -1 +1 @@
1
- {"version":3,"file":"graphCanvas.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/graphCanvas.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport { GraphNode } from \"./graphNode\";\r\nimport * as dagre from \"dagre\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { NodeLink } from \"./nodeLink\";\r\nimport { NodePort } from \"./nodePort\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { DataStorage } from \"core/Misc/dataStorage\";\r\nimport { GraphFrame } from \"./graphFrame\";\r\nimport type { IEditorData, IFrameData } from \"./interfaces/nodeLocationInfo\";\r\nimport { FrameNodePort } from \"./frameNodePort\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport type { FramePortData } from \"./types/framePortData\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport { PortDataDirection } from \"./interfaces/portData\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport styles from \"./graphCanvas.modules.scss\";\r\nimport commonStyles from \"./common.modules.scss\";\r\n\r\nimport { TypeLedger } from \"./typeLedger\";\r\nimport { RefreshNode } from \"./tools\";\r\n\r\nexport interface IGraphCanvasComponentProps {\r\n stateManager: StateManager;\r\n onEmitNewNode: (nodeData: INodeData) => GraphNode;\r\n}\r\n\r\nexport class GraphCanvasComponent extends React.Component<IGraphCanvasComponentProps> implements INodeContainer {\r\n public static readonly NodeWidth = 100;\r\n private readonly _minZoom = 0.1;\r\n private readonly _maxZoom = 4;\r\n\r\n private _hostCanvasRef = React.createRef<HTMLDivElement>();\r\n private _hostCanvas: HTMLDivElement;\r\n private _graphCanvasRef = React.createRef<HTMLDivElement>();\r\n private _graphCanvas: HTMLDivElement;\r\n private _selectionContainerRef = React.createRef<HTMLDivElement>();\r\n private _selectionContainer: HTMLDivElement;\r\n private _frameContainerRef = React.createRef<HTMLDivElement>();\r\n private _frameContainer: HTMLDivElement;\r\n private _svgCanvasRef = React.createRef<SVGSVGElement>();\r\n private _svgCanvas: HTMLElement;\r\n private _rootContainerRef = React.createRef<HTMLDivElement>();\r\n private _rootContainer: HTMLDivElement;\r\n private _nodes: GraphNode[] = [];\r\n private _links: NodeLink[] = [];\r\n private _mouseStartPointX: Nullable<number> = null;\r\n private _mouseStartPointY: Nullable<number> = null;\r\n private _dropPointX = 0;\r\n private _dropPointY = 0;\r\n private _selectionStartX = 0;\r\n private _selectionStartY = 0;\r\n private _candidateLinkedHasMoved = false;\r\n private _x = 0;\r\n private _y = 0;\r\n private _zoom = 1;\r\n private _selectedNodes: GraphNode[] = [];\r\n private _selectedLink: Nullable<NodeLink> = null;\r\n private _selectedPort: Nullable<NodePort> = null;\r\n private _candidateLink: Nullable<NodeLink> = null;\r\n private _candidatePort: Nullable<NodePort | FrameNodePort> = null;\r\n private _gridSize = 20;\r\n private _selectionBox: Nullable<HTMLDivElement> = null;\r\n private _selectedFrames: GraphFrame[] = [];\r\n private _frameCandidate: Nullable<HTMLDivElement> = null;\r\n private _frames: GraphFrame[] = [];\r\n private _nodeDataContentList = new Array<any>();\r\n\r\n private _altKeyIsPressed = false;\r\n private _multiKeyIsPressed = false;\r\n private _oldY = -1;\r\n\r\n public _frameIsMoving = false;\r\n public _isLoading = false;\r\n public _targetLinkCandidate: Nullable<NodeLink> = null;\r\n\r\n private _copiedNodes: GraphNode[] = [];\r\n private _copiedFrames: GraphFrame[] = [];\r\n\r\n public get gridSize() {\r\n return this._gridSize;\r\n }\r\n\r\n public set gridSize(value: number) {\r\n this._gridSize = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get stateManager() {\r\n return this.props.stateManager;\r\n }\r\n\r\n public get nodes() {\r\n return this._nodes;\r\n }\r\n\r\n public get links() {\r\n return this._links;\r\n }\r\n\r\n public get frames() {\r\n return this._frames;\r\n }\r\n\r\n public get zoom() {\r\n return this._zoom;\r\n }\r\n\r\n public set zoom(value: number) {\r\n if (this._zoom === value) {\r\n return;\r\n }\r\n\r\n this._zoom = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get selectedNodes() {\r\n return this._selectedNodes;\r\n }\r\n\r\n public get selectedLink() {\r\n return this._selectedLink;\r\n }\r\n public get selectedFrames() {\r\n return this._selectedFrames;\r\n }\r\n\r\n public get selectedPort() {\r\n return this._selectedPort;\r\n }\r\n\r\n public get canvasContainer() {\r\n return this._graphCanvas;\r\n }\r\n\r\n public get hostCanvas() {\r\n return this._hostCanvas;\r\n }\r\n\r\n public get svgCanvas() {\r\n return this._svgCanvas;\r\n }\r\n\r\n public get selectionContainer() {\r\n return this._selectionContainer;\r\n }\r\n\r\n public get frameContainer() {\r\n return this._frameContainer;\r\n }\r\n\r\n // There is a selection conflict between nodes and frames if any selected node is inside any selected frame\r\n private _selectedFrameAndNodesConflict(frameSelection: GraphFrame[], nodeSelection: GraphNode[]) {\r\n for (const frame of frameSelection) {\r\n for (const node of nodeSelection) {\r\n if (frame.nodes.includes(node)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n constructor(props: IGraphCanvasComponentProps) {\r\n super(props);\r\n\r\n props.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection, forceKeepSelection, marqueeSelection = false } = options || {};\r\n if (!selection) {\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedFrames = [];\r\n this._selectedPort = null;\r\n } else {\r\n if (selection instanceof NodeLink) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = selection;\r\n this._selectedPort = null;\r\n } else if (selection instanceof NodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof FrameNodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof GraphNode || selection instanceof GraphFrame) {\r\n // If in marquee selection mode, always prioritize selecting nodes. Otherwise, always prioritize selecting the type of\r\n // the selected element\r\n if (marqueeSelection) {\r\n if (selection instanceof GraphFrame && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n } else if (selection instanceof GraphNode && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n if (this._selectedFrameAndNodesConflict(this.selectedFrames, this.selectedNodes)) {\r\n const framesToRemove = new Set();\r\n for (const selectedNode of this._selectedNodes) {\r\n for (const selectedFrame of this._selectedFrames) {\r\n if (selectedFrame.nodes.includes(selectedNode)) {\r\n framesToRemove.add(selectedFrame);\r\n }\r\n }\r\n }\r\n this._selectedFrames = this._selectedFrames.filter((f) => !framesToRemove.has(f));\r\n }\r\n } else {\r\n if (selection instanceof GraphFrame) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict([selection], this._selectedNodes) && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [selection];\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n } else if (selection instanceof GraphNode) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict(this._selectedFrames, [selection]) && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [];\r\n this._selectedNodes = [selection];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n props.stateManager.onCandidatePortSelectedObservable.add((port) => {\r\n this._candidatePort = port;\r\n });\r\n\r\n props.stateManager.onGridSizeChanged.add(() => {\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n });\r\n\r\n this.props.stateManager.hostDocument!.addEventListener(\"keyup\", () => this.onKeyUp(), false);\r\n this.props.stateManager.hostDocument!.addEventListener(\r\n \"keydown\",\r\n (evt) => {\r\n this._altKeyIsPressed = evt.altKey;\r\n this._multiKeyIsPressed = evt.ctrlKey || evt.metaKey;\r\n },\r\n false\r\n );\r\n this.props.stateManager.hostDocument!.defaultView!.addEventListener(\r\n \"blur\",\r\n () => {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n },\r\n false\r\n );\r\n\r\n // Store additional data to serialization object\r\n this.props.stateManager.storeEditorData = (editorData, graphFrame) => {\r\n editorData.frames = [];\r\n if (graphFrame) {\r\n editorData.frames.push(graphFrame!.serialize(false));\r\n } else {\r\n editorData.x = this.x;\r\n editorData.y = this.y;\r\n editorData.zoom = this.zoom;\r\n for (const frame of this._frames) {\r\n editorData.frames.push(frame.serialize(true));\r\n }\r\n }\r\n };\r\n }\r\n\r\n populateConnectedEntriesBeforeRemoval(item: GraphNode, items: GraphNode[], inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[]) {\r\n inputs.push(\r\n ...item.content.inputs.filter((i) => i.isConnected && items.every((selected) => selected.content.data !== i.connectedPort?.ownerData)).map((i) => i.connectedPort)\r\n );\r\n\r\n outputs.push(\r\n ...item.content.outputs\r\n .filter((i) => i.isConnected)\r\n .map((i) => i.endpoints)\r\n .flat()\r\n .filter((i) => i && items.every((selected) => selected.content.data !== i.ownerData))\r\n );\r\n }\r\n\r\n automaticRewire(inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[], firstOnly = false) {\r\n let oneConnectionFound = false;\r\n if (outputs.length && inputs.length) {\r\n inputs.forEach((input) => {\r\n if (oneConnectionFound) {\r\n return;\r\n }\r\n if (!input) {\r\n return;\r\n }\r\n const output = outputs[0];\r\n if (output && input.canConnectTo(output)) {\r\n const nodeInput = this.findNodeFromData(input.ownerData);\r\n const nodeOutput = this.findNodeFromData(output.ownerData);\r\n this.connectNodes(nodeInput, input, nodeOutput, output);\r\n outputs.shift();\r\n if (firstOnly) {\r\n oneConnectionFound = true;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n handleKeyDown(\r\n evt: KeyboardEvent,\r\n onRemove: (nodeData: INodeData) => void,\r\n mouseLocationX: number,\r\n mouseLocationY: number,\r\n dataGenerator: (nodeData: INodeData) => any,\r\n rootElement: HTMLDivElement\r\n ) {\r\n if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {\r\n // Delete\r\n const selectedItems = this.selectedNodes;\r\n const inputs: Nullable<IPortData>[] = [];\r\n const outputs: Nullable<IPortData>[] = [];\r\n\r\n if (selectedItems.length > 0) {\r\n for (const selectedItem of selectedItems) {\r\n if (evt.altKey) {\r\n this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);\r\n }\r\n\r\n selectedItem.dispose();\r\n\r\n onRemove(selectedItem.content);\r\n this.removeDataFromCache(selectedItem.content.data);\r\n }\r\n }\r\n\r\n if (this.selectedLink) {\r\n this.selectedLink.dispose();\r\n }\r\n\r\n if (this.selectedFrames.length) {\r\n for (const frame of this.selectedFrames) {\r\n if (frame.isCollapsed) {\r\n while (frame.nodes.length > 0) {\r\n onRemove(frame.nodes[0].content);\r\n this.removeDataFromCache(frame.nodes[0].content.data);\r\n frame.nodes[0].dispose();\r\n }\r\n frame.isCollapsed = false;\r\n } else {\r\n frame.nodes.forEach((node) => {\r\n node.enclosingFrameId = -1;\r\n });\r\n }\r\n frame.dispose();\r\n }\r\n }\r\n\r\n // Reconnect if required\r\n this.automaticRewire(inputs, outputs);\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n return;\r\n }\r\n\r\n if ((!evt.ctrlKey && !evt.metaKey) || this.props.stateManager.lockObject.lock) {\r\n return;\r\n }\r\n\r\n if (evt.key === \"c\" || evt.key === \"C\") {\r\n // Copy\r\n this._copiedNodes = [];\r\n this._copiedFrames = [];\r\n\r\n if (this.selectedFrames.length) {\r\n for (const frame of this.selectedFrames) {\r\n frame.serialize(true);\r\n this._copiedFrames.push(frame);\r\n }\r\n return;\r\n }\r\n\r\n const selectedItems = this.selectedNodes;\r\n if (!selectedItems.length) {\r\n return;\r\n }\r\n\r\n const selectedItem = selectedItems[0] as GraphNode;\r\n\r\n if (!selectedItem.content.data) {\r\n return;\r\n }\r\n\r\n this._copiedNodes = selectedItems.slice(0);\r\n } else if (evt.key === \"v\" || evt.key === \"V\") {\r\n // Paste\r\n const zoomLevel = this.zoom;\r\n let currentY = (mouseLocationY - rootElement.offsetTop - this.y - 20) / zoomLevel;\r\n\r\n if (this._copiedFrames.length) {\r\n for (const frame of this._copiedFrames) {\r\n // New frame\r\n const newFrame = new GraphFrame(null, this, true);\r\n this.frames.push(newFrame);\r\n\r\n newFrame.width = frame.width;\r\n newFrame.height = frame.height;\r\n newFrame.width / 2;\r\n newFrame.name = frame.name;\r\n newFrame.color = frame.color;\r\n\r\n let currentX = (mouseLocationX - rootElement.offsetLeft - this.x) / zoomLevel;\r\n newFrame.x = currentX - newFrame.width / 2;\r\n newFrame.y = currentY;\r\n\r\n // Paste nodes\r\n if (frame.nodes.length) {\r\n currentX = newFrame.x + frame.nodes[0].x - frame.x;\r\n currentY = newFrame.y + frame.nodes[0].y - frame.y;\r\n\r\n this._frameIsMoving = true;\r\n const newNodes = this.pasteSelection(frame.nodes, currentX, currentY, dataGenerator);\r\n if (newNodes) {\r\n for (const node of newNodes) {\r\n newFrame.syncNode(node);\r\n }\r\n }\r\n this._frameIsMoving = false;\r\n }\r\n\r\n newFrame.adjustPorts();\r\n\r\n if (frame.isCollapsed) {\r\n newFrame.isCollapsed = true;\r\n }\r\n\r\n // Select\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame, forceKeepSelection: true });\r\n return;\r\n }\r\n }\r\n\r\n if (!this._copiedNodes.length) {\r\n return;\r\n }\r\n\r\n const currentX = (mouseLocationX - rootElement.offsetLeft - this.x - GraphCanvasComponent.NodeWidth) / zoomLevel;\r\n this.pasteSelection(this._copiedNodes, currentX, currentY, dataGenerator, true);\r\n }\r\n }\r\n\r\n pasteSelection(copiedNodes: GraphNode[], currentX: number, currentY: number, dataGenerator: (nodeData: INodeData) => any, selectNew = false) {\r\n let originalNode: Nullable<GraphNode> = null;\r\n\r\n const newNodes: GraphNode[] = [];\r\n\r\n // Copy to prevent recursive side effects while creating nodes.\r\n copiedNodes = copiedNodes.slice();\r\n\r\n // Cancel selection\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n\r\n // Create new nodes\r\n for (const node of copiedNodes) {\r\n const data = node.content.data;\r\n\r\n if (!data) {\r\n continue;\r\n }\r\n\r\n const newNode = dataGenerator(node.content);\r\n\r\n let x = 0;\r\n let y = 0;\r\n if (originalNode) {\r\n x = currentX + node.x - originalNode.x;\r\n y = currentY + node.y - originalNode.y;\r\n } else {\r\n originalNode = node;\r\n x = currentX;\r\n y = currentY;\r\n }\r\n\r\n newNode.x = x;\r\n newNode.y = y;\r\n newNode.cleanAccumulation();\r\n\r\n newNodes.push(newNode);\r\n\r\n if (selectNew) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode, forceKeepSelection: true });\r\n }\r\n }\r\n\r\n // Relink\r\n const done = new Array<boolean>(newNodes.length);\r\n for (let index = 0; index < newNodes.length; index++) {\r\n this.reconnectNewNodes(index, newNodes, copiedNodes, done);\r\n }\r\n\r\n return newNodes;\r\n }\r\n\r\n reconnectNewNodes(nodeIndex: number, newNodes: GraphNode[], sourceNodes: GraphNode[], done: boolean[]) {\r\n if (done[nodeIndex]) {\r\n return;\r\n }\r\n\r\n const currentNode = newNodes[nodeIndex];\r\n const sourceNode = sourceNodes[nodeIndex];\r\n\r\n for (let inputIndex = 0; inputIndex < sourceNode.content.inputs.length; inputIndex++) {\r\n const sourceInput = sourceNode.content.inputs[inputIndex];\r\n const currentInput = currentNode.content.inputs[inputIndex];\r\n if (!sourceInput.isConnected) {\r\n continue;\r\n }\r\n const sourceContent = this.findNodeFromData(sourceInput.connectedPort!.ownerData).content;\r\n const activeNodes = sourceNodes.filter((s) => s.content === sourceContent);\r\n\r\n if (activeNodes.length > 0) {\r\n const activeNode = activeNodes[0];\r\n const indexInList = sourceNodes.indexOf(activeNode);\r\n\r\n // First make sure to connect the other one\r\n this.reconnectNewNodes(indexInList, newNodes, sourceNodes, done);\r\n\r\n // Then reconnect\r\n const outputIndex = sourceContent.outputs.indexOf(sourceInput.connectedPort!);\r\n const newOutput = newNodes[indexInList].content.data.outputs[outputIndex];\r\n\r\n newOutput.connectTo(currentInput.data);\r\n } else {\r\n // Connect with outside nodes\r\n sourceInput.connectedPort!.connectTo(currentInput);\r\n }\r\n\r\n this.connectPorts(currentInput.connectedPort!, currentInput);\r\n }\r\n\r\n currentNode.refresh();\r\n\r\n done[nodeIndex] = true;\r\n }\r\n\r\n public getCachedData(): any[] {\r\n return this._nodeDataContentList;\r\n }\r\n\r\n public removeDataFromCache(data: any) {\r\n const dataIndex = this._nodeDataContentList.indexOf(data);\r\n\r\n if (dataIndex > -1) {\r\n this._nodeDataContentList.splice(dataIndex, 1);\r\n }\r\n }\r\n\r\n public createNodeFromObject(nodeData: INodeData, onNodeCreated: (data: any) => void, recursion = true) {\r\n if (this._nodeDataContentList.indexOf(nodeData.data) !== -1) {\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n return this.nodes.filter((n) => n.content.data === nodeData.data)[0];\r\n }\r\n\r\n onNodeCreated(nodeData.data);\r\n\r\n // Connections\r\n if (nodeData.inputs.length) {\r\n for (const input of nodeData.inputs) {\r\n if (input.connectedPort && recursion) {\r\n this.createNodeFromObject(TypeLedger.NodeDataBuilder(input.connectedPort.ownerData, this), onNodeCreated);\r\n }\r\n }\r\n }\r\n\r\n // Graph\r\n const node = this.appendNode(nodeData);\r\n\r\n node.addClassToVisual(nodeData.getClassName());\r\n\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getGridPosition(position: number, useCeil = false) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n if (useCeil) {\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n return gridSize * Math.floor(position / gridSize);\r\n }\r\n\r\n public getGridPositionCeil(position: number) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n\r\n updateTransform() {\r\n this._rootContainer.style.transform = `translate(${this._x}px, ${this._y}px) scale(${this._zoom})`;\r\n\r\n if (DataStorage.ReadBoolean(\"ShowGrid\", true)) {\r\n this._hostCanvas.style.backgroundSize = `${this._gridSize * this._zoom}px ${this._gridSize * this._zoom}px`;\r\n this._hostCanvas.style.backgroundPosition = `${this._x}px ${this._y}px`;\r\n } else {\r\n this._hostCanvas.style.backgroundSize = `0`;\r\n }\r\n }\r\n\r\n onKeyUp() {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n this._oldY = -1;\r\n }\r\n\r\n findNodeFromData(data: any) {\r\n return this.nodes.filter((n) => n.content.data === data)[0];\r\n }\r\n\r\n reset() {\r\n this._nodeDataContentList = [];\r\n\r\n for (const node of this._nodes) {\r\n node.dispose();\r\n }\r\n\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n this._nodes = [];\r\n this._frames = [];\r\n this._links = [];\r\n this._graphCanvas.innerHTML = \"\";\r\n this._svgCanvas.innerHTML = \"\";\r\n }\r\n\r\n connectPorts(pointA: IPortData, pointB: IPortData) {\r\n if (!pointA || !pointB) {\r\n return;\r\n }\r\n\r\n const ownerDataA = pointA.ownerData;\r\n const ownerDataB = pointB.ownerData;\r\n const nodeA = this.findNodeFromData(ownerDataA);\r\n const nodeB = this.findNodeFromData(ownerDataB);\r\n\r\n if (!nodeA || !nodeB) {\r\n return;\r\n }\r\n\r\n const portA = nodeA.getPortForPortData(pointA);\r\n const portB = nodeB.getPortForPortData(pointB);\r\n\r\n if (!portA || !portB) {\r\n return;\r\n }\r\n\r\n for (const currentLink of this._links) {\r\n if (currentLink.portA === portA && currentLink.portB === portB) {\r\n return;\r\n }\r\n if (currentLink.portA === portB && currentLink.portB === portA) {\r\n return;\r\n }\r\n }\r\n\r\n const link = new NodeLink(this, portA, nodeA, portB, nodeB);\r\n this._links.push(link);\r\n\r\n nodeA.links.push(link);\r\n nodeB.links.push(link);\r\n }\r\n\r\n removeLink(link: NodeLink) {\r\n const index = this._links.indexOf(link);\r\n\r\n if (index > -1) {\r\n this._links.splice(index, 1);\r\n }\r\n\r\n link.dispose();\r\n }\r\n\r\n appendNode(nodeData: INodeData) {\r\n const newNode = new GraphNode(nodeData, this.props.stateManager);\r\n\r\n newNode.appendVisual(this._graphCanvas, this);\r\n\r\n this._nodes.push(newNode);\r\n this._nodeDataContentList.push(nodeData.data);\r\n\r\n return newNode;\r\n }\r\n\r\n distributeGraph() {\r\n this.x = 0;\r\n this.y = 0;\r\n this.zoom = 1;\r\n\r\n const graph = new dagre.graphlib.Graph();\r\n graph.setGraph({});\r\n graph.setDefaultEdgeLabel(() => ({}));\r\n graph.graph().rankdir = \"LR\";\r\n\r\n // Build dagre graph\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n graph.setNode(node.id.toString(), {\r\n id: node.id,\r\n type: \"node\",\r\n width: node.width,\r\n height: node.height,\r\n });\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n graph.setNode(frame.id.toString(), {\r\n id: frame.id,\r\n type: \"frame\",\r\n width: frame.element.clientWidth,\r\n height: frame.element.clientHeight,\r\n });\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.content.outputs.forEach((output) => {\r\n if (!output.hasEndpoints) {\r\n return;\r\n }\r\n\r\n output.endpoints!.forEach((endpoint) => {\r\n const sourceFrames = this._frames.filter((f) => f.nodes.indexOf(node) !== -1);\r\n const targetFrames = this._frames.filter((f) => f.nodes.some((n) => n.content.data === endpoint.ownerData));\r\n\r\n const sourceId = sourceFrames.length > 0 ? sourceFrames[0].id : node.id;\r\n const targetId = targetFrames.length > 0 ? targetFrames[0].id : endpoint.ownerData.uniqueId;\r\n\r\n graph.setEdge(sourceId.toString(), targetId.toString());\r\n });\r\n });\r\n });\r\n\r\n // Distribute\r\n dagre.layout(graph);\r\n\r\n // Update graph\r\n const dagreNodes = graph.nodes().map((node) => graph.node(node));\r\n dagreNodes.forEach((dagreNode: any) => {\r\n if (!dagreNode) {\r\n return;\r\n }\r\n if (dagreNode.type === \"node\") {\r\n for (const node of this._nodes) {\r\n if (node.id === dagreNode.id) {\r\n node.x = dagreNode.x - dagreNode.width / 2;\r\n node.y = dagreNode.y - dagreNode.height / 2;\r\n node.cleanAccumulation();\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n for (const frame of this._frames) {\r\n if (frame.id === dagreNode.id) {\r\n this._frameIsMoving = true;\r\n frame.move(dagreNode.x - dagreNode.width / 2, dagreNode.y - dagreNode.height / 2, false);\r\n frame.cleanAccumulation();\r\n this._frameIsMoving = false;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n this._hostCanvas = this._hostCanvasRef.current!;\r\n this._rootContainer = this._rootContainerRef.current!;\r\n this._graphCanvas = this._graphCanvasRef.current!;\r\n this._svgCanvas = this._svgCanvasRef.current! as unknown as HTMLElement;\r\n this._selectionContainer = this._selectionContainerRef.current!;\r\n this._frameContainer = this._frameContainerRef.current!;\r\n\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n this.updateTransform();\r\n }\r\n\r\n onMove(evt: React.PointerEvent) {\r\n // Selection box\r\n if (this._selectionBox) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.left = `${localX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.top = `${localY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n this.props.stateManager.onSelectionBoxMoved.notifyObservers(this._selectionBox.getBoundingClientRect());\r\n\r\n return;\r\n }\r\n\r\n // Candidate frame box\r\n if (this._frameCandidate) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.left = `${localX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.top = `${localY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Candidate link\r\n if (this._candidateLink) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._candidatePort = null;\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(new Vector2(evt.pageX, evt.pageY));\r\n this._dropPointX = (evt.pageX - rootRect.left) / this.zoom;\r\n this._dropPointY = (evt.pageY - rootRect.top) / this.zoom;\r\n\r\n this._candidateLink.update(this._dropPointX, this._dropPointY, true);\r\n this._candidateLinkedHasMoved = true;\r\n\r\n return;\r\n }\r\n\r\n // Zoom with mouse + alt\r\n if (this._altKeyIsPressed && evt.buttons === 1) {\r\n if (this._oldY < 0) {\r\n this._oldY = evt.pageY;\r\n }\r\n\r\n const zoomDelta = (evt.pageY - this._oldY) / 10;\r\n if (Math.abs(zoomDelta) > 5) {\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.max(Math.min(this._maxZoom, this.zoom + zoomDelta / 100), this._minZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n\r\n this._oldY = evt.pageY;\r\n }\r\n return;\r\n }\r\n\r\n // Move canvas\r\n this._rootContainer.style.cursor = \"move\";\r\n\r\n if (this._mouseStartPointX === null || this._mouseStartPointY === null) {\r\n return;\r\n }\r\n this.x += evt.clientX - this._mouseStartPointX;\r\n this.y += evt.clientY - this._mouseStartPointY;\r\n\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onDown(evt: React.PointerEvent<HTMLElement>) {\r\n this._rootContainer.setPointerCapture(evt.pointerId);\r\n\r\n // Port dragging\r\n if (evt.nativeEvent.srcElement && (evt.nativeEvent.srcElement as HTMLElement).nodeName === \"IMG\") {\r\n if (!this._candidateLink) {\r\n const portElement = ((evt.nativeEvent.srcElement as HTMLElement).parentElement as any).port as NodePort;\r\n if (this._altKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n // Delete connection\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n\r\n // Pick the first one as target port\r\n const targetNode = links[0].nodeA === node ? links[0].nodeB : links[0].nodeA;\r\n const targetPort = links[0].nodeA === node ? links[0].portB : links[0].portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else if (this._multiKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n // Pick the first one as target port\r\n const linkToConsider = this._selectedLink || links[0];\r\n const targetNode = linkToConsider.nodeA === node ? linkToConsider.nodeB : linkToConsider.nodeA;\r\n const targetPort = linkToConsider.nodeA === node ? linkToConsider.portB : linkToConsider.portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else {\r\n this._candidateLink = new NodeLink(this, portElement, portElement.node);\r\n }\r\n this._candidateLinkedHasMoved = false;\r\n }\r\n return;\r\n }\r\n\r\n // Selection?\r\n if (evt.currentTarget === this._hostCanvas && this._multiKeyIsPressed) {\r\n this._selectionBox = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._selectionBox.classList.add(styles[\"selection-box\"]);\r\n this._selectionContainer.appendChild(this._selectionBox);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.width = \"0px\";\r\n this._selectionBox.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n // Frame?\r\n if (evt.currentTarget === this._hostCanvas && evt.shiftKey) {\r\n this._frameCandidate = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._frameCandidate.classList.add(commonStyles[\"frame-box\"]);\r\n this._frameContainer.appendChild(this._frameCandidate);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.width = \"0px\";\r\n this._frameCandidate.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onUp(evt: React.PointerEvent) {\r\n this._mouseStartPointX = null;\r\n this._mouseStartPointY = null;\r\n this._rootContainer.releasePointerCapture(evt.pointerId);\r\n this._oldY = -1;\r\n if (this._candidateLink) {\r\n if (this._candidateLinkedHasMoved) {\r\n this.processCandidatePort();\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(null);\r\n } else {\r\n // is a click event on NodePort\r\n if (this._candidateLink.portA instanceof FrameNodePort) {\r\n //only on Frame Node Ports\r\n const port = this._candidateLink.portA;\r\n const frame = this.frames.find((frame: GraphFrame) => frame.id === port.parentFrameId);\r\n if (frame) {\r\n const data: FramePortData = {\r\n frame,\r\n port,\r\n };\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: data });\r\n }\r\n } else if (this._candidateLink.portA instanceof NodePort) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: this._candidateLink.portA });\r\n }\r\n }\r\n this._candidateLink.dispose();\r\n this._candidateLink = null;\r\n this._candidatePort = null;\r\n }\r\n\r\n if (this._selectionBox) {\r\n this._selectionBox.parentElement!.removeChild(this._selectionBox);\r\n this._selectionBox = null;\r\n }\r\n\r\n if (this._frameCandidate) {\r\n const newFrame = new GraphFrame(this._frameCandidate, this);\r\n this._frames.push(newFrame);\r\n\r\n this._frameCandidate.parentElement!.removeChild(this._frameCandidate);\r\n this._frameCandidate = null;\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame });\r\n }\r\n }\r\n\r\n onWheel(evt: React.WheelEvent) {\r\n const delta = evt.deltaY < 0 ? 0.1 : -0.1;\r\n\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.min(Math.max(this._minZoom, this.zoom + delta * this.zoom), this._maxZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const clientHeight = boundingRect.height;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const heightDiff = clientHeight * this.zoom - clientHeight * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n const clientY = evt.clientY - boundingRect.top;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n const yFactor = (clientY - this.y) / oldZoom / clientHeight;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n this.y = this.y - heightDiff * yFactor;\r\n }\r\n\r\n zoomToFit() {\r\n // Get negative offset\r\n let minX = 0;\r\n let minY = 0;\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n if (node.x < minX) {\r\n minX = node.x;\r\n }\r\n if (node.y < minY) {\r\n minY = node.y;\r\n }\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n if (frame.x < minX) {\r\n minX = frame.x;\r\n }\r\n if (frame.y < minY) {\r\n minY = frame.y;\r\n }\r\n });\r\n\r\n // Restore to 0\r\n this._frames.forEach((frame) => {\r\n frame.x += -minX;\r\n frame.y += -minY;\r\n frame.cleanAccumulation();\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.x += -minX;\r\n node.y += -minY;\r\n node.cleanAccumulation();\r\n });\r\n\r\n // Get correct zoom\r\n const xFactor = this._rootContainer.clientWidth / this._rootContainer.scrollWidth;\r\n const yFactor = this._rootContainer.clientHeight / this._rootContainer.scrollHeight;\r\n const zoomFactor = xFactor < yFactor ? xFactor : yFactor;\r\n\r\n this.zoom = zoomFactor;\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n processCandidatePort() {\r\n let pointB = this._candidateLink!.portA.portData;\r\n let nodeB = this._candidateLink!.portA.node;\r\n let pointA: IPortData;\r\n let nodeA: GraphNode;\r\n\r\n if (this._candidatePort) {\r\n pointA = this._candidatePort.portData;\r\n nodeA = this._candidatePort.node;\r\n } else {\r\n if (pointB.direction === PortDataDirection.Output) {\r\n return;\r\n }\r\n\r\n // No destination so let's spin a new input node\r\n const newDefaultInput = this.props.stateManager.createDefaultInputData(this.props.stateManager.data, this._candidateLink!.portA.portData, this);\r\n if (!newDefaultInput) {\r\n return;\r\n }\r\n const pointName = newDefaultInput.name;\r\n const emittedNodeData = newDefaultInput.data;\r\n\r\n pointA = emittedNodeData.getPortByName(pointName)!;\r\n if (!emittedNodeData.isInput) {\r\n nodeA = this.props.onEmitNewNode(emittedNodeData);\r\n } else {\r\n nodeA = this.appendNode(emittedNodeData as any);\r\n }\r\n nodeA.x = this._dropPointX - 200;\r\n nodeA.y = this._dropPointY - 50;\r\n\r\n const x = nodeA.x - 250;\r\n let y = nodeA.y;\r\n\r\n emittedNodeData.inputs.forEach((portData: IPortData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x;\r\n connectedNode.y = y;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (pointA.direction === PortDataDirection.Input) {\r\n const temp = pointB;\r\n pointB = pointA;\r\n pointA = temp;\r\n\r\n const tempNode = nodeA;\r\n nodeA = nodeB;\r\n nodeB = tempNode;\r\n }\r\n\r\n if (pointB.connectedPort === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB.direction === pointA.direction) {\r\n return;\r\n }\r\n\r\n if (pointB.ownerData === pointA.ownerData) {\r\n return;\r\n }\r\n\r\n // Check compatibility\r\n let compatibilityState = pointA.checkCompatibilityState(pointB);\r\n if ((pointA.needDualDirectionValidation || pointB.needDualDirectionValidation) && !compatibilityState) {\r\n compatibilityState = pointB.checkCompatibilityState(pointA);\r\n }\r\n\r\n const message = pointA.getCompatibilityIssueMessage(compatibilityState, nodeB, pointB);\r\n\r\n if (message) {\r\n this.props.stateManager.onErrorMessageDialogRequiredObservable.notifyObservers(message);\r\n return;\r\n }\r\n\r\n let linksToNotifyForDispose: Nullable<NodeLink[]> = null;\r\n\r\n if (pointB.isConnected) {\r\n const links = nodeB.getLinksForPortData(pointB);\r\n\r\n linksToNotifyForDispose = links.slice();\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n }\r\n\r\n if (pointB.ownerData.inputsAreExclusive) {\r\n // Disconnect all inputs if node has exclusive inputs\r\n pointB.ownerData.inputs.forEach((i: any) => {\r\n const links = nodeB.getLinksForPortData(i);\r\n\r\n if (!linksToNotifyForDispose) {\r\n linksToNotifyForDispose = links.slice();\r\n } else {\r\n linksToNotifyForDispose.push(...links.slice());\r\n }\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n });\r\n }\r\n\r\n this.connectNodes(nodeA, pointA, nodeB, pointB);\r\n\r\n linksToNotifyForDispose?.forEach((link) => {\r\n link.onDisposedObservable.notifyObservers(link);\r\n link.onDisposedObservable.clear();\r\n });\r\n\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n }\r\n\r\n connectNodes(nodeA: GraphNode, pointA: IPortData, nodeB: GraphNode, pointB: IPortData) {\r\n pointA.connectTo(pointB);\r\n this.connectPorts(pointA, pointB);\r\n\r\n // Need to potentially propagate the type of pointA to other ports of nodes connected to owner of pointB\r\n // We also need to check if we want to display the promotion warning\r\n\r\n const visitedNodes = new Set<GraphNode>([nodeA]);\r\n const visitedLinks = new Set<NodeLink>([nodeB.links[nodeB.links.length - 1]]);\r\n\r\n RefreshNode(nodeB, visitedNodes, visitedLinks);\r\n }\r\n\r\n drop(newNode: GraphNode, targetX: number, targetY: number, offsetX: number, offsetY: number) {\r\n let x = targetX - this.x - offsetX * this.zoom;\r\n let y = targetY - this.y - offsetY * this.zoom;\r\n\r\n newNode.x = x / this.zoom;\r\n newNode.y = y / this.zoom;\r\n newNode.cleanAccumulation();\r\n\r\n this.props.stateManager.onNewNodeCreatedObservable.notifyObservers(newNode);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode });\r\n\r\n x -= GraphCanvasComponent.NodeWidth + 150;\r\n\r\n newNode.content.inputs.forEach((portData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x / this.zoom;\r\n connectedNode.y = y / this.zoom;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n processEditorData(editorData: IEditorData) {\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n\r\n this._frames = [];\r\n this.x = editorData.x || 0;\r\n this.y = editorData.y || 0;\r\n this.zoom = editorData.zoom || 1;\r\n\r\n // Frames\r\n if (editorData.frames) {\r\n for (const frameData of editorData.frames) {\r\n const frame = GraphFrame.Parse(frameData, this, editorData.map);\r\n this._frames.push(frame);\r\n }\r\n }\r\n }\r\n\r\n reOrganize(editorData: Nullable<IEditorData> = null, isImportingAFrame = false) {\r\n if (!editorData || !editorData.locations) {\r\n this.distributeGraph();\r\n } else {\r\n // Locations\r\n for (const location of editorData.locations) {\r\n for (const node of this.nodes) {\r\n const data = node.content.data;\r\n if (data && data.uniqueId === location.blockId) {\r\n node.x = location.x;\r\n node.y = location.y;\r\n node.cleanAccumulation();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!isImportingAFrame) {\r\n this.processEditorData(editorData);\r\n }\r\n }\r\n\r\n this._isLoading = false;\r\n for (const node of this.nodes) {\r\n node._refreshLinks();\r\n }\r\n }\r\n\r\n addFrame(frameData: IFrameData) {\r\n const frame = GraphFrame.Parse(frameData, this, this.props.stateManager.getEditorDataMap());\r\n this._frames.push(frame);\r\n this.stateManager.onSelectionChangedObservable.notifyObservers({ selection: frame });\r\n }\r\n\r\n render() {\r\n return (\r\n <div\r\n ref={this._hostCanvasRef}\r\n id=\"graph-canvas\"\r\n className={styles[\"graph-canvas\"]}\r\n onWheel={(evt) => this.onWheel(evt)}\r\n onPointerMove={(evt) => this.onMove(evt)}\r\n onPointerDown={(evt) => this.onDown(evt)}\r\n onPointerUp={(evt) => this.onUp(evt)}\r\n >\r\n <div id=\"graph-container\" className={styles[\"graph-container\"]} ref={this._rootContainerRef}>\r\n <div id=\"graph-canvas-container\" className={styles[\"graph-canvas-container\"]} ref={this._graphCanvasRef}></div>\r\n <div id=\"frame-container\" className={styles[\"frame-container\"]} ref={this._frameContainerRef}></div>\r\n <svg id=\"graph-svg-container\" className={styles[\"graph-svg-container\"]} ref={this._svgCanvasRef}></svg>\r\n <div id=\"selection-container\" className={styles[\"selection-container\"]} ref={this._selectionContainerRef}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"graphCanvas.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/graphCanvas.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport { GraphNode } from \"./graphNode\";\r\nimport * as dagre from \"dagre\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { NodeLink } from \"./nodeLink\";\r\nimport { NodePort } from \"./nodePort\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { DataStorage } from \"core/Misc/dataStorage\";\r\nimport { GraphFrame } from \"./graphFrame\";\r\nimport type { IEditorData, IFrameData } from \"./interfaces/nodeLocationInfo\";\r\nimport { FrameNodePort } from \"./frameNodePort\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport type { FramePortData } from \"./types/framePortData\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport { PortDataDirection } from \"./interfaces/portData\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport styles from \"./graphCanvas.modules.scss\";\r\nimport commonStyles from \"./common.modules.scss\";\r\n\r\nimport { TypeLedger } from \"./typeLedger\";\r\nimport { RefreshNode } from \"./tools\";\r\nimport { SearchBoxComponent } from \"./searchBox\";\r\n\r\nexport interface IGraphCanvasComponentProps {\r\n stateManager: StateManager;\r\n onEmitNewNode: (nodeData: INodeData) => GraphNode;\r\n}\r\n\r\nexport class GraphCanvasComponent extends React.Component<IGraphCanvasComponentProps> implements INodeContainer {\r\n public static readonly NodeWidth = 100;\r\n private readonly _minZoom = 0.1;\r\n private readonly _maxZoom = 4;\r\n\r\n private _hostCanvasRef = React.createRef<HTMLDivElement>();\r\n private _hostCanvas: HTMLDivElement;\r\n private _graphCanvasRef = React.createRef<HTMLDivElement>();\r\n private _graphCanvas: HTMLDivElement;\r\n private _selectionContainerRef = React.createRef<HTMLDivElement>();\r\n private _selectionContainer: HTMLDivElement;\r\n private _frameContainerRef = React.createRef<HTMLDivElement>();\r\n private _frameContainer: HTMLDivElement;\r\n private _svgCanvasRef = React.createRef<SVGSVGElement>();\r\n private _svgCanvas: HTMLElement;\r\n private _rootContainerRef = React.createRef<HTMLDivElement>();\r\n private _rootContainer: HTMLDivElement;\r\n private _nodes: GraphNode[] = [];\r\n private _links: NodeLink[] = [];\r\n private _mouseStartPointX: Nullable<number> = null;\r\n private _mouseStartPointY: Nullable<number> = null;\r\n private _dropPointX = 0;\r\n private _dropPointY = 0;\r\n private _selectionStartX = 0;\r\n private _selectionStartY = 0;\r\n private _candidateLinkedHasMoved = false;\r\n private _x = 0;\r\n private _y = 0;\r\n private _zoom = 1;\r\n private _selectedNodes: GraphNode[] = [];\r\n private _selectedLink: Nullable<NodeLink> = null;\r\n private _selectedPort: Nullable<NodePort> = null;\r\n private _candidateLink: Nullable<NodeLink> = null;\r\n private _candidatePort: Nullable<NodePort | FrameNodePort> = null;\r\n private _gridSize = 20;\r\n private _selectionBox: Nullable<HTMLDivElement> = null;\r\n private _selectedFrames: GraphFrame[] = [];\r\n private _frameCandidate: Nullable<HTMLDivElement> = null;\r\n private _frames: GraphFrame[] = [];\r\n private _nodeDataContentList = new Array<any>();\r\n\r\n private _altKeyIsPressed = false;\r\n private _multiKeyIsPressed = false;\r\n private _oldY = -1;\r\n\r\n public _frameIsMoving = false;\r\n public _isLoading = false;\r\n public _targetLinkCandidate: Nullable<NodeLink> = null;\r\n\r\n private _copiedNodes: GraphNode[] = [];\r\n private _copiedFrames: GraphFrame[] = [];\r\n\r\n public get gridSize() {\r\n return this._gridSize;\r\n }\r\n\r\n public set gridSize(value: number) {\r\n this._gridSize = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get stateManager() {\r\n return this.props.stateManager;\r\n }\r\n\r\n public get nodes() {\r\n return this._nodes;\r\n }\r\n\r\n public get links() {\r\n return this._links;\r\n }\r\n\r\n public get frames() {\r\n return this._frames;\r\n }\r\n\r\n public get zoom() {\r\n return this._zoom;\r\n }\r\n\r\n public set zoom(value: number) {\r\n if (this._zoom === value) {\r\n return;\r\n }\r\n\r\n this._zoom = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get selectedNodes() {\r\n return this._selectedNodes;\r\n }\r\n\r\n public get selectedLink() {\r\n return this._selectedLink;\r\n }\r\n public get selectedFrames() {\r\n return this._selectedFrames;\r\n }\r\n\r\n public get selectedPort() {\r\n return this._selectedPort;\r\n }\r\n\r\n public get canvasContainer() {\r\n return this._graphCanvas;\r\n }\r\n\r\n public get hostCanvas() {\r\n return this._hostCanvas;\r\n }\r\n\r\n public get svgCanvas() {\r\n return this._svgCanvas;\r\n }\r\n\r\n public get selectionContainer() {\r\n return this._selectionContainer;\r\n }\r\n\r\n public get frameContainer() {\r\n return this._frameContainer;\r\n }\r\n\r\n // There is a selection conflict between nodes and frames if any selected node is inside any selected frame\r\n private _selectedFrameAndNodesConflict(frameSelection: GraphFrame[], nodeSelection: GraphNode[]) {\r\n for (const frame of frameSelection) {\r\n for (const node of nodeSelection) {\r\n if (frame.nodes.includes(node)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n constructor(props: IGraphCanvasComponentProps) {\r\n super(props);\r\n\r\n props.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection, forceKeepSelection, marqueeSelection = false } = options || {};\r\n if (!selection) {\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedFrames = [];\r\n this._selectedPort = null;\r\n } else {\r\n if (selection instanceof NodeLink) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = selection;\r\n this._selectedPort = null;\r\n } else if (selection instanceof NodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof FrameNodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof GraphNode || selection instanceof GraphFrame) {\r\n // If in marquee selection mode, always prioritize selecting nodes. Otherwise, always prioritize selecting the type of\r\n // the selected element\r\n if (marqueeSelection) {\r\n if (selection instanceof GraphFrame && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n } else if (selection instanceof GraphNode && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n if (this._selectedFrameAndNodesConflict(this.selectedFrames, this.selectedNodes)) {\r\n const framesToRemove = new Set();\r\n for (const selectedNode of this._selectedNodes) {\r\n for (const selectedFrame of this._selectedFrames) {\r\n if (selectedFrame.nodes.includes(selectedNode)) {\r\n framesToRemove.add(selectedFrame);\r\n }\r\n }\r\n }\r\n this._selectedFrames = this._selectedFrames.filter((f) => !framesToRemove.has(f));\r\n }\r\n } else {\r\n if (selection instanceof GraphFrame) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict([selection], this._selectedNodes) && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [selection];\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n } else if (selection instanceof GraphNode) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict(this._selectedFrames, [selection]) && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [];\r\n this._selectedNodes = [selection];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n props.stateManager.onCandidatePortSelectedObservable.add((port) => {\r\n this._candidatePort = port;\r\n });\r\n\r\n props.stateManager.onGridSizeChanged.add(() => {\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n });\r\n\r\n this.props.stateManager.hostDocument!.addEventListener(\"keyup\", () => this.onKeyUp(), false);\r\n this.props.stateManager.hostDocument!.addEventListener(\r\n \"keydown\",\r\n (evt) => {\r\n this._altKeyIsPressed = evt.altKey;\r\n this._multiKeyIsPressed = evt.ctrlKey || evt.metaKey;\r\n },\r\n false\r\n );\r\n this.props.stateManager.hostDocument!.defaultView!.addEventListener(\r\n \"blur\",\r\n () => {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n },\r\n false\r\n );\r\n\r\n // Store additional data to serialization object\r\n this.props.stateManager.storeEditorData = (editorData, graphFrame) => {\r\n editorData.frames = [];\r\n if (graphFrame) {\r\n editorData.frames.push(graphFrame!.serialize(false));\r\n } else {\r\n editorData.x = this.x;\r\n editorData.y = this.y;\r\n editorData.zoom = this.zoom;\r\n for (const frame of this._frames) {\r\n editorData.frames.push(frame.serialize(true));\r\n }\r\n }\r\n };\r\n }\r\n\r\n populateConnectedEntriesBeforeRemoval(item: GraphNode, items: GraphNode[], inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[]) {\r\n inputs.push(\r\n ...item.content.inputs.filter((i) => i.isConnected && items.every((selected) => selected.content.data !== i.connectedPort?.ownerData)).map((i) => i.connectedPort)\r\n );\r\n\r\n outputs.push(\r\n ...item.content.outputs\r\n .filter((i) => i.isConnected)\r\n .map((i) => i.endpoints)\r\n .flat()\r\n .filter((i) => i && items.every((selected) => selected.content.data !== i.ownerData))\r\n );\r\n }\r\n\r\n automaticRewire(inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[], firstOnly = false) {\r\n let oneConnectionFound = false;\r\n if (outputs.length && inputs.length) {\r\n inputs.forEach((input) => {\r\n if (oneConnectionFound) {\r\n return;\r\n }\r\n if (!input) {\r\n return;\r\n }\r\n const output = outputs[0];\r\n if (output && input.canConnectTo(output)) {\r\n const nodeInput = this.findNodeFromData(input.ownerData);\r\n const nodeOutput = this.findNodeFromData(output.ownerData);\r\n this.connectNodes(nodeInput, input, nodeOutput, output);\r\n outputs.shift();\r\n if (firstOnly) {\r\n oneConnectionFound = true;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n smartAddOverLink(node: GraphNode, link: NodeLink) {\r\n // Connect the ports\r\n const inputs: Nullable<IPortData>[] = [];\r\n const outputs: Nullable<IPortData>[] = [];\r\n const availableNodeInputs: Nullable<IPortData>[] = [];\r\n const availableNodeOutputs: Nullable<IPortData>[] = [];\r\n const leftNode = link.nodeA;\r\n const rightNode = link.nodeB!;\r\n\r\n // Delete previous\r\n link.dispose();\r\n\r\n // Get the ports\r\n availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));\r\n\r\n availableNodeOutputs.push(...node.content.outputs);\r\n\r\n inputs.push(...leftNode.content.outputs);\r\n\r\n outputs.push(...rightNode.content.inputs.filter((i) => !i.isConnected));\r\n\r\n // Reconnect\r\n this.automaticRewire(inputs, availableNodeInputs, true);\r\n this.automaticRewire(availableNodeOutputs, outputs, true);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n }\r\n\r\n smartAddOverNode(node: GraphNode, source: GraphNode) {\r\n // Connect the ports\r\n const inputs: Nullable<IPortData>[] = [];\r\n const availableNodeInputs: Nullable<IPortData>[] = [];\r\n\r\n // Get the ports\r\n availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));\r\n\r\n inputs.push(...source.content.outputs);\r\n\r\n // Reconnect\r\n this.automaticRewire(inputs, availableNodeInputs, true);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n }\r\n\r\n deleteSelection(onRemove: (nodeData: INodeData) => void, autoReconnect = false) {\r\n // Delete\r\n const selectedItems = this.selectedNodes;\r\n const inputs: Nullable<IPortData>[] = [];\r\n const outputs: Nullable<IPortData>[] = [];\r\n let needRebuild = false;\r\n\r\n if (selectedItems.length > 0) {\r\n needRebuild = true;\r\n for (const selectedItem of selectedItems) {\r\n if (autoReconnect) {\r\n this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);\r\n }\r\n\r\n selectedItem.dispose();\r\n\r\n onRemove(selectedItem.content);\r\n this.removeDataFromCache(selectedItem.content.data);\r\n }\r\n }\r\n\r\n if (this.selectedLink) {\r\n needRebuild = true;\r\n this.selectedLink.dispose();\r\n }\r\n\r\n if (this.selectedFrames.length) {\r\n needRebuild = true;\r\n for (const frame of this.selectedFrames) {\r\n if (frame.isCollapsed) {\r\n while (frame.nodes.length > 0) {\r\n onRemove(frame.nodes[0].content);\r\n this.removeDataFromCache(frame.nodes[0].content.data);\r\n frame.nodes[0].dispose();\r\n }\r\n frame.isCollapsed = false;\r\n } else {\r\n frame.nodes.forEach((node) => {\r\n node.enclosingFrameId = -1;\r\n });\r\n }\r\n frame.dispose();\r\n }\r\n }\r\n\r\n if (!needRebuild) {\r\n return;\r\n }\r\n\r\n // Reconnect if required\r\n this.automaticRewire(inputs, outputs);\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n }\r\n\r\n handleKeyDown(\r\n evt: KeyboardEvent,\r\n onRemove: (nodeData: INodeData) => void,\r\n mouseLocationX: number,\r\n mouseLocationY: number,\r\n dataGenerator: (nodeData: INodeData) => any,\r\n rootElement: HTMLDivElement\r\n ) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n if (evt.code === \"Space\" && evt.target === this.props.stateManager.hostDocument!.body) {\r\n this.stateManager.modalIsDisplayed = true;\r\n this.props.stateManager.onSearchBoxRequiredObservable.notifyObservers({ x: mouseLocationX, y: mouseLocationY });\r\n return;\r\n }\r\n if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {\r\n this.deleteSelection(onRemove, evt.altKey);\r\n return;\r\n }\r\n\r\n if ((!evt.ctrlKey && !evt.metaKey) || this.props.stateManager.lockObject.lock) {\r\n return;\r\n }\r\n\r\n if (evt.key === \"c\" || evt.key === \"C\") {\r\n // Copy\r\n this._copiedNodes = [];\r\n this._copiedFrames = [];\r\n\r\n if (this.selectedFrames.length) {\r\n for (const frame of this.selectedFrames) {\r\n frame.serialize(true);\r\n this._copiedFrames.push(frame);\r\n }\r\n return;\r\n }\r\n\r\n const selectedItems = this.selectedNodes;\r\n if (!selectedItems.length) {\r\n return;\r\n }\r\n\r\n const selectedItem = selectedItems[0] as GraphNode;\r\n\r\n if (!selectedItem.content.data) {\r\n return;\r\n }\r\n\r\n this._copiedNodes = selectedItems.slice(0);\r\n } else if (evt.key === \"v\" || evt.key === \"V\") {\r\n // Paste\r\n const zoomLevel = this.zoom;\r\n let currentY = (mouseLocationY - rootElement.offsetTop - this.y - 20) / zoomLevel;\r\n\r\n if (this._copiedFrames.length) {\r\n for (const frame of this._copiedFrames) {\r\n // New frame\r\n const newFrame = new GraphFrame(null, this, true);\r\n this.frames.push(newFrame);\r\n\r\n newFrame.width = frame.width;\r\n newFrame.height = frame.height;\r\n newFrame.width / 2;\r\n newFrame.name = frame.name;\r\n newFrame.color = frame.color;\r\n\r\n let currentX = (mouseLocationX - rootElement.offsetLeft - this.x) / zoomLevel;\r\n newFrame.x = currentX - newFrame.width / 2;\r\n newFrame.y = currentY;\r\n\r\n // Paste nodes\r\n if (frame.nodes.length) {\r\n currentX = newFrame.x + frame.nodes[0].x - frame.x;\r\n currentY = newFrame.y + frame.nodes[0].y - frame.y;\r\n\r\n this._frameIsMoving = true;\r\n const newNodes = this.pasteSelection(frame.nodes, currentX, currentY, dataGenerator);\r\n if (newNodes) {\r\n for (const node of newNodes) {\r\n newFrame.syncNode(node);\r\n }\r\n }\r\n this._frameIsMoving = false;\r\n }\r\n\r\n newFrame.adjustPorts();\r\n\r\n if (frame.isCollapsed) {\r\n newFrame.isCollapsed = true;\r\n }\r\n\r\n // Select\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame, forceKeepSelection: true });\r\n return;\r\n }\r\n }\r\n\r\n if (!this._copiedNodes.length) {\r\n return;\r\n }\r\n\r\n const currentX = (mouseLocationX - rootElement.offsetLeft - this.x - GraphCanvasComponent.NodeWidth) / zoomLevel;\r\n this.pasteSelection(this._copiedNodes, currentX, currentY, dataGenerator, true);\r\n }\r\n }\r\n\r\n pasteSelection(copiedNodes: GraphNode[], currentX: number, currentY: number, dataGenerator: (nodeData: INodeData) => any, selectNew = false) {\r\n let originalNode: Nullable<GraphNode> = null;\r\n\r\n const newNodes: GraphNode[] = [];\r\n\r\n // Copy to prevent recursive side effects while creating nodes.\r\n copiedNodes = copiedNodes.slice();\r\n\r\n // Cancel selection\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n\r\n // Create new nodes\r\n for (const node of copiedNodes) {\r\n const data = node.content.data;\r\n\r\n if (!data) {\r\n continue;\r\n }\r\n\r\n const newNode = dataGenerator(node.content);\r\n\r\n let x = 0;\r\n let y = 0;\r\n if (originalNode) {\r\n x = currentX + node.x - originalNode.x;\r\n y = currentY + node.y - originalNode.y;\r\n } else {\r\n originalNode = node;\r\n x = currentX;\r\n y = currentY;\r\n }\r\n\r\n newNode.x = x;\r\n newNode.y = y;\r\n newNode.cleanAccumulation();\r\n\r\n newNodes.push(newNode);\r\n\r\n if (selectNew) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode, forceKeepSelection: true });\r\n }\r\n }\r\n\r\n // Relink\r\n const done = new Array<boolean>(newNodes.length);\r\n for (let index = 0; index < newNodes.length; index++) {\r\n this.reconnectNewNodes(index, newNodes, copiedNodes, done);\r\n }\r\n\r\n return newNodes;\r\n }\r\n\r\n reconnectNewNodes(nodeIndex: number, newNodes: GraphNode[], sourceNodes: GraphNode[], done: boolean[]) {\r\n if (done[nodeIndex]) {\r\n return;\r\n }\r\n\r\n const currentNode = newNodes[nodeIndex];\r\n const sourceNode = sourceNodes[nodeIndex];\r\n\r\n for (let inputIndex = 0; inputIndex < sourceNode.content.inputs.length; inputIndex++) {\r\n const sourceInput = sourceNode.content.inputs[inputIndex];\r\n const currentInput = currentNode.content.inputs[inputIndex];\r\n if (!sourceInput.isConnected) {\r\n continue;\r\n }\r\n const sourceContent = this.findNodeFromData(sourceInput.connectedPort!.ownerData).content;\r\n const activeNodes = sourceNodes.filter((s) => s.content === sourceContent);\r\n\r\n if (activeNodes.length > 0) {\r\n const activeNode = activeNodes[0];\r\n const indexInList = sourceNodes.indexOf(activeNode);\r\n\r\n // First make sure to connect the other one\r\n this.reconnectNewNodes(indexInList, newNodes, sourceNodes, done);\r\n\r\n // Then reconnect\r\n const outputIndex = sourceContent.outputs.indexOf(sourceInput.connectedPort!);\r\n const newOutput = newNodes[indexInList].content.data.outputs[outputIndex];\r\n\r\n newOutput.connectTo(currentInput.data);\r\n } else {\r\n // Connect with outside nodes\r\n sourceInput.connectedPort!.connectTo(currentInput);\r\n }\r\n\r\n this.connectPorts(currentInput.connectedPort!, currentInput);\r\n }\r\n\r\n currentNode.refresh();\r\n\r\n done[nodeIndex] = true;\r\n }\r\n\r\n public getCachedData(): any[] {\r\n return this._nodeDataContentList;\r\n }\r\n\r\n public removeDataFromCache(data: any) {\r\n const dataIndex = this._nodeDataContentList.indexOf(data);\r\n\r\n if (dataIndex > -1) {\r\n this._nodeDataContentList.splice(dataIndex, 1);\r\n }\r\n }\r\n\r\n public createNodeFromObject(nodeData: INodeData, onNodeCreated: (data: any) => void, recursion = true) {\r\n if (this._nodeDataContentList.indexOf(nodeData.data) !== -1) {\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n return this.nodes.filter((n) => n.content.data === nodeData.data)[0];\r\n }\r\n\r\n onNodeCreated(nodeData.data);\r\n\r\n // Connections\r\n if (nodeData.inputs.length) {\r\n for (const input of nodeData.inputs) {\r\n if (input.connectedPort && recursion) {\r\n this.createNodeFromObject(TypeLedger.NodeDataBuilder(input.connectedPort.ownerData, this), onNodeCreated);\r\n }\r\n }\r\n }\r\n\r\n // Graph\r\n const node = this.appendNode(nodeData);\r\n\r\n node.addClassToVisual(nodeData.getClassName());\r\n\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getGridPosition(position: number, useCeil = false) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n if (useCeil) {\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n return gridSize * Math.floor(position / gridSize);\r\n }\r\n\r\n public getGridPositionCeil(position: number) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n\r\n updateTransform() {\r\n this._rootContainer.style.transform = `translate(${this._x}px, ${this._y}px) scale(${this._zoom})`;\r\n\r\n if (DataStorage.ReadBoolean(\"ShowGrid\", true)) {\r\n this._hostCanvas.style.backgroundSize = `${this._gridSize * this._zoom}px ${this._gridSize * this._zoom}px`;\r\n this._hostCanvas.style.backgroundPosition = `${this._x}px ${this._y}px`;\r\n } else {\r\n this._hostCanvas.style.backgroundSize = `0`;\r\n }\r\n }\r\n\r\n onKeyUp() {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n this._oldY = -1;\r\n }\r\n\r\n findNodeFromData(data: any) {\r\n return this.nodes.filter((n) => n.content.data === data)[0];\r\n }\r\n\r\n reset() {\r\n this._nodeDataContentList = [];\r\n\r\n for (const node of this._nodes) {\r\n node.dispose();\r\n }\r\n\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n this._nodes = [];\r\n this._frames = [];\r\n this._links = [];\r\n this._graphCanvas.innerHTML = \"\";\r\n this._svgCanvas.innerHTML = \"\";\r\n }\r\n\r\n connectPorts(pointA: IPortData, pointB: IPortData) {\r\n if (!pointA || !pointB) {\r\n return;\r\n }\r\n\r\n const ownerDataA = pointA.ownerData;\r\n const ownerDataB = pointB.ownerData;\r\n const nodeA = this.findNodeFromData(ownerDataA);\r\n const nodeB = this.findNodeFromData(ownerDataB);\r\n\r\n if (!nodeA || !nodeB) {\r\n return;\r\n }\r\n\r\n const portA = nodeA.getPortForPortData(pointA);\r\n const portB = nodeB.getPortForPortData(pointB);\r\n\r\n if (!portA || !portB) {\r\n return;\r\n }\r\n\r\n for (const currentLink of this._links) {\r\n if (currentLink.portA === portA && currentLink.portB === portB) {\r\n return;\r\n }\r\n if (currentLink.portA === portB && currentLink.portB === portA) {\r\n return;\r\n }\r\n }\r\n\r\n const link = new NodeLink(this, portA, nodeA, portB, nodeB);\r\n this._links.push(link);\r\n\r\n nodeA.links.push(link);\r\n nodeB.links.push(link);\r\n }\r\n\r\n removeLink(link: NodeLink) {\r\n const index = this._links.indexOf(link);\r\n\r\n if (index > -1) {\r\n this._links.splice(index, 1);\r\n }\r\n\r\n link.dispose();\r\n }\r\n\r\n appendNode(nodeData: INodeData) {\r\n const newNode = new GraphNode(nodeData, this.props.stateManager);\r\n\r\n newNode.appendVisual(this._graphCanvas, this);\r\n\r\n this._nodes.push(newNode);\r\n this._nodeDataContentList.push(nodeData.data);\r\n\r\n return newNode;\r\n }\r\n\r\n distributeGraph() {\r\n this.x = 0;\r\n this.y = 0;\r\n this.zoom = 1;\r\n\r\n const graph = new dagre.graphlib.Graph();\r\n graph.setGraph({});\r\n graph.setDefaultEdgeLabel(() => ({}));\r\n graph.graph().rankdir = \"LR\";\r\n\r\n // Build dagre graph\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n graph.setNode(node.id.toString(), {\r\n id: node.id,\r\n type: \"node\",\r\n width: node.width,\r\n height: node.height,\r\n });\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n graph.setNode(frame.id.toString(), {\r\n id: frame.id,\r\n type: \"frame\",\r\n width: frame.element.clientWidth,\r\n height: frame.element.clientHeight,\r\n });\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.content.outputs.forEach((output) => {\r\n if (!output.hasEndpoints) {\r\n return;\r\n }\r\n\r\n output.endpoints!.forEach((endpoint) => {\r\n const sourceFrames = this._frames.filter((f) => f.nodes.indexOf(node) !== -1);\r\n const targetFrames = this._frames.filter((f) => f.nodes.some((n) => n.content.data === endpoint.ownerData));\r\n\r\n const sourceId = sourceFrames.length > 0 ? sourceFrames[0].id : node.id;\r\n const targetId = targetFrames.length > 0 ? targetFrames[0].id : endpoint.ownerData.uniqueId;\r\n\r\n graph.setEdge(sourceId.toString(), targetId.toString());\r\n });\r\n });\r\n });\r\n\r\n // Distribute\r\n dagre.layout(graph);\r\n\r\n // Update graph\r\n const dagreNodes = graph.nodes().map((node) => graph.node(node));\r\n dagreNodes.forEach((dagreNode: any) => {\r\n if (!dagreNode) {\r\n return;\r\n }\r\n if (dagreNode.type === \"node\") {\r\n for (const node of this._nodes) {\r\n if (node.id === dagreNode.id) {\r\n node.x = dagreNode.x - dagreNode.width / 2;\r\n node.y = dagreNode.y - dagreNode.height / 2;\r\n node.cleanAccumulation();\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n for (const frame of this._frames) {\r\n if (frame.id === dagreNode.id) {\r\n this._frameIsMoving = true;\r\n frame.move(dagreNode.x - dagreNode.width / 2, dagreNode.y - dagreNode.height / 2, false);\r\n frame.cleanAccumulation();\r\n this._frameIsMoving = false;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n this._hostCanvas = this._hostCanvasRef.current!;\r\n this._rootContainer = this._rootContainerRef.current!;\r\n this._graphCanvas = this._graphCanvasRef.current!;\r\n this._svgCanvas = this._svgCanvasRef.current! as unknown as HTMLElement;\r\n this._selectionContainer = this._selectionContainerRef.current!;\r\n this._frameContainer = this._frameContainerRef.current!;\r\n\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n this.updateTransform();\r\n }\r\n\r\n onMove(evt: React.PointerEvent) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n // Selection box\r\n if (this._selectionBox) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.left = `${localX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.top = `${localY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n this.props.stateManager.onSelectionBoxMoved.notifyObservers(this._selectionBox.getBoundingClientRect());\r\n\r\n return;\r\n }\r\n\r\n // Candidate frame box\r\n if (this._frameCandidate) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.left = `${localX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.top = `${localY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Candidate link\r\n if (this._candidateLink) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._candidatePort = null;\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(new Vector2(evt.pageX, evt.pageY));\r\n this._dropPointX = (evt.pageX - rootRect.left) / this.zoom;\r\n this._dropPointY = (evt.pageY - rootRect.top) / this.zoom;\r\n\r\n this._candidateLink.update(this._dropPointX, this._dropPointY, true);\r\n this._candidateLinkedHasMoved = true;\r\n\r\n return;\r\n }\r\n\r\n // Zoom with mouse + alt\r\n if (this._altKeyIsPressed && evt.buttons === 1) {\r\n if (this._oldY < 0) {\r\n this._oldY = evt.pageY;\r\n }\r\n\r\n const zoomDelta = (evt.pageY - this._oldY) / 10;\r\n if (Math.abs(zoomDelta) > 5) {\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.max(Math.min(this._maxZoom, this.zoom + zoomDelta / 100), this._minZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n\r\n this._oldY = evt.pageY;\r\n }\r\n return;\r\n }\r\n\r\n // Move canvas\r\n this._rootContainer.style.cursor = \"move\";\r\n\r\n if (this._mouseStartPointX === null || this._mouseStartPointY === null) {\r\n return;\r\n }\r\n this.x += evt.clientX - this._mouseStartPointX;\r\n this.y += evt.clientY - this._mouseStartPointY;\r\n\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onDown(evt: React.PointerEvent<HTMLElement>) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n this._rootContainer.setPointerCapture(evt.pointerId);\r\n\r\n // Port dragging\r\n if (evt.nativeEvent.srcElement && (evt.nativeEvent.srcElement as HTMLElement).nodeName === \"IMG\") {\r\n if (!this._candidateLink) {\r\n const portElement = ((evt.nativeEvent.srcElement as HTMLElement).parentElement as any).port as NodePort;\r\n if (this._altKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n // Delete connection\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n\r\n // Pick the first one as target port\r\n const targetNode = links[0].nodeA === node ? links[0].nodeB : links[0].nodeA;\r\n const targetPort = links[0].nodeA === node ? links[0].portB : links[0].portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else if (this._multiKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n // Pick the first one as target port\r\n const linkToConsider = this._selectedLink || links[0];\r\n const targetNode = linkToConsider.nodeA === node ? linkToConsider.nodeB : linkToConsider.nodeA;\r\n const targetPort = linkToConsider.nodeA === node ? linkToConsider.portB : linkToConsider.portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else {\r\n this._candidateLink = new NodeLink(this, portElement, portElement.node);\r\n }\r\n this._candidateLinkedHasMoved = false;\r\n }\r\n return;\r\n }\r\n\r\n // Selection?\r\n if (evt.currentTarget === this._hostCanvas && this._multiKeyIsPressed) {\r\n this._selectionBox = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._selectionBox.classList.add(styles[\"selection-box\"]);\r\n this._selectionContainer.appendChild(this._selectionBox);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.width = \"0px\";\r\n this._selectionBox.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n // Frame?\r\n if (evt.currentTarget === this._hostCanvas && evt.shiftKey) {\r\n this._frameCandidate = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._frameCandidate.classList.add(commonStyles[\"frame-box\"]);\r\n this._frameContainer.appendChild(this._frameCandidate);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.width = \"0px\";\r\n this._frameCandidate.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onUp(evt: React.PointerEvent) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n this._mouseStartPointX = null;\r\n this._mouseStartPointY = null;\r\n this._rootContainer.releasePointerCapture(evt.pointerId);\r\n this._oldY = -1;\r\n if (this._candidateLink) {\r\n if (this._candidateLinkedHasMoved) {\r\n this.processCandidatePort();\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(null);\r\n } else {\r\n // is a click event on NodePort\r\n if (this._candidateLink.portA instanceof FrameNodePort) {\r\n //only on Frame Node Ports\r\n const port = this._candidateLink.portA;\r\n const frame = this.frames.find((frame: GraphFrame) => frame.id === port.parentFrameId);\r\n if (frame) {\r\n const data: FramePortData = {\r\n frame,\r\n port,\r\n };\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: data });\r\n }\r\n } else if (this._candidateLink.portA instanceof NodePort) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: this._candidateLink.portA });\r\n }\r\n }\r\n this._candidateLink.dispose();\r\n this._candidateLink = null;\r\n this._candidatePort = null;\r\n }\r\n\r\n if (this._selectionBox) {\r\n this._selectionBox.parentElement!.removeChild(this._selectionBox);\r\n this._selectionBox = null;\r\n }\r\n\r\n if (this._frameCandidate) {\r\n const newFrame = new GraphFrame(this._frameCandidate, this);\r\n this._frames.push(newFrame);\r\n\r\n this._frameCandidate.parentElement!.removeChild(this._frameCandidate);\r\n this._frameCandidate = null;\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame });\r\n }\r\n }\r\n\r\n onWheel(evt: React.WheelEvent) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n const delta = evt.deltaY < 0 ? 0.1 : -0.1;\r\n\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.min(Math.max(this._minZoom, this.zoom + delta * this.zoom), this._maxZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const clientHeight = boundingRect.height;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const heightDiff = clientHeight * this.zoom - clientHeight * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n const clientY = evt.clientY - boundingRect.top;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n const yFactor = (clientY - this.y) / oldZoom / clientHeight;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n this.y = this.y - heightDiff * yFactor;\r\n }\r\n\r\n zoomToFit() {\r\n // Get negative offset\r\n let minX = 0;\r\n let minY = 0;\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n if (node.x < minX) {\r\n minX = node.x;\r\n }\r\n if (node.y < minY) {\r\n minY = node.y;\r\n }\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n if (frame.x < minX) {\r\n minX = frame.x;\r\n }\r\n if (frame.y < minY) {\r\n minY = frame.y;\r\n }\r\n });\r\n\r\n // Restore to 0\r\n this._frames.forEach((frame) => {\r\n frame.x += -minX;\r\n frame.y += -minY;\r\n frame.cleanAccumulation();\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.x += -minX;\r\n node.y += -minY;\r\n node.cleanAccumulation();\r\n });\r\n\r\n // Get correct zoom\r\n const xFactor = this._rootContainer.clientWidth / this._rootContainer.scrollWidth;\r\n const yFactor = this._rootContainer.clientHeight / this._rootContainer.scrollHeight;\r\n const zoomFactor = xFactor < yFactor ? xFactor : yFactor;\r\n\r\n this.zoom = zoomFactor;\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n processCandidatePort() {\r\n let pointB = this._candidateLink!.portA.portData;\r\n let nodeB = this._candidateLink!.portA.node;\r\n let pointA: IPortData;\r\n let nodeA: GraphNode;\r\n\r\n if (this._candidatePort) {\r\n pointA = this._candidatePort.portData;\r\n nodeA = this._candidatePort.node;\r\n } else {\r\n if (pointB.direction === PortDataDirection.Output) {\r\n return;\r\n }\r\n\r\n // No destination so let's spin a new input node\r\n const newDefaultInput = this.props.stateManager.createDefaultInputData(this.props.stateManager.data, this._candidateLink!.portA.portData, this);\r\n if (!newDefaultInput) {\r\n return;\r\n }\r\n const pointName = newDefaultInput.name;\r\n const emittedNodeData = newDefaultInput.data;\r\n\r\n pointA = emittedNodeData.getPortByName(pointName)!;\r\n if (!emittedNodeData.isInput) {\r\n nodeA = this.props.onEmitNewNode(emittedNodeData);\r\n } else {\r\n nodeA = this.appendNode(emittedNodeData as any);\r\n }\r\n nodeA.x = this._dropPointX - 200;\r\n nodeA.y = this._dropPointY - 50;\r\n\r\n const x = nodeA.x - 250;\r\n let y = nodeA.y;\r\n\r\n emittedNodeData.inputs.forEach((portData: IPortData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x;\r\n connectedNode.y = y;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (pointA.direction === PortDataDirection.Input) {\r\n const temp = pointB;\r\n pointB = pointA;\r\n pointA = temp;\r\n\r\n const tempNode = nodeA;\r\n nodeA = nodeB;\r\n nodeB = tempNode;\r\n }\r\n\r\n if (pointB.connectedPort === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB.direction === pointA.direction) {\r\n return;\r\n }\r\n\r\n if (pointB.ownerData === pointA.ownerData) {\r\n return;\r\n }\r\n\r\n // Check compatibility\r\n let compatibilityState = pointA.checkCompatibilityState(pointB);\r\n if ((pointA.needDualDirectionValidation || pointB.needDualDirectionValidation) && !compatibilityState) {\r\n compatibilityState = pointB.checkCompatibilityState(pointA);\r\n }\r\n\r\n const message = pointA.getCompatibilityIssueMessage(compatibilityState, nodeB, pointB);\r\n\r\n if (message) {\r\n this.props.stateManager.onErrorMessageDialogRequiredObservable.notifyObservers(message);\r\n return;\r\n }\r\n\r\n let linksToNotifyForDispose: Nullable<NodeLink[]> = null;\r\n\r\n if (pointB.isConnected) {\r\n const links = nodeB.getLinksForPortData(pointB);\r\n\r\n linksToNotifyForDispose = links.slice();\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n }\r\n\r\n if (pointB.ownerData.inputsAreExclusive) {\r\n // Disconnect all inputs if node has exclusive inputs\r\n pointB.ownerData.inputs.forEach((i: any) => {\r\n const links = nodeB.getLinksForPortData(i);\r\n\r\n if (!linksToNotifyForDispose) {\r\n linksToNotifyForDispose = links.slice();\r\n } else {\r\n linksToNotifyForDispose.push(...links.slice());\r\n }\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n });\r\n }\r\n\r\n this.connectNodes(nodeA, pointA, nodeB, pointB);\r\n\r\n linksToNotifyForDispose?.forEach((link) => {\r\n link.onDisposedObservable.notifyObservers(link);\r\n link.onDisposedObservable.clear();\r\n });\r\n\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n }\r\n\r\n connectNodes(nodeA: GraphNode, pointA: IPortData, nodeB: GraphNode, pointB: IPortData) {\r\n pointA.connectTo(pointB);\r\n this.connectPorts(pointA, pointB);\r\n\r\n // Need to potentially propagate the type of pointA to other ports of nodes connected to owner of pointB\r\n // We also need to check if we want to display the promotion warning\r\n\r\n const visitedNodes = new Set<GraphNode>([nodeA]);\r\n const visitedLinks = new Set<NodeLink>([nodeB.links[nodeB.links.length - 1]]);\r\n\r\n RefreshNode(nodeB, visitedNodes, visitedLinks);\r\n }\r\n\r\n drop(newNode: GraphNode, targetX: number, targetY: number, offsetX: number, offsetY: number) {\r\n let x = targetX - this.x - offsetX * this.zoom;\r\n let y = targetY - this.y - offsetY * this.zoom;\r\n\r\n newNode.x = x / this.zoom;\r\n newNode.y = y / this.zoom;\r\n newNode.cleanAccumulation();\r\n\r\n this.props.stateManager.onNewNodeCreatedObservable.notifyObservers(newNode);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode });\r\n\r\n x -= GraphCanvasComponent.NodeWidth + 150;\r\n\r\n newNode.content.inputs.forEach((portData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x / this.zoom;\r\n connectedNode.y = y / this.zoom;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n processEditorData(editorData: IEditorData) {\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n\r\n this._frames = [];\r\n this.x = editorData.x || 0;\r\n this.y = editorData.y || 0;\r\n this.zoom = editorData.zoom || 1;\r\n\r\n // Frames\r\n if (editorData.frames) {\r\n for (const frameData of editorData.frames) {\r\n const frame = GraphFrame.Parse(frameData, this, editorData.map);\r\n this._frames.push(frame);\r\n }\r\n }\r\n }\r\n\r\n reOrganize(editorData: Nullable<IEditorData> = null, isImportingAFrame = false) {\r\n if (!editorData || !editorData.locations) {\r\n this.distributeGraph();\r\n } else {\r\n // Locations\r\n for (const location of editorData.locations) {\r\n for (const node of this.nodes) {\r\n const data = node.content.data;\r\n if (data && data.uniqueId === location.blockId) {\r\n node.x = location.x;\r\n node.y = location.y;\r\n node.cleanAccumulation();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!isImportingAFrame) {\r\n this.processEditorData(editorData);\r\n }\r\n }\r\n\r\n this._isLoading = false;\r\n for (const node of this.nodes) {\r\n node._refreshLinks();\r\n }\r\n }\r\n\r\n addFrame(frameData: IFrameData) {\r\n const frame = GraphFrame.Parse(frameData, this, this.props.stateManager.getEditorDataMap());\r\n this._frames.push(frame);\r\n this.stateManager.onSelectionChangedObservable.notifyObservers({ selection: frame });\r\n }\r\n\r\n render() {\r\n return (\r\n <div\r\n ref={this._hostCanvasRef}\r\n id=\"graph-canvas\"\r\n className={styles[\"graph-canvas\"]}\r\n onWheel={(evt) => this.onWheel(evt)}\r\n onPointerMove={(evt) => this.onMove(evt)}\r\n onPointerDown={(evt) => this.onDown(evt)}\r\n onPointerUp={(evt) => this.onUp(evt)}\r\n >\r\n <div id=\"graph-container\" className={styles[\"graph-container\"]} ref={this._rootContainerRef}>\r\n <div id=\"graph-canvas-container\" className={styles[\"graph-canvas-container\"]} ref={this._graphCanvasRef}></div>\r\n <div id=\"frame-container\" className={styles[\"frame-container\"]} ref={this._frameContainerRef}></div>\r\n <svg id=\"graph-svg-container\" className={styles[\"graph-svg-container\"]} ref={this._svgCanvasRef}></svg>\r\n <div id=\"selection-container\" className={styles[\"selection-container\"]} ref={this._selectionContainerRef}></div>\r\n </div>\r\n <SearchBoxComponent stateManager={this.stateManager} />\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -7,6 +7,7 @@
7
7
  user-select: none;
8
8
  overflow: hidden;
9
9
  cursor: move;
10
+ position: relative;
10
11
  background-image: linear-gradient(to right, #4f4e4f 1px, transparent 1px), linear-gradient(to bottom, #4f4e4f 1px, transparent 1px);
11
12
  }
12
13
 
@@ -25,6 +25,9 @@
25
25
  color: white;
26
26
  transform: scaleX(1.01) translateY(-0.5px);
27
27
  transform-origin: center;
28
+ display: grid;
29
+ grid-template-columns: 1fr auto;
30
+ grid-template-rows: 100%;
28
31
  }
29
32
 
30
33
  .headerIcon {
@@ -34,12 +37,11 @@
34
37
  z-index: 10;
35
38
  justify-self: end;
36
39
  align-self: center;
37
- margin-right: 5px;
38
40
  user-select: none;
39
41
  pointer-events: none;
40
42
  width: 20px;
41
43
  display: grid;
42
- margin-left: 5px;
44
+ margin-left: 6px;
43
45
  }
44
46
 
45
47
  .header {
@@ -48,6 +50,7 @@
48
50
  white-space: nowrap;
49
51
  text-overflow: ellipsis;
50
52
  overflow: hidden;
53
+ max-width: 190px;
51
54
  }
52
55
 
53
56
  .connections {
@@ -0,0 +1,4 @@
1
+ export declare class NodeLedger {
2
+ static RegisteredNodeNames: string[];
3
+ static NameFormatter: (name: string) => string;
4
+ }
@@ -0,0 +1,5 @@
1
+ export class NodeLedger {
2
+ }
3
+ NodeLedger.RegisteredNodeNames = [];
4
+ NodeLedger.NameFormatter = (name) => name;
5
+ //# sourceMappingURL=nodeLedger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeLedger.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/nodeLedger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;;AACL,8BAAmB,GAAa,EAAE,CAAC;AACnC,wBAAa,GAA6B,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC","sourcesContent":["export class NodeLedger {\r\n public static RegisteredNodeNames: string[] = [];\r\n public static NameFormatter: (name: string) => string = (name: string) => name;\r\n}\r\n"]}
@@ -87,12 +87,13 @@ export class NodeLink {
87
87
  if (rect.left > locatRect.right || rect.right < locatRect.left || rect.top > locatRect.bottom || rect.bottom < locatRect.top) {
88
88
  return false;
89
89
  }
90
+ const zoom = this._graphCanvas.zoom;
90
91
  const svg = this._graphCanvas.svgCanvas;
91
92
  const rootRect = svg.getBoundingClientRect();
92
- const left = rect.x - rootRect.x;
93
- const top = rect.y - rootRect.y;
94
- const right = left + rect.width;
95
- const bottom = top + rect.height;
93
+ const left = (rect.x - rootRect.x) / zoom;
94
+ const top = (rect.y - rootRect.y) / zoom;
95
+ const right = left + rect.width / zoom;
96
+ const bottom = top + rect.height / zoom;
96
97
  const sampleRate = 10; // Checking 10 times on the path should be enough
97
98
  for (let index = 0; index < 1; index += 1 / sampleRate) {
98
99
  const point = this._path.getPointAtLength(index * this._path.getTotalLength());
@@ -1 +1 @@
1
- {"version":3,"file":"nodeLink.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/nodeLink.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { NodePort } from \"./nodePort\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { GraphCanvasComponent } from \"./graphCanvas\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport { RefreshNode } from \"./tools\";\r\nimport commonStyles from \"./common.modules.scss\";\r\nimport styles from \"./nodeLink.modules.scss\";\r\n\r\nexport class NodeLink {\r\n private _graphCanvas: GraphCanvasComponent;\r\n private _portA: NodePort | FrameNodePort;\r\n private _portB?: NodePort | FrameNodePort;\r\n private _nodeA: GraphNode;\r\n private _nodeB?: GraphNode;\r\n private _path: SVGPathElement;\r\n private _selectionPath: SVGPathElement;\r\n private _onSelectionChangedObserver: Nullable<Observer<Nullable<ISelectionChangedOptions>>>;\r\n private _isVisible = true;\r\n private _isTargetCandidate = false;\r\n\r\n public onDisposedObservable = new Observable<NodeLink>();\r\n\r\n public get isTargetCandidate() {\r\n return this._isTargetCandidate;\r\n }\r\n\r\n public set isTargetCandidate(value: boolean) {\r\n if (this._isTargetCandidate === value) {\r\n return;\r\n }\r\n\r\n this._isTargetCandidate = value;\r\n\r\n if (value) {\r\n this._path.classList.add(styles[\"target-candidate\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"target-candidate\"]);\r\n }\r\n }\r\n\r\n public get isVisible() {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n this._isVisible = value;\r\n\r\n if (!value) {\r\n this._path.classList.add(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.add(commonStyles[\"hidden\"]);\r\n } else {\r\n this._path.classList.remove(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.remove(commonStyles[\"hidden\"]);\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n public get portA() {\r\n return this._portA;\r\n }\r\n\r\n public get portB() {\r\n return this._portB;\r\n }\r\n\r\n public get nodeA() {\r\n return this._nodeA;\r\n }\r\n\r\n public get nodeB() {\r\n return this._nodeB;\r\n }\r\n\r\n public intersectsWith(rect: DOMRect) {\r\n const locatRect = this._path.getBoundingClientRect();\r\n if (rect.left > locatRect.right || rect.right < locatRect.left || rect.top > locatRect.bottom || rect.bottom < locatRect.top) {\r\n return false;\r\n }\r\n\r\n const svg = this._graphCanvas.svgCanvas as any as SVGSVGElement;\r\n const rootRect = svg.getBoundingClientRect();\r\n\r\n const left = rect.x - rootRect.x;\r\n const top = rect.y - rootRect.y;\r\n const right = left + rect.width;\r\n const bottom = top + rect.height;\r\n\r\n const sampleRate = 10; // Checking 10 times on the path should be enough\r\n\r\n for (let index = 0; index < 1; index += 1 / sampleRate) {\r\n const point = this._path.getPointAtLength(index * this._path.getTotalLength());\r\n if (left < point.x && right > point.x && top < point.y && bottom > point.y) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public update(endX = 0, endY = 0, straight = false) {\r\n const rectA = this._portA.element.getBoundingClientRect();\r\n const rootRect = this._graphCanvas.canvasContainer.getBoundingClientRect();\r\n const zoom = this._graphCanvas.zoom;\r\n const xOffset = rootRect.left;\r\n const yOffset = rootRect.top;\r\n\r\n const startX = (rectA.left - xOffset + 0.5 * rectA.width) / zoom;\r\n const startY = (rectA.top - yOffset + 0.5 * rectA.height) / zoom;\r\n\r\n if (this._portB) {\r\n const rectB = this._portB.element.getBoundingClientRect();\r\n endX = (rectB.left - xOffset + 0.5 * rectB.width) / zoom;\r\n endY = (rectB.top - yOffset + 0.5 * rectB.height) / zoom;\r\n }\r\n\r\n if (straight) {\r\n this._path.setAttribute(\"d\", `M${startX},${startY} L${endX},${endY}`);\r\n this._path.setAttribute(\"stroke-dasharray\", \"10, 10\");\r\n this._path.setAttribute(\"stroke-linecap\", \"round\");\r\n } else {\r\n const deltaX = endX - startX;\r\n const deltaY = endY - startY;\r\n const tangentLength = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 0.5, 300);\r\n this._path.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n this._selectionPath.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n }\r\n this._path.setAttribute(\"stroke\", this._portA.element.style.backgroundColor!);\r\n }\r\n\r\n public constructor(graphCanvas: GraphCanvasComponent, portA: NodePort, nodeA: GraphNode, portB?: NodePort, nodeB?: GraphNode) {\r\n this._portA = portA;\r\n this._portB = portB;\r\n this._nodeA = nodeA;\r\n this._nodeB = nodeB;\r\n this._graphCanvas = graphCanvas;\r\n\r\n const document = portA.element.ownerDocument!;\r\n const svg = graphCanvas.svgCanvas;\r\n\r\n // Create path\r\n this._path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._path.setAttribute(\"fill\", \"none\");\r\n this._path.classList.add(styles[\"link\"]);\r\n\r\n svg.appendChild(this._path);\r\n\r\n this._selectionPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._selectionPath.setAttribute(\"fill\", \"none\");\r\n this._selectionPath.classList.add(styles[\"selection-link\"]);\r\n\r\n svg.appendChild(this._selectionPath);\r\n\r\n this._selectionPath.onmousedown = (evt: MouseEvent) => this.onClick(evt);\r\n\r\n if (this._portB) {\r\n // Update\r\n this.update();\r\n }\r\n\r\n this._onSelectionChangedObserver = this._graphCanvas.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection } = options || {};\r\n if (selection === this) {\r\n this._path.classList.add(styles[\"selected\"]);\r\n this._selectionPath.classList.add(styles[\"selected\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"selected\"]);\r\n this._selectionPath.classList.remove(styles[\"selected\"]);\r\n }\r\n });\r\n }\r\n\r\n onClick(evt: MouseEvent) {\r\n const stateManager = this._graphCanvas.stateManager;\r\n if (evt.altKey) {\r\n const nodeA = this._nodeA;\r\n const pointA = this._portA.portData;\r\n const nodeB = this._nodeB!;\r\n const pointB = this._portB!.portData;\r\n\r\n if (!stateManager.isElbowConnectionAllowed(this._portA, this._portB!)) {\r\n return;\r\n }\r\n\r\n // Create an elbow at the clicked location\r\n stateManager.onNewNodeCreatedObservable.addOnce((newNode) => {\r\n const newElbowBlock = newNode.content.data as any;\r\n\r\n // Delete previous link\r\n this.dispose();\r\n\r\n // Connect to Elbow block\r\n this._graphCanvas.connectNodes(nodeA, pointA, newNode, newNode.getPortDataForPortDataContent(newElbowBlock.input)!);\r\n this._graphCanvas.connectNodes(newNode, newNode.getPortDataForPortDataContent(newElbowBlock.output)!, nodeB, pointB);\r\n\r\n stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n });\r\n\r\n stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: \"ElbowBlock\",\r\n targetX: evt.clientX,\r\n targetY: evt.clientY,\r\n needRepositioning: true,\r\n });\r\n return;\r\n }\r\n\r\n stateManager.onSelectionChangedObservable.notifyObservers({ selection: this });\r\n }\r\n\r\n public dispose(notify = true) {\r\n this._graphCanvas.stateManager.onSelectionChangedObservable.remove(this._onSelectionChangedObserver);\r\n\r\n if (this._path.parentElement) {\r\n this._path.parentElement.removeChild(this._path);\r\n }\r\n\r\n if (this._selectionPath.parentElement) {\r\n this._selectionPath.parentElement.removeChild(this._selectionPath);\r\n }\r\n\r\n if (this._nodeB) {\r\n this._nodeA.links.splice(this._nodeA.links.indexOf(this), 1);\r\n this._nodeB.links.splice(this._nodeB.links.indexOf(this), 1);\r\n this._graphCanvas.links.splice(this._graphCanvas.links.indexOf(this), 1);\r\n\r\n this._portA.portData.disconnectFrom(this._portB!.portData);\r\n\r\n RefreshNode(this._nodeB);\r\n }\r\n\r\n if (notify) {\r\n this.onDisposedObservable.notifyObservers(this);\r\n\r\n this.onDisposedObservable.clear();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"nodeLink.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/nodeLink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAMlD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAE7C,MAAM,OAAO,QAAQ;IA2HjB,YAAmB,WAAiC,EAAE,KAAe,EAAE,KAAgB,EAAE,KAAgB,EAAE,KAAiB;QAlHpH,eAAU,GAAG,IAAI,CAAC;QAClB,uBAAkB,GAAG,KAAK,CAAC;QAE5B,yBAAoB,GAAG,IAAI,UAAU,EAAY,CAAC;QAgHrD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAc,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC;QAElC,cAAc;QACd,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACrF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE5D,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAErC,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,CAAC,GAAe,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,SAAS;YACT,IAAI,CAAC,MAAM,EAAE,CAAC;SACjB;QAED,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3G,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;YACpC,IAAI,SAAS,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;aACzD;iBAAM;gBACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;aAC5D;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IArJD,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAc;QACvC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;YACnC,OAAO;SACV;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAEhC,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;SACxD;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;SAC3D;IACL,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,KAAK,EAAE;YACR,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;SAC7D;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;SAChE;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEM,cAAc,CAAC,IAAa;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE;YAC1H,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAiC,CAAC;QAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAE7C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAExC,MAAM,UAAU,GAAG,EAAE,CAAC,CAAC,iDAAiD;QAExE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE;gBACxE,OAAO,IAAI,CAAC;aACf;SACJ;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC;QAE7B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAEjE,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC1D,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YACzD,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;SAC5D;QAED,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;SACtD;aAAM;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;YAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;YACxF,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,GAAG,aAAa,IAAI,MAAM,IAAI,IAAI,GAAG,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1I,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,GAAG,aAAa,IAAI,MAAM,IAAI,IAAI,GAAG,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;SACtJ;QACD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAgB,CAAC,CAAC;IAClF,CAAC;IA4CD,OAAO,CAAC,GAAe;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;QACpD,IAAI,GAAG,CAAC,MAAM,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAO,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC;YAErC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAO,CAAC,EAAE;gBACnE,OAAO;aACV;YAED,0CAA0C;YAC1C,YAAY,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAW,CAAC;gBAElD,uBAAuB;gBACvB,IAAI,CAAC,OAAO,EAAE,CAAC;gBAEf,yBAAyB;gBACzB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,6BAA6B,CAAC,aAAa,CAAC,KAAK,CAAE,CAAC,CAAC;gBACpH,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,6BAA6B,CAAC,aAAa,CAAC,MAAM,CAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAErH,YAAY,CAAC,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC;gBACtD,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,iBAAiB,EAAE,IAAI;aAC1B,CAAC,CAAC;YACH,OAAO;SACV;QAED,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IAEM,OAAO,CAAC,MAAM,GAAG,IAAI;QACxB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAErG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpD;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;YACnC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACtE;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAEzE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC;YAE3D,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEhD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;SACrC;IACL,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { NodePort } from \"./nodePort\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { GraphCanvasComponent } from \"./graphCanvas\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport { RefreshNode } from \"./tools\";\r\nimport commonStyles from \"./common.modules.scss\";\r\nimport styles from \"./nodeLink.modules.scss\";\r\n\r\nexport class NodeLink {\r\n private _graphCanvas: GraphCanvasComponent;\r\n private _portA: NodePort | FrameNodePort;\r\n private _portB?: NodePort | FrameNodePort;\r\n private _nodeA: GraphNode;\r\n private _nodeB?: GraphNode;\r\n private _path: SVGPathElement;\r\n private _selectionPath: SVGPathElement;\r\n private _onSelectionChangedObserver: Nullable<Observer<Nullable<ISelectionChangedOptions>>>;\r\n private _isVisible = true;\r\n private _isTargetCandidate = false;\r\n\r\n public onDisposedObservable = new Observable<NodeLink>();\r\n\r\n public get isTargetCandidate() {\r\n return this._isTargetCandidate;\r\n }\r\n\r\n public set isTargetCandidate(value: boolean) {\r\n if (this._isTargetCandidate === value) {\r\n return;\r\n }\r\n\r\n this._isTargetCandidate = value;\r\n\r\n if (value) {\r\n this._path.classList.add(styles[\"target-candidate\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"target-candidate\"]);\r\n }\r\n }\r\n\r\n public get isVisible() {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n this._isVisible = value;\r\n\r\n if (!value) {\r\n this._path.classList.add(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.add(commonStyles[\"hidden\"]);\r\n } else {\r\n this._path.classList.remove(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.remove(commonStyles[\"hidden\"]);\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n public get portA() {\r\n return this._portA;\r\n }\r\n\r\n public get portB() {\r\n return this._portB;\r\n }\r\n\r\n public get nodeA() {\r\n return this._nodeA;\r\n }\r\n\r\n public get nodeB() {\r\n return this._nodeB;\r\n }\r\n\r\n public intersectsWith(rect: DOMRect) {\r\n const locatRect = this._path.getBoundingClientRect();\r\n if (rect.left > locatRect.right || rect.right < locatRect.left || rect.top > locatRect.bottom || rect.bottom < locatRect.top) {\r\n return false;\r\n }\r\n\r\n const zoom = this._graphCanvas.zoom;\r\n const svg = this._graphCanvas.svgCanvas as any as SVGSVGElement;\r\n const rootRect = svg.getBoundingClientRect();\r\n\r\n const left = (rect.x - rootRect.x) / zoom;\r\n const top = (rect.y - rootRect.y) / zoom;\r\n const right = left + rect.width / zoom;\r\n const bottom = top + rect.height / zoom;\r\n\r\n const sampleRate = 10; // Checking 10 times on the path should be enough\r\n\r\n for (let index = 0; index < 1; index += 1 / sampleRate) {\r\n const point = this._path.getPointAtLength(index * this._path.getTotalLength());\r\n if (left < point.x && right > point.x && top < point.y && bottom > point.y) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public update(endX = 0, endY = 0, straight = false) {\r\n const rectA = this._portA.element.getBoundingClientRect();\r\n const rootRect = this._graphCanvas.canvasContainer.getBoundingClientRect();\r\n const zoom = this._graphCanvas.zoom;\r\n const xOffset = rootRect.left;\r\n const yOffset = rootRect.top;\r\n\r\n const startX = (rectA.left - xOffset + 0.5 * rectA.width) / zoom;\r\n const startY = (rectA.top - yOffset + 0.5 * rectA.height) / zoom;\r\n\r\n if (this._portB) {\r\n const rectB = this._portB.element.getBoundingClientRect();\r\n endX = (rectB.left - xOffset + 0.5 * rectB.width) / zoom;\r\n endY = (rectB.top - yOffset + 0.5 * rectB.height) / zoom;\r\n }\r\n\r\n if (straight) {\r\n this._path.setAttribute(\"d\", `M${startX},${startY} L${endX},${endY}`);\r\n this._path.setAttribute(\"stroke-dasharray\", \"10, 10\");\r\n this._path.setAttribute(\"stroke-linecap\", \"round\");\r\n } else {\r\n const deltaX = endX - startX;\r\n const deltaY = endY - startY;\r\n const tangentLength = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 0.5, 300);\r\n this._path.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n this._selectionPath.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n }\r\n this._path.setAttribute(\"stroke\", this._portA.element.style.backgroundColor!);\r\n }\r\n\r\n public constructor(graphCanvas: GraphCanvasComponent, portA: NodePort, nodeA: GraphNode, portB?: NodePort, nodeB?: GraphNode) {\r\n this._portA = portA;\r\n this._portB = portB;\r\n this._nodeA = nodeA;\r\n this._nodeB = nodeB;\r\n this._graphCanvas = graphCanvas;\r\n\r\n const document = portA.element.ownerDocument!;\r\n const svg = graphCanvas.svgCanvas;\r\n\r\n // Create path\r\n this._path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._path.setAttribute(\"fill\", \"none\");\r\n this._path.classList.add(styles[\"link\"]);\r\n\r\n svg.appendChild(this._path);\r\n\r\n this._selectionPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._selectionPath.setAttribute(\"fill\", \"none\");\r\n this._selectionPath.classList.add(styles[\"selection-link\"]);\r\n\r\n svg.appendChild(this._selectionPath);\r\n\r\n this._selectionPath.onmousedown = (evt: MouseEvent) => this.onClick(evt);\r\n\r\n if (this._portB) {\r\n // Update\r\n this.update();\r\n }\r\n\r\n this._onSelectionChangedObserver = this._graphCanvas.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection } = options || {};\r\n if (selection === this) {\r\n this._path.classList.add(styles[\"selected\"]);\r\n this._selectionPath.classList.add(styles[\"selected\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"selected\"]);\r\n this._selectionPath.classList.remove(styles[\"selected\"]);\r\n }\r\n });\r\n }\r\n\r\n onClick(evt: MouseEvent) {\r\n const stateManager = this._graphCanvas.stateManager;\r\n if (evt.altKey) {\r\n const nodeA = this._nodeA;\r\n const pointA = this._portA.portData;\r\n const nodeB = this._nodeB!;\r\n const pointB = this._portB!.portData;\r\n\r\n if (!stateManager.isElbowConnectionAllowed(this._portA, this._portB!)) {\r\n return;\r\n }\r\n\r\n // Create an elbow at the clicked location\r\n stateManager.onNewNodeCreatedObservable.addOnce((newNode) => {\r\n const newElbowBlock = newNode.content.data as any;\r\n\r\n // Delete previous link\r\n this.dispose();\r\n\r\n // Connect to Elbow block\r\n this._graphCanvas.connectNodes(nodeA, pointA, newNode, newNode.getPortDataForPortDataContent(newElbowBlock.input)!);\r\n this._graphCanvas.connectNodes(newNode, newNode.getPortDataForPortDataContent(newElbowBlock.output)!, nodeB, pointB);\r\n\r\n stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n });\r\n\r\n stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: \"ElbowBlock\",\r\n targetX: evt.clientX,\r\n targetY: evt.clientY,\r\n needRepositioning: true,\r\n });\r\n return;\r\n }\r\n\r\n stateManager.onSelectionChangedObservable.notifyObservers({ selection: this });\r\n }\r\n\r\n public dispose(notify = true) {\r\n this._graphCanvas.stateManager.onSelectionChangedObservable.remove(this._onSelectionChangedObserver);\r\n\r\n if (this._path.parentElement) {\r\n this._path.parentElement.removeChild(this._path);\r\n }\r\n\r\n if (this._selectionPath.parentElement) {\r\n this._selectionPath.parentElement.removeChild(this._selectionPath);\r\n }\r\n\r\n if (this._nodeB) {\r\n this._nodeA.links.splice(this._nodeA.links.indexOf(this), 1);\r\n this._nodeB.links.splice(this._nodeB.links.indexOf(this), 1);\r\n this._graphCanvas.links.splice(this._graphCanvas.links.indexOf(this), 1);\r\n\r\n this._portA.portData.disconnectFrom(this._portB!.portData);\r\n\r\n RefreshNode(this._nodeB);\r\n }\r\n\r\n if (notify) {\r\n this.onDisposedObservable.notifyObservers(this);\r\n\r\n this.onDisposedObservable.clear();\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,24 @@
1
+ import * as React from "react";
2
+ import type { StateManager } from "./stateManager";
3
+ import "./searchBox.scss";
4
+ export interface ISearchBoxComponentProps {
5
+ stateManager: StateManager;
6
+ }
7
+ /**
8
+ * The search box component.
9
+ */
10
+ export declare class SearchBoxComponent extends React.Component<ISearchBoxComponentProps, {
11
+ isVisible: boolean;
12
+ filter: string;
13
+ }> {
14
+ private _handleEscKey;
15
+ private _targetX;
16
+ private _targetY;
17
+ private _nodes;
18
+ constructor(props: ISearchBoxComponentProps);
19
+ hide(): void;
20
+ onFilterChange(evt: React.ChangeEvent<HTMLInputElement>): void;
21
+ onNewNodeRequested(name: string): void;
22
+ onKeyDown(evt: React.KeyboardEvent): void;
23
+ render(): JSX.Element | null;
24
+ }
@@ -0,0 +1,84 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import "./searchBox.scss";
4
+ import { NodeLedger } from "./nodeLedger.js";
5
+ /**
6
+ * The search box component.
7
+ */
8
+ export class SearchBoxComponent extends React.Component {
9
+ constructor(props) {
10
+ super(props);
11
+ this.state = { isVisible: false, filter: "" };
12
+ this._handleEscKey = (evt) => {
13
+ if (evt.key === "Escape") {
14
+ this.hide();
15
+ }
16
+ };
17
+ this.props.stateManager.onSearchBoxRequiredObservable.add((loc) => {
18
+ this._targetX = loc.x;
19
+ this._targetY = loc.y;
20
+ this.setState({ isVisible: true, filter: "" });
21
+ this.props.stateManager.hostDocument.addEventListener("keydown", this._handleEscKey);
22
+ });
23
+ }
24
+ hide() {
25
+ this.setState({ isVisible: false });
26
+ this.props.stateManager.modalIsDisplayed = false;
27
+ this.props.stateManager.hostDocument.removeEventListener("keydown", this._handleEscKey);
28
+ }
29
+ onFilterChange(evt) {
30
+ this.setState({ filter: evt.target.value });
31
+ }
32
+ onNewNodeRequested(name) {
33
+ this.props.stateManager.onNewBlockRequiredObservable.notifyObservers({
34
+ type: name,
35
+ targetX: this._targetX,
36
+ targetY: this._targetY,
37
+ needRepositioning: true,
38
+ smartAdd: true,
39
+ });
40
+ this.hide();
41
+ }
42
+ onKeyDown(evt) {
43
+ if (evt.code === "Enter" && this._nodes.length > 0) {
44
+ this.onNewNodeRequested(this._nodes[0]);
45
+ return;
46
+ }
47
+ }
48
+ render() {
49
+ if (!this.state.isVisible) {
50
+ return null;
51
+ }
52
+ const expectedWidth = 300;
53
+ const expectedHeight = 400;
54
+ // Sort and deduplicate the node names.
55
+ this._nodes = Array.from(new Set(NodeLedger.RegisteredNodeNames.sort()));
56
+ if (this.state.filter) {
57
+ const filter = this.state.filter.toLowerCase().trim();
58
+ this._nodes = this._nodes.filter((name) => NodeLedger.NameFormatter(name).toLowerCase().includes(filter));
59
+ }
60
+ const containerRect = this.props.stateManager.hostDocument.getElementById("graph-canvas").getBoundingClientRect();
61
+ const targetX = this._targetX - (expectedWidth / 2 + containerRect.x);
62
+ const targetY = this._targetY - (expectedHeight / 2 + containerRect.y);
63
+ const locStyle = {
64
+ left: targetX + "px",
65
+ top: targetY + "px",
66
+ };
67
+ if (targetX + expectedWidth > containerRect.width) {
68
+ locStyle.left = containerRect.width - expectedWidth - 10 + "px";
69
+ }
70
+ else if (targetX < 10) {
71
+ locStyle.left = "10px";
72
+ }
73
+ if (targetY + expectedHeight > containerRect.height) {
74
+ locStyle.top = containerRect.height - expectedHeight - 10 + "px";
75
+ }
76
+ else if (targetY < 10) {
77
+ locStyle.top = "10px";
78
+ }
79
+ return (_jsxs("div", { id: "graph-search-container", children: [_jsx("div", { id: "graph-search-picking-blocker", onClick: () => this.hide() }), _jsxs("div", { id: "graph-search-box", style: locStyle, children: [_jsx("div", { className: "graph-search-box-title", children: "Add a node" }), _jsx("input", { type: "text", placeholder: "Search...", onChange: (evt) => this.onFilterChange(evt), onKeyDown: (evt) => this.onKeyDown(evt), value: this.state.filter, className: "graph-search-box-filter", autoFocus: true, tabIndex: 0 }), _jsx("div", { className: "graph-search-box-list", children: this._nodes.map((name) => {
80
+ return (_jsx("div", { className: "graph-search-box-list-item ", onClick: () => this.onNewNodeRequested(name), children: NodeLedger.NameFormatter(name) }, name));
81
+ }) })] })] }));
82
+ }
83
+ }
84
+ //# sourceMappingURL=searchBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchBox.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/searchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport \"./searchBox.scss\";\r\nimport { NodeLedger } from \"./nodeLedger\";\r\n\r\nexport interface ISearchBoxComponentProps {\r\n stateManager: StateManager;\r\n}\r\n\r\n/**\r\n * The search box component.\r\n */\r\nexport class SearchBoxComponent extends React.Component<ISearchBoxComponentProps, { isVisible: boolean; filter: string }> {\r\n private _handleEscKey: (evt: KeyboardEvent) => void;\r\n private _targetX: number;\r\n private _targetY: number;\r\n private _nodes: string[];\r\n\r\n constructor(props: ISearchBoxComponentProps) {\r\n super(props);\r\n\r\n this.state = { isVisible: false, filter: \"\" };\r\n\r\n this._handleEscKey = (evt: KeyboardEvent) => {\r\n if (evt.key === \"Escape\") {\r\n this.hide();\r\n }\r\n };\r\n\r\n this.props.stateManager.onSearchBoxRequiredObservable.add((loc) => {\r\n this._targetX = loc.x;\r\n this._targetY = loc.y;\r\n this.setState({ isVisible: true, filter: \"\" });\r\n this.props.stateManager.hostDocument!.addEventListener(\"keydown\", this._handleEscKey);\r\n });\r\n }\r\n\r\n hide() {\r\n this.setState({ isVisible: false });\r\n this.props.stateManager.modalIsDisplayed = false;\r\n this.props.stateManager.hostDocument!.removeEventListener(\"keydown\", this._handleEscKey);\r\n }\r\n\r\n onFilterChange(evt: React.ChangeEvent<HTMLInputElement>) {\r\n this.setState({ filter: evt.target.value });\r\n }\r\n\r\n onNewNodeRequested(name: string) {\r\n this.props.stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: name,\r\n targetX: this._targetX,\r\n targetY: this._targetY,\r\n needRepositioning: true,\r\n smartAdd: true,\r\n });\r\n\r\n this.hide();\r\n }\r\n\r\n onKeyDown(evt: React.KeyboardEvent) {\r\n if (evt.code === \"Enter\" && this._nodes.length > 0) {\r\n this.onNewNodeRequested(this._nodes[0]);\r\n return;\r\n }\r\n }\r\n\r\n render() {\r\n if (!this.state.isVisible) {\r\n return null;\r\n }\r\n\r\n const expectedWidth = 300;\r\n const expectedHeight = 400;\r\n\r\n // Sort and deduplicate the node names.\r\n this._nodes = Array.from(new Set(NodeLedger.RegisteredNodeNames.sort()));\r\n\r\n if (this.state.filter) {\r\n const filter = this.state.filter.toLowerCase().trim();\r\n this._nodes = this._nodes.filter((name) => NodeLedger.NameFormatter(name).toLowerCase().includes(filter));\r\n }\r\n\r\n const containerRect = this.props.stateManager.hostDocument.getElementById(\"graph-canvas\")!.getBoundingClientRect();\r\n const targetX = this._targetX - (expectedWidth / 2 + containerRect.x);\r\n const targetY = this._targetY - (expectedHeight / 2 + containerRect.y);\r\n const locStyle = {\r\n left: targetX + \"px\",\r\n top: targetY + \"px\",\r\n };\r\n\r\n if (targetX + expectedWidth > containerRect.width) {\r\n locStyle.left = containerRect.width - expectedWidth - 10 + \"px\";\r\n } else if (targetX < 10) {\r\n locStyle.left = \"10px\";\r\n }\r\n\r\n if (targetY + expectedHeight > containerRect.height) {\r\n locStyle.top = containerRect.height - expectedHeight - 10 + \"px\";\r\n } else if (targetY < 10) {\r\n locStyle.top = \"10px\";\r\n }\r\n\r\n return (\r\n <div id=\"graph-search-container\">\r\n <div id=\"graph-search-picking-blocker\" onClick={() => this.hide()}></div>\r\n <div id=\"graph-search-box\" style={locStyle}>\r\n <div className=\"graph-search-box-title\">Add a node</div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n onChange={(evt) => this.onFilterChange(evt)}\r\n onKeyDown={(evt) => this.onKeyDown(evt)}\r\n value={this.state.filter}\r\n className=\"graph-search-box-filter\"\r\n autoFocus={true}\r\n tabIndex={0}\r\n />\r\n <div className=\"graph-search-box-list\">\r\n {this._nodes.map((name) => {\r\n return (\r\n <div className=\"graph-search-box-list-item \" onClick={() => this.onNewNodeRequested(name)} key={name}>\r\n {NodeLedger.NameFormatter(name)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -0,0 +1,65 @@
1
+ #graph-search-container {
2
+ position: absolute;
3
+ width: 100%;
4
+ height: 100%;
5
+ left: 0;
6
+ top: 0;
7
+
8
+ #graph-search-picking-blocker {
9
+ position: absolute;
10
+ width: 100%;
11
+ height: 100%;
12
+ left: 0;
13
+ top: 0;
14
+ cursor: default;
15
+ }
16
+
17
+ #graph-search-box {
18
+ width: 300px;
19
+ height: 400px;
20
+ position: absolute;
21
+ left: calc(50% - 150px);
22
+ top: calc(50% - 200px);
23
+ background: rgb(72, 72, 72);
24
+ border: 2px solid black;
25
+ z-index: 100;
26
+ cursor: auto;
27
+ display: grid;
28
+ grid-template-rows: auto auto 1fr;
29
+
30
+ .graph-search-box-title {
31
+ border-bottom: 1px solid rgb(40, 40, 40);
32
+ margin: 4px;
33
+ padding-bottom: 4px;
34
+ color: white;
35
+ grid-row: 1;
36
+ }
37
+
38
+ .graph-search-box-filter {
39
+ margin: 4px;
40
+ padding-bottom: 4px;
41
+ border-radius: 4px;
42
+ width: calc(100% - 16px);
43
+ grid-row: 2;
44
+ }
45
+
46
+ .graph-search-box-list {
47
+ grid-row: 3;
48
+ overflow-y: auto;
49
+ display: flex;
50
+ flex-direction: column;
51
+
52
+ .graph-search-box-list-item {
53
+ margin-left: 4px;
54
+ cursor: pointer;
55
+ color: white;
56
+ margin-top: 4px;
57
+ margin-bottom: 4px;
58
+
59
+ &:hover {
60
+ background: rgb(30, 30, 30);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
@@ -13,6 +13,11 @@ export declare class StateManager {
13
13
  data: any;
14
14
  hostDocument: Document;
15
15
  lockObject: any;
16
+ modalIsDisplayed: boolean;
17
+ onSearchBoxRequiredObservable: Observable<{
18
+ x: number;
19
+ y: number;
20
+ }>;
16
21
  onSelectionChangedObservable: Observable<Nullable<ISelectionChangedOptions>>;
17
22
  onFrameCreatedObservable: Observable<GraphFrame>;
18
23
  onUpdateRequiredObservable: Observable<any>;
@@ -30,6 +35,7 @@ export declare class StateManager {
30
35
  targetX: number;
31
36
  targetY: number;
32
37
  needRepositioning?: boolean | undefined;
38
+ smartAdd?: boolean | undefined;
33
39
  }>;
34
40
  exportData: (data: any, frame?: Nullable<GraphFrame>) => string;
35
41
  isElbowConnectionAllowed: (nodeA: FrameNodePort | NodePort, nodeB: FrameNodePort | NodePort) => boolean;
@@ -1,6 +1,7 @@
1
1
  import { Observable } from "@babylonjs/core/Misc/observable.js";
2
2
  export class StateManager {
3
3
  constructor() {
4
+ this.onSearchBoxRequiredObservable = new Observable();
4
5
  this.onSelectionChangedObservable = new Observable();
5
6
  this.onFrameCreatedObservable = new Observable();
6
7
  this.onUpdateRequiredObservable = new Observable();
@@ -1 +1 @@
1
- {"version":3,"file":"stateManager.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/stateManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAWlD,MAAM,OAAO,YAAY;IAAzB;QAKI,iCAA4B,GAAG,IAAI,UAAU,EAAsC,CAAC;QACpF,6BAAwB,GAAG,IAAI,UAAU,EAAc,CAAC;QACxD,+BAA0B,GAAG,IAAI,UAAU,EAAiB,CAAC;QAC7D,iCAA4B,GAAG,IAAI,UAAU,EAAa,CAAC;QAC3D,wBAAmB,GAAG,IAAI,UAAU,EAAwB,CAAC;QAC7D,yBAAoB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAC3D,sCAAiC,GAAG,IAAI,UAAU,EAAsC,CAAC;QACzF,+BAA0B,GAAG,IAAI,UAAU,EAAa,CAAC;QACzD,gCAA2B,GAAG,IAAI,UAAU,EAAW,CAAC;QACxD,2CAAsC,GAAG,IAAI,UAAU,EAAU,CAAC;QAClE,kCAA6B,GAAG,IAAI,UAAU,EAAa,CAAC;QAC5D,sBAAiB,GAAG,IAAI,UAAU,EAAQ,CAAC;QAC3C,iCAA4B,GAAG,IAAI,UAAU,EAAmF,CAAC;IAWrI,CAAC;CAAA","sourcesContent":["import type { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { GraphFrame } from \"./graphFrame\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport type { NodePort } from \"./nodePort\";\r\n\r\nexport class StateManager {\r\n data: any;\r\n hostDocument: Document;\r\n lockObject: any;\r\n\r\n onSelectionChangedObservable = new Observable<Nullable<ISelectionChangedOptions>>();\r\n onFrameCreatedObservable = new Observable<GraphFrame>();\r\n onUpdateRequiredObservable = new Observable<Nullable<any>>();\r\n onGraphNodeRemovalObservable = new Observable<GraphNode>();\r\n onSelectionBoxMoved = new Observable<ClientRect | DOMRect>();\r\n onCandidateLinkMoved = new Observable<Nullable<Vector2>>();\r\n onCandidatePortSelectedObservable = new Observable<Nullable<NodePort | FrameNodePort>>();\r\n onNewNodeCreatedObservable = new Observable<GraphNode>();\r\n onRebuildRequiredObservable = new Observable<boolean>();\r\n onErrorMessageDialogRequiredObservable = new Observable<string>();\r\n onExposePortOnFrameObservable = new Observable<GraphNode>();\r\n onGridSizeChanged = new Observable<void>();\r\n onNewBlockRequiredObservable = new Observable<{ type: string; targetX: number; targetY: number; needRepositioning?: boolean }>();\r\n\r\n exportData: (data: any, frame?: Nullable<GraphFrame>) => string;\r\n isElbowConnectionAllowed: (nodeA: FrameNodePort | NodePort, nodeB: FrameNodePort | NodePort) => boolean;\r\n applyNodePortDesign: (data: IPortData, element: HTMLElement, img: HTMLImageElement) => void;\r\n\r\n storeEditorData: (serializationObject: any, frame?: Nullable<GraphFrame>) => void;\r\n\r\n getEditorDataMap: () => { [key: number]: number };\r\n\r\n createDefaultInputData: (rootData: any, portData: IPortData, nodeContainer: INodeContainer) => Nullable<{ data: INodeData; name: string }>;\r\n}\r\n"]}
1
+ {"version":3,"file":"stateManager.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/stateManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAWlD,MAAM,OAAO,YAAY;IAAzB;QAMI,kCAA6B,GAAG,IAAI,UAAU,EAA4B,CAAC;QAC3E,iCAA4B,GAAG,IAAI,UAAU,EAAsC,CAAC;QACpF,6BAAwB,GAAG,IAAI,UAAU,EAAc,CAAC;QACxD,+BAA0B,GAAG,IAAI,UAAU,EAAiB,CAAC;QAC7D,iCAA4B,GAAG,IAAI,UAAU,EAAa,CAAC;QAC3D,wBAAmB,GAAG,IAAI,UAAU,EAAwB,CAAC;QAC7D,yBAAoB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAC3D,sCAAiC,GAAG,IAAI,UAAU,EAAsC,CAAC;QACzF,+BAA0B,GAAG,IAAI,UAAU,EAAa,CAAC;QACzD,gCAA2B,GAAG,IAAI,UAAU,EAAW,CAAC;QACxD,2CAAsC,GAAG,IAAI,UAAU,EAAU,CAAC;QAClE,kCAA6B,GAAG,IAAI,UAAU,EAAa,CAAC;QAC5D,sBAAiB,GAAG,IAAI,UAAU,EAAQ,CAAC;QAC3C,iCAA4B,GAAG,IAAI,UAAU,EAAuG,CAAC;IAWzJ,CAAC;CAAA","sourcesContent":["import type { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { GraphFrame } from \"./graphFrame\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport type { NodePort } from \"./nodePort\";\r\n\r\nexport class StateManager {\r\n data: any;\r\n hostDocument: Document;\r\n lockObject: any;\r\n modalIsDisplayed: boolean;\r\n\r\n onSearchBoxRequiredObservable = new Observable<{ x: number; y: number }>();\r\n onSelectionChangedObservable = new Observable<Nullable<ISelectionChangedOptions>>();\r\n onFrameCreatedObservable = new Observable<GraphFrame>();\r\n onUpdateRequiredObservable = new Observable<Nullable<any>>();\r\n onGraphNodeRemovalObservable = new Observable<GraphNode>();\r\n onSelectionBoxMoved = new Observable<ClientRect | DOMRect>();\r\n onCandidateLinkMoved = new Observable<Nullable<Vector2>>();\r\n onCandidatePortSelectedObservable = new Observable<Nullable<NodePort | FrameNodePort>>();\r\n onNewNodeCreatedObservable = new Observable<GraphNode>();\r\n onRebuildRequiredObservable = new Observable<boolean>();\r\n onErrorMessageDialogRequiredObservable = new Observable<string>();\r\n onExposePortOnFrameObservable = new Observable<GraphNode>();\r\n onGridSizeChanged = new Observable<void>();\r\n onNewBlockRequiredObservable = new Observable<{ type: string; targetX: number; targetY: number; needRepositioning?: boolean; smartAdd?: boolean }>();\r\n\r\n exportData: (data: any, frame?: Nullable<GraphFrame>) => string;\r\n isElbowConnectionAllowed: (nodeA: FrameNodePort | NodePort, nodeB: FrameNodePort | NodePort) => boolean;\r\n applyNodePortDesign: (data: IPortData, element: HTMLElement, img: HTMLImageElement) => void;\r\n\r\n storeEditorData: (serializationObject: any, frame?: Nullable<GraphFrame>) => void;\r\n\r\n getEditorDataMap: () => { [key: number]: number };\r\n\r\n createDefaultInputData: (rootData: any, portData: IPortData, nodeContainer: INodeContainer) => Nullable<{ data: INodeData; name: string }>;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/shared-ui-components",
3
- "version": "5.45.0",
3
+ "version": "5.45.2",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",