@foblex/flow
Version:
An Angular library designed to simplify the creation and manipulation of dynamic flow. Provides components for flows, nodes, and connections, automating node manipulation and inter-node connections.
63 lines • 9.32 kB
JavaScript
import { findClosestAlignment, RectExtensions } from '@foblex/2d';
import { FComponentsStore } from '../../f-storage';
export class FLineAlignmentDragHandler {
_lineService;
_size;
_draggedNodeRect;
_rects;
_restrictions;
fEventType = 'line-alignment';
_fComponentsStore;
_debounceTimer = null;
_transform;
constructor(_injector, _lineService, _size, _draggedNodeRect, _rects, _restrictions) {
this._lineService = _lineService;
this._size = _size;
this._draggedNodeRect = _draggedNodeRect;
this._rects = _rects;
this._restrictions = _restrictions;
this._fComponentsStore = _injector.get(FComponentsStore);
this._transform = this._fComponentsStore.fCanvas?.transform;
}
onPointerMove(difference) {
const restrictedDifference = this._getDifference(difference);
if (this._debounceTimer) {
clearTimeout(this._debounceTimer);
}
this._debounceTimer = setTimeout(() => this._drawIntersectingLines(restrictedDifference), 15);
}
_drawIntersectingLines(difference) {
const intersect = this.findNearestCoordinate(difference);
if (intersect.xResult.value !== undefined) {
this._lineService.drawVerticalLine(intersect.xResult.value, this._size, this._transform);
}
else {
this._lineService.hideVerticalLine();
}
if (intersect.yResult.value !== undefined) {
this._lineService.drawHorizontalLine(intersect.yResult.value, this._size, this._transform);
}
else {
this._lineService.hideHorizontalLine();
}
}
_getDifference(difference) {
return {
x: Math.min(Math.max(difference.x, this._restrictions.min.x), this._restrictions.max.x),
y: Math.min(Math.max(difference.y, this._restrictions.min.y), this._restrictions.max.y)
};
}
findNearestCoordinate(difference) {
const rect = RectExtensions.addPoint(this._draggedNodeRect, difference);
return findClosestAlignment(this._rects, rect, this._fComponentsStore.fLineAlignment.fAlignThreshold());
}
onPointerUp() {
this._lineService.hideVerticalLine();
this._lineService.hideHorizontalLine();
if (this._debounceTimer) {
clearTimeout(this._debounceTimer);
this._debounceTimer = null;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1saW5lLWFsaWdubWVudC5kcmFnLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2YtZHJhZ2dhYmxlL2Ytbm9kZS1tb3ZlL2YtbGluZS1hbGlnbm1lbnQuZHJhZy1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBdUQsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXZILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSW5ELE1BQU0sT0FBTyx5QkFBeUI7SUFZMUI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQWRNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztJQUU3QixpQkFBaUIsQ0FBbUI7SUFFN0MsY0FBYyxHQUFRLElBQUksQ0FBQztJQUVsQixVQUFVLENBQWtCO0lBRTdDLFlBQ0UsU0FBbUIsRUFDWCxZQUF5QixFQUN6QixLQUFZLEVBQ1osZ0JBQXVCLEVBQ3ZCLE1BQWUsRUFDZixhQUEyQjtRQUozQixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUN6QixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1oscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFPO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVM7UUFDZixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUVuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFVLENBQUM7SUFDL0QsQ0FBQztJQUVNLGFBQWEsQ0FBQyxVQUFrQjtRQUNyQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFVBQWtCO1FBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0YsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxVQUFrQjtRQUN2QyxPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2RixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3hGLENBQUE7SUFDSCxDQUFDO0lBRU0scUJBQXFCLENBQUMsVUFBa0I7UUFDN0MsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEUsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDM0csQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaW5kQ2xvc2VzdEFsaWdubWVudCwgSU1pbk1heFBvaW50LCBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgSVRyYW5zZm9ybU1vZGVsLCBSZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgSUZEcmFnSGFuZGxlciB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IEZDb21wb25lbnRzU3RvcmUgfSBmcm9tICcuLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHsgSUxpbmVBbGlnbm1lbnRSZXN1bHQsIExpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZi1saW5lLWFsaWdubWVudCc7XG5pbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgRkxpbmVBbGlnbm1lbnREcmFnSGFuZGxlciBpbXBsZW1lbnRzIElGRHJhZ0hhbmRsZXIge1xuXG4gIHB1YmxpYyByZWFkb25seSBmRXZlbnRUeXBlID0gJ2xpbmUtYWxpZ25tZW50JztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mQ29tcG9uZW50c1N0b3JlOiBGQ29tcG9uZW50c1N0b3JlO1xuXG4gIHByaXZhdGUgX2RlYm91bmNlVGltZXI6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNmb3JtOiBJVHJhbnNmb3JtTW9kZWw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIF9saW5lU2VydmljZTogTGluZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfc2l6ZTogSVNpemUsXG4gICAgcHJpdmF0ZSBfZHJhZ2dlZE5vZGVSZWN0OiBJUmVjdCxcbiAgICBwcml2YXRlIF9yZWN0czogSVJlY3RbXSxcbiAgICBwcml2YXRlIF9yZXN0cmljdGlvbnM6IElNaW5NYXhQb2ludCxcbiAgKSB7XG4gICAgdGhpcy5fZkNvbXBvbmVudHNTdG9yZSA9IF9pbmplY3Rvci5nZXQoRkNvbXBvbmVudHNTdG9yZSk7XG4gICAgdGhpcy5fdHJhbnNmb3JtID0gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mQ2FudmFzPy50cmFuc2Zvcm0hO1xuICB9XG5cbiAgcHVibGljIG9uUG9pbnRlck1vdmUoZGlmZmVyZW5jZTogSVBvaW50KTogdm9pZCB7XG4gICAgY29uc3QgcmVzdHJpY3RlZERpZmZlcmVuY2UgPSB0aGlzLl9nZXREaWZmZXJlbmNlKGRpZmZlcmVuY2UpO1xuICAgIGlmICh0aGlzLl9kZWJvdW5jZVRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fZGVib3VuY2VUaW1lcik7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fZHJhd0ludGVyc2VjdGluZ0xpbmVzKHJlc3RyaWN0ZWREaWZmZXJlbmNlKSwgMTUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd0ludGVyc2VjdGluZ0xpbmVzKGRpZmZlcmVuY2U6IElQb2ludCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVyc2VjdCA9IHRoaXMuZmluZE5lYXJlc3RDb29yZGluYXRlKGRpZmZlcmVuY2UpO1xuICAgIGlmIChpbnRlcnNlY3QueFJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9saW5lU2VydmljZS5kcmF3VmVydGljYWxMaW5lKGludGVyc2VjdC54UmVzdWx0LnZhbHVlLCB0aGlzLl9zaXplLCB0aGlzLl90cmFuc2Zvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saW5lU2VydmljZS5oaWRlVmVydGljYWxMaW5lKCk7XG4gICAgfVxuICAgIGlmIChpbnRlcnNlY3QueVJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9saW5lU2VydmljZS5kcmF3SG9yaXpvbnRhbExpbmUoaW50ZXJzZWN0LnlSZXN1bHQudmFsdWUsIHRoaXMuX3NpemUsIHRoaXMuX3RyYW5zZm9ybSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpbmVTZXJ2aWNlLmhpZGVIb3Jpem9udGFsTGluZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldERpZmZlcmVuY2UoZGlmZmVyZW5jZTogSVBvaW50KTogSVBvaW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5taW4oTWF0aC5tYXgoZGlmZmVyZW5jZS54LCB0aGlzLl9yZXN0cmljdGlvbnMubWluLngpLCB0aGlzLl9yZXN0cmljdGlvbnMubWF4LngpLFxuICAgICAgeTogTWF0aC5taW4oTWF0aC5tYXgoZGlmZmVyZW5jZS55LCB0aGlzLl9yZXN0cmljdGlvbnMubWluLnkpLCB0aGlzLl9yZXN0cmljdGlvbnMubWF4LnkpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbmROZWFyZXN0Q29vcmRpbmF0ZShkaWZmZXJlbmNlOiBJUG9pbnQpOiBJTGluZUFsaWdubWVudFJlc3VsdCB7XG4gICAgY29uc3QgcmVjdCA9IFJlY3RFeHRlbnNpb25zLmFkZFBvaW50KHRoaXMuX2RyYWdnZWROb2RlUmVjdCwgZGlmZmVyZW5jZSk7XG4gICAgcmV0dXJuIGZpbmRDbG9zZXN0QWxpZ25tZW50KHRoaXMuX3JlY3RzLCByZWN0LCB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZMaW5lQWxpZ25tZW50IS5mQWxpZ25UaHJlc2hvbGQoKSk7XG4gIH1cblxuICBwdWJsaWMgb25Qb2ludGVyVXAoKTogdm9pZCB7XG4gICAgdGhpcy5fbGluZVNlcnZpY2UuaGlkZVZlcnRpY2FsTGluZSgpO1xuICAgIHRoaXMuX2xpbmVTZXJ2aWNlLmhpZGVIb3Jpem9udGFsTGluZSgpO1xuXG4gICAgaWYgKHRoaXMuX2RlYm91bmNlVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9kZWJvdW5jZVRpbWVyKTtcbiAgICAgIHRoaXMuX2RlYm91bmNlVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19