@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.
71 lines • 12.1 kB
JavaScript
import { PointExtensions } from '@foblex/2d';
import { FDraggableDataContext } from '../f-draggable-data-context';
import { FComponentsStore } from '../../f-storage';
import { calculateDifferenceAfterRotation, } from './calculate-difference-after-rotation';
import { GetNormalizedElementRectRequest } from '../../domain';
import { FMediator } from '@foblex/mediator';
export class FNodeRotateDragHandler {
_fNode;
_fSourceHandlers;
_fTargetHandlers;
_fComponentsStore;
_fMediator;
_fDraggableDataContext;
fEventType = 'node-rotate';
fData;
_initialRotationToX = 0;
_startRotation = 0;
_onDownPoint;
_fNodeRect;
get _transform() {
return this._fComponentsStore.fCanvas.transform;
}
constructor(_injector, _fNode, _fSourceHandlers, _fTargetHandlers) {
this._fNode = _fNode;
this._fSourceHandlers = _fSourceHandlers;
this._fTargetHandlers = _fTargetHandlers;
this._startRotation = this._fNode.rotate;
this.fData = {
fNodeId: _fNode.fId,
};
this._fComponentsStore = _injector.get(FComponentsStore);
this._fMediator = _injector.get(FMediator);
this._fDraggableDataContext = _injector.get(FDraggableDataContext);
}
prepareDragSequence() {
this._fNodeRect = this._getOriginalNodeRect();
this._onDownPoint = this._calculateDownPoint();
this._initialRotationToX = this._calculateAngleBetweenVectors(this._onDownPoint) - this._startRotation;
}
_getOriginalNodeRect() {
return this._fMediator.execute(new GetNormalizedElementRectRequest(this._fNode.hostElement));
}
_calculateDownPoint() {
return PointExtensions.sub(this._fDraggableDataContext.onPointerDownPosition, PointExtensions.sum(this._transform.position, this._transform.scaledPosition));
}
_calculateAngleBetweenVectors(position) {
return Math.atan2(position.y - this._fNodeRect.gravityCenter.y, position.x - this._fNodeRect.gravityCenter.x) * (180 / Math.PI);
}
onPointerMove(difference) {
const position = PointExtensions.sum(this._onDownPoint, difference);
const rotation = this._calculateAngleBetweenVectors(position) - this._initialRotationToX;
this._updateNodeRendering(rotation);
this._fSourceHandlers.forEach((x) => {
x.connection.setSourceDifference(this._calculateDifferenceAfterRotation(x.connector, rotation));
});
this._fTargetHandlers.forEach((x) => {
x.connection.setTargetDifference(this._calculateDifferenceAfterRotation(x.connector, rotation));
});
}
_updateNodeRendering(rotation) {
this._fNode.updateRotate(rotation);
this._fNode.redraw();
}
_calculateDifferenceAfterRotation(position, rotation) {
return calculateDifferenceAfterRotation(position, rotation - this._startRotation, this._fNodeRect.gravityCenter);
}
onPointerUp() {
this._fNode.rotateChange.emit(this._fNode.rotate);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1ub2RlLXJvdGF0ZS5kcmFnLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2YtZHJhZ2dhYmxlL2Ytbm9kZS1yb3RhdGUvZi1ub2RlLXJvdGF0ZS5kcmFnLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQyxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGdDQUFnQyxHQUNqQyxNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHN0MsTUFBTSxPQUFPLHNCQUFzQjtJQXFCdkI7SUFDQTtJQUlBO0lBeEJPLGlCQUFpQixDQUFtQjtJQUNwQyxVQUFVLENBQVk7SUFDdEIsc0JBQXNCLENBQXdCO0lBRXhELFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDM0IsS0FBSyxDQUFNO0lBRVYsbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLGNBQWMsR0FBVyxDQUFDLENBQUM7SUFFcEMsWUFBWSxDQUFVO0lBQ3RCLFVBQVUsQ0FBUztJQUUzQixJQUFZLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBUSxDQUFDLFNBQVMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsWUFDRSxTQUFtQixFQUNYLE1BQWlCLEVBQ2pCLGdCQUdMLEVBQ0ssZ0JBR0w7UUFSSyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FHckI7UUFDSyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBR3JCO1FB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QUFpQyxDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDMUUsT0FBTyxnQ0FBZ0MsQ0FDckMsUUFBUSxFQUNSLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FDOUIsQ0FBQTtJQUNILENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElQb2ludCwgSVJlY3QsIElUcmFuc2Zvcm1Nb2RlbCwgUG9pbnRFeHRlbnNpb25zIH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgeyBJRkRyYWdIYW5kbGVyIH0gZnJvbSAnLi4vZi1kcmFnLWhhbmRsZXInO1xuaW1wb3J0IHsgRk5vZGVCYXNlIH0gZnJvbSAnLi4vLi4vZi1ub2RlJztcbmltcG9ydCB7IEZEcmFnZ2FibGVEYXRhQ29udGV4dCB9IGZyb20gJy4uL2YtZHJhZ2dhYmxlLWRhdGEtY29udGV4dCc7XG5pbXBvcnQgeyBGQ29tcG9uZW50c1N0b3JlIH0gZnJvbSAnLi4vLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IEJhc2VDb25uZWN0aW9uRHJhZ0hhbmRsZXIgfSBmcm9tICcuLi9mLW5vZGUtbW92ZSc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVEaWZmZXJlbmNlQWZ0ZXJSb3RhdGlvbixcbn0gZnJvbSAnLi9jYWxjdWxhdGUtZGlmZmVyZW5jZS1hZnRlci1yb3RhdGlvbic7XG5pbXBvcnQgeyBHZXROb3JtYWxpemVkRWxlbWVudFJlY3RSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vZG9tYWluJztcbmltcG9ydCB7IEZNZWRpYXRvciB9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGNsYXNzIEZOb2RlUm90YXRlRHJhZ0hhbmRsZXIgaW1wbGVtZW50cyBJRkRyYWdIYW5kbGVyIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mQ29tcG9uZW50c1N0b3JlOiBGQ29tcG9uZW50c1N0b3JlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mTWVkaWF0b3I6IEZNZWRpYXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkRyYWdnYWJsZURhdGFDb250ZXh0OiBGRHJhZ2dhYmxlRGF0YUNvbnRleHQ7XG5cbiAgcHVibGljIGZFdmVudFR5cGUgPSAnbm9kZS1yb3RhdGUnO1xuICBwdWJsaWMgZkRhdGE6IGFueTtcblxuICBwcml2YXRlIF9pbml0aWFsUm90YXRpb25Ub1g6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXJ0Um90YXRpb246IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfb25Eb3duUG9pbnQhOiBJUG9pbnQ7XG4gIHByaXZhdGUgX2ZOb2RlUmVjdCE6IElSZWN0O1xuXG4gIHByaXZhdGUgZ2V0IF90cmFuc2Zvcm0oKTogSVRyYW5zZm9ybU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mQ2FudmFzIS50cmFuc2Zvcm07XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgX2ZOb2RlOiBGTm9kZUJhc2UsXG4gICAgcHJpdmF0ZSBfZlNvdXJjZUhhbmRsZXJzOiB7XG4gICAgICBjb25uZWN0aW9uOiBCYXNlQ29ubmVjdGlvbkRyYWdIYW5kbGVyLFxuICAgICAgY29ubmVjdG9yOiBJUG9pbnQsXG4gICAgfVtdLFxuICAgIHByaXZhdGUgX2ZUYXJnZXRIYW5kbGVyczoge1xuICAgICAgY29ubmVjdGlvbjogQmFzZUNvbm5lY3Rpb25EcmFnSGFuZGxlcixcbiAgICAgIGNvbm5lY3RvcjogSVBvaW50LFxuICAgIH1bXSxcbiAgKSB7XG4gICAgdGhpcy5fc3RhcnRSb3RhdGlvbiA9IHRoaXMuX2ZOb2RlLnJvdGF0ZTtcbiAgICB0aGlzLmZEYXRhID0ge1xuICAgICAgZk5vZGVJZDogX2ZOb2RlLmZJZCxcbiAgICB9O1xuXG4gICAgdGhpcy5fZkNvbXBvbmVudHNTdG9yZSA9IF9pbmplY3Rvci5nZXQoRkNvbXBvbmVudHNTdG9yZSk7XG4gICAgdGhpcy5fZk1lZGlhdG9yID0gX2luamVjdG9yLmdldChGTWVkaWF0b3IpO1xuICAgIHRoaXMuX2ZEcmFnZ2FibGVEYXRhQ29udGV4dCA9IF9pbmplY3Rvci5nZXQoRkRyYWdnYWJsZURhdGFDb250ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlRHJhZ1NlcXVlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZOb2RlUmVjdCA9IHRoaXMuX2dldE9yaWdpbmFsTm9kZVJlY3QoKTtcbiAgICB0aGlzLl9vbkRvd25Qb2ludCA9IHRoaXMuX2NhbGN1bGF0ZURvd25Qb2ludCgpO1xuICAgIHRoaXMuX2luaXRpYWxSb3RhdGlvblRvWCA9IHRoaXMuX2NhbGN1bGF0ZUFuZ2xlQmV0d2VlblZlY3RvcnModGhpcy5fb25Eb3duUG9pbnQpIC0gdGhpcy5fc3RhcnRSb3RhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE9yaWdpbmFsTm9kZVJlY3QoKTogSVJlY3Qge1xuICAgIHJldHVybiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJUmVjdD4obmV3IEdldE5vcm1hbGl6ZWRFbGVtZW50UmVjdFJlcXVlc3QodGhpcy5fZk5vZGUhLmhvc3RFbGVtZW50KSk7XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVEb3duUG9pbnQoKTogSVBvaW50IHtcbiAgICByZXR1cm4gUG9pbnRFeHRlbnNpb25zLnN1YihcbiAgICAgIHRoaXMuX2ZEcmFnZ2FibGVEYXRhQ29udGV4dC5vblBvaW50ZXJEb3duUG9zaXRpb24sXG4gICAgICBQb2ludEV4dGVuc2lvbnMuc3VtKHRoaXMuX3RyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5fdHJhbnNmb3JtLnNjYWxlZFBvc2l0aW9uKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVBbmdsZUJldHdlZW5WZWN0b3JzKHBvc2l0aW9uOiBJUG9pbnQpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgcG9zaXRpb24ueSAtIHRoaXMuX2ZOb2RlUmVjdC5ncmF2aXR5Q2VudGVyLnksXG4gICAgICBwb3NpdGlvbi54IC0gdGhpcy5fZk5vZGVSZWN0LmdyYXZpdHlDZW50ZXIueFxuICAgICkgKiAoMTgwIC8gTWF0aC5QSSk7XG4gIH1cblxuICBwdWJsaWMgb25Qb2ludGVyTW92ZShkaWZmZXJlbmNlOiBJUG9pbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IFBvaW50RXh0ZW5zaW9ucy5zdW0odGhpcy5fb25Eb3duUG9pbnQsIGRpZmZlcmVuY2UpO1xuICAgIGNvbnN0IHJvdGF0aW9uID0gdGhpcy5fY2FsY3VsYXRlQW5nbGVCZXR3ZWVuVmVjdG9ycyhwb3NpdGlvbikgLSB0aGlzLl9pbml0aWFsUm90YXRpb25Ub1g7XG4gICAgdGhpcy5fdXBkYXRlTm9kZVJlbmRlcmluZyhyb3RhdGlvbik7XG5cbiAgICB0aGlzLl9mU291cmNlSGFuZGxlcnMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgeC5jb25uZWN0aW9uLnNldFNvdXJjZURpZmZlcmVuY2UoXG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZURpZmZlcmVuY2VBZnRlclJvdGF0aW9uKHguY29ubmVjdG9yLCByb3RhdGlvbilcbiAgICAgIClcbiAgICB9KTtcbiAgICB0aGlzLl9mVGFyZ2V0SGFuZGxlcnMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgeC5jb25uZWN0aW9uLnNldFRhcmdldERpZmZlcmVuY2UoXG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZURpZmZlcmVuY2VBZnRlclJvdGF0aW9uKHguY29ubmVjdG9yLCByb3RhdGlvbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVOb2RlUmVuZGVyaW5nKHJvdGF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9mTm9kZS51cGRhdGVSb3RhdGUocm90YXRpb24pO1xuICAgIHRoaXMuX2ZOb2RlLnJlZHJhdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlRGlmZmVyZW5jZUFmdGVyUm90YXRpb24ocG9zaXRpb246IElQb2ludCwgcm90YXRpb246IG51bWJlcik6IElQb2ludCB7XG4gICAgcmV0dXJuIGNhbGN1bGF0ZURpZmZlcmVuY2VBZnRlclJvdGF0aW9uKFxuICAgICAgcG9zaXRpb24sXG4gICAgICByb3RhdGlvbiAtIHRoaXMuX3N0YXJ0Um90YXRpb24sXG4gICAgICB0aGlzLl9mTm9kZVJlY3QuZ3Jhdml0eUNlbnRlclxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBvblBvaW50ZXJVcCgpOiB2b2lkIHtcbiAgICB0aGlzLl9mTm9kZS5yb3RhdGVDaGFuZ2UuZW1pdCh0aGlzLl9mTm9kZS5yb3RhdGUpO1xuICB9XG59XG4iXX0=