@xui/components
Version:
xUI Components for Angular
97 lines • 14.2 kB
JavaScript
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