UNPKG

@xui/components

Version:

xUI Components for Angular

97 lines 14.2 kB
import { Injectable, signal } from '@angular/core'; import * as i0 from "@angular/core"; export class GraphViewService { constructor() { this.paths = signal([]); this.wireToolPath = signal(null); } dragMove() { this.paths.set([]); for (const connection of this.data.connections) { this.connect(connection.outputNode, connection.outputPort, connection.inputNode, connection.inputPort); } } connect(outputNode, outputPort, inputNode, inputPort) { const output = this.canvas.nativeElement.querySelector(`[data-id="${outputNode}"]`); const input = this.canvas.nativeElement.querySelector(`[data-id="${inputNode}"]`); const padding = 0; const bezierWeight = 0.5; const canvasRect = this.canvas.nativeElement.getBoundingClientRect(); const startRect = output.querySelector(`[data-port="${outputPort}"]`).getBoundingClientRect(); const endRect = input.querySelector(`[data-port="${inputPort}"]`).getBoundingClientRect(); const start = { offsetLeft: startRect.left - canvasRect.left, offsetTop: startRect.top - canvasRect.top }; const end = { offsetLeft: endRect.left - canvasRect.left, offsetTop: endRect.top - canvasRect.top }; const x1 = start.offsetLeft + startRect.width / 2 - padding; const y1 = start.offsetTop + startRect.height / 2 - padding; const x4 = end.offsetLeft + endRect.width / 2 - padding; const y4 = end.offsetTop + endRect.height / 2 - padding; const dx = Math.abs(x4 - x1) * bezierWeight; let x2; let x3; if (x4 < x1) { x2 = x1 - dx; x3 = x4 + dx; } else { x2 = x1 + dx; x3 = x4 - dx; } // TODO // this.paths.mutate(x => x.push(`M${x1} ${y1} C ${x2} ${y1} ${x3} ${y4} ${x4} ${y4}`)); } wireTool(node, port, xCursor, yCursor) { const n = this.canvas.nativeElement.querySelector(`[data-id="${node}"]`); const padding = 0; const bezierWeight = 0.5; const canvasRect = this.canvas.nativeElement.getBoundingClientRect(); const rect = n.querySelector(`[data-port="${port}"]`).getBoundingClientRect(); const start = { offsetLeft: rect.left - canvasRect.left, offsetTop: rect.top - canvasRect.top }; const end = { offsetLeft: xCursor - canvasRect.left, offsetTop: yCursor - canvasRect.top }; const x1 = start.offsetLeft + rect.width / 2 - padding; const y1 = start.offsetTop + rect.height / 2 - padding; const x4 = end.offsetLeft; const y4 = end.offsetTop; const dx = Math.abs(x4 - x1) * bezierWeight; let x2; let x3; if (x4 < x1) { x2 = x1 - dx; x3 = x4 + dx; } else { x2 = x1 + dx; x3 = x4 - dx; } this.wireToolPath.set(`M${x1} ${y1} C ${x2} ${y1} ${x3} ${y4} ${x4} ${y4}`); } getGroup(groupId) { if (groupId == null) { return this.data.groups[0]; } return this.data.groups.find(x => x.id === groupId) ?? this.data.groups[0]; } hasConnectedPort(node, port) { return this.data.connections.some(x => (x.outputNode === node && x.outputPort === port) || (x.inputNode === node && x.inputPort === port)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: GraphViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: GraphViewService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: GraphViewService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtdmlldy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy94dWkvc3JjL2dyYXBoLXZpZXcvZ3JhcGgtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0vRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBTUUsVUFBSyxHQUFHLE1BQU0sQ0FBVyxFQUFFLENBQUMsQ0FBQztRQUM3QixpQkFBWSxHQUFHLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUM7S0FxRzVDO0lBbkdDLFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekcsQ0FBQztJQUNILENBQUM7SUFFTyxPQUFPLENBQUMsVUFBa0IsRUFBRSxVQUFrQixFQUFFLFNBQWlCLEVBQUUsU0FBaUI7UUFDMUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUNwRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxTQUFTLElBQUksQ0FBQyxDQUFDO1FBRWxGLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNsQixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFD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LENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVksRUFBRSxJQUFZO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUMvQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQ3hHLENBQUM7SUFDSixDQUFDOzhHQXhHVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQUZmLE1BQU07OzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyYXBoVmlld0RhdGEsIE5vZGVHcm91cCB9IGZyb20gJy4vZ3JhcGgtdmlldy50eXBlcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEdyYXBoVmlld1NlcnZpY2Uge1xuICBkYXRhITogR3JhcGhWaWV3RGF0YTtcbiAgY2FudmFzITogRWxlbWVudFJlZjtcbiAgcGF0aHMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcbiAgd2lyZVRvb2xQYXRoID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIGRyYWdNb3ZlKCkge1xuICAgIHRoaXMucGF0aHMuc2V0KFtdKTtcbiAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5kYXRhLmNvbm5lY3Rpb25zKSB7XG4gICAgICB0aGlzLmNvbm5lY3QoY29ubmVjdGlvbi5vdXRwdXROb2RlLCBjb25uZWN0aW9uLm91dHB1dFBvcnQsIGNvbm5lY3Rpb24uaW5wdXROb2RlLCBjb25uZWN0aW9uLmlucHV0UG9ydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25uZWN0KG91dHB1dE5vZGU6IHN0cmluZywgb3V0cHV0UG9ydDogc3RyaW5nLCBpbnB1dE5vZGU6IHN0cmluZywgaW5wdXRQb3J0OiBzdHJpbmcpIHtcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWlkPVwiJHtvdXRwdXROb2RlfVwiXWApO1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7aW5wdXROb2RlfVwiXWApO1xuXG4gICAgY29uc3QgcGFkZGluZyA9IDA7XG4gICAgY29uc3QgYmV6aWVyV2VpZ2h0ID0gMC41O1xuICAgIGNvbnN0IGNhbnZhc1JlY3QgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHN0YXJ0UmVjdCA9IG91dHB1dC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1wb3J0PVwiJHtvdXRwdXRQb3J0fVwiXWApLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVuZFJlY3QgPSBpbnB1dC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1wb3J0PVwiJHtpbnB1dFBvcnR9XCJdYCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBzdGFydCA9IHtcbiAgICAgIG9mZnNldExlZnQ6IHN0YXJ0UmVjdC5sZWZ0IC0gY2FudmFzUmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0VG9wOiBzdGFydFJlY3QudG9wIC0gY2FudmFzUmVjdC50b3BcbiAgICB9O1xuXG4gICAgY29uc3QgZW5kID0ge1xuICAgICAgb2Zmc2V0TGVmdDogZW5kUmVjdC5sZWZ0IC0gY2FudmFzUmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0VG9wOiBlbmRSZWN0LnRvcCAtIGNhbnZhc1JlY3QudG9wXG4gICAgfTtcblxuICAgIGNvbnN0IHgxID0gc3RhcnQub2Zmc2V0TGVmdCArIHN0YXJ0UmVjdC53aWR0aCAvIDIgLSBwYWRkaW5nO1xuICAgIGNvbnN0IHkxID0gc3RhcnQub2Zmc2V0VG9wICsgc3RhcnRSZWN0LmhlaWdodCAvIDIgLSBwYWRkaW5nO1xuICAgIGNvbnN0IHg0ID0gZW5kLm9mZnNldExlZnQgKyBlbmRSZWN0LndpZHRoIC8gMiAtIHBhZGRpbmc7XG4gICAgY29uc3QgeTQgPSBlbmQub2Zmc2V0VG9wICsgZW5kUmVjdC5oZWlnaHQgLyAyIC0gcGFkZGluZztcbiAgICBjb25zdCBkeCA9IE1hdGguYWJzKHg0IC0geDEpICogYmV6aWVyV2VpZ2h0O1xuXG4gICAgbGV0IHgyOiBudW1iZXI7XG4gICAgbGV0IHgzOiBudW1iZXI7XG5cbiAgICBpZiAoeDQgPCB4MSkge1xuICAgICAgeDIgPSB4MSAtIGR4O1xuICAgICAgeDMgPSB4NCArIGR4O1xuICAgIH0gZWxzZSB7XG4gICAgICB4MiA9IHgxICsgZHg7XG4gICAgICB4MyA9IHg0IC0gZHg7XG4gICAgfVxuXG4gICAgLy8gVE9ET1xuICAgIC8vIHRoaXMucGF0aHMubXV0YXRlKHggPT4geC5wdXNoKGBNJHt4MX0gJHt5MX0gQyAke3gyfSAke3kxfSAke3gzfSAke3k0fSAke3g0fSAke3k0fWApKTtcbiAgfVxuXG4gIHdpcmVUb29sKG5vZGU6IHN0cmluZywgcG9ydDogc3RyaW5nLCB4Q3Vyc29yOiBudW1iZXIsIHlDdXJzb3I6IG51bWJlcikge1xuICAgIGNvbnN0IG4gPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWlkPVwiJHtub2RlfVwiXWApO1xuXG4gICAgY29uc3QgcGFkZGluZyA9IDA7XG4gICAgY29uc3QgYmV6aWVyV2VpZ2h0ID0gMC41O1xuICAgIGNvbnN0IGNhbnZhc1JlY3QgPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHJlY3QgPSBuLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXBvcnQ9XCIke3BvcnR9XCJdYCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBzdGFydCA9IHtcbiAgICAgIG9mZnNldExlZnQ6IHJlY3QubGVmdCAtIGNhbnZhc1JlY3QubGVmdCxcbiAgICAgIG9mZnNldFRvcDogcmVjdC50b3AgLSBjYW52YXNSZWN0LnRvcFxuICAgIH07XG5cbiAgICBjb25zdCBlbmQgPSB7XG4gICAgICBvZmZzZXRMZWZ0OiB4Q3Vyc29yIC0gY2FudmFzUmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0VG9wOiB5Q3Vyc29yIC0gY2FudmFzUmVjdC50b3BcbiAgICB9O1xuXG4gICAgY29uc3QgeDEgPSBzdGFydC5vZmZzZXRMZWZ0ICsgcmVjdC53aWR0aCAvIDIgLSBwYWRkaW5nO1xuICAgIGNvbnN0IHkxID0gc3RhcnQub2Zmc2V0VG9wICsgcmVjdC5oZWlnaHQgLyAyIC0gcGFkZGluZztcbiAgICBjb25zdCB4NCA9IGVuZC5vZmZzZXRMZWZ0O1xuICAgIGNvbnN0IHk0ID0gZW5kLm9mZnNldFRvcDtcbiAgICBjb25zdCBkeCA9IE1hdGguYWJzKHg0IC0geDEpICogYmV6aWVyV2VpZ2h0O1xuXG4gICAgbGV0IHgyO1xuICAgIGxldCB4MztcblxuICAgIGlmICh4NCA8IHgxKSB7XG4gICAgICB4MiA9IHgxIC0gZHg7XG4gICAgICB4MyA9IHg0ICsgZHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHgyID0geDEgKyBkeDtcbiAgICAgIHgzID0geDQgLSBkeDtcbiAgICB9XG5cbiAgICB0aGlzLndpcmVUb29sUGF0aC5zZXQoYE0ke3gxfSAke3kxfSBDICR7eDJ9ICR7eTF9ICR7eDN9ICR7eTR9ICR7eDR9ICR7eTR9YCk7XG4gIH1cblxuICBnZXRHcm91cChncm91cElkPzogc3RyaW5nKTogTm9kZUdyb3VwIHtcbiAgICBpZiAoZ3JvdXBJZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmdyb3VwcyFbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5ncm91cHMhLmZpbmQoeCA9PiB4LmlkID09PSBncm91cElkKSA/PyB0aGlzLmRhdGEuZ3JvdXBzIVswXTtcbiAgfVxuXG4gIGhhc0Nvbm5lY3RlZFBvcnQobm9kZTogc3RyaW5nLCBwb3J0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNvbm5lY3Rpb25zLnNvbWUoXG4gICAgICB4ID0+ICh4Lm91dHB1dE5vZGUgPT09IG5vZGUgJiYgeC5vdXRwdXRQb3J0ID09PSBwb3J0KSB8fCAoeC5pbnB1dE5vZGUgPT09IG5vZGUgJiYgeC5pbnB1dFBvcnQgPT09IHBvcnQpXG4gICAgKTtcbiAgfVxufVxuIl19