@wcardinal/wcardinal-geditor
Version:
WebGL-based graphic editor, tester and viewer for supervisory systems
234 lines • 9.82 kB
JavaScript
import { __extends } from "tslib";
import { EShapeAcceptorEdgeSide, EShapeAcceptorEdgeType, EShapeCapabilities, EShapeCapability, EShapeConnectorBodies, EShapeConnectorLine, EShapeLockPart, toPointsBoundary } from "@wcardinal/wcardinal-ui";
import { Point } from "pixi.js";
import { EToolShapeAcceptorEdge } from "./e-tool-shape-acceptor-edge";
import { EToolShapeEditLineBase } from "./e-tool-shape-edit-line-base";
var EToolShapeEditLineConnector = /** @class */ (function (_super) {
__extends(EToolShapeEditLineConnector, _super);
function EToolShapeEditLineConnector(options) {
var _this = _super.call(this, options) || this;
_this._edge = new EToolShapeAcceptorEdge(_this._diagram, true);
_this._work = new Point();
return _this;
}
EToolShapeEditLineConnector.prototype.toCapability = function (shape) {
var result = EShapeCapability.NONE;
if (EShapeCapabilities.contains(shape, EShapeCapability.LINE_TAIL)) {
result |= EShapeCapability.LINE_TAIL;
}
if (EShapeCapabilities.contains(shape, EShapeCapability.LINE_HEAD)) {
result |= EShapeCapability.LINE_HEAD;
}
return result;
};
EToolShapeEditLineConnector.prototype.onActivate = function () {
this._edge.begin(this._diagram.canvas, this._shape);
this._edgeTail = undefined;
this._edgeHead = undefined;
_super.prototype.onActivate.call(this);
};
EToolShapeEditLineConnector.prototype.onDeactivate = function () {
this._edge.end();
this._edgeTail = undefined;
this._edgeHead = undefined;
_super.prototype.onDeactivate.call(this);
};
EToolShapeEditLineConnector.prototype.onTargetChange = function (targetIndex, point) {
if (targetIndex === 0) {
var edge = this._edge;
edge.show();
if (point != null) {
edge.update(EShapeAcceptorEdgeType.TAIL, point.x, point.y);
}
}
else if (targetIndex === this._points.length - 1) {
var edge = this._edge;
edge.show();
if (point != null) {
edge.update(EShapeAcceptorEdgeType.HEAD, point.x, point.y);
}
}
else {
this._edge.hide();
}
};
EToolShapeEditLineConnector.prototype.onTargetMove = function (point) {
var targetIndex = this._targetIndex;
if (targetIndex === 0) {
this._edge.update(EShapeAcceptorEdgeType.TAIL, point.x, point.y);
}
else if (targetIndex === this._points.length - 1) {
this._edge.update(EShapeAcceptorEdgeType.HEAD, point.x, point.y);
}
};
EToolShapeEditLineConnector.prototype.onTargetNotMove = function (e) {
var targetIndex = this._targetIndex;
if (targetIndex === 0) {
var canvas = this._diagram.canvas;
if (canvas) {
var onMovePoint = canvas.toLocal(e.data.global, undefined, this._onMovePoint);
this._edge.update(EShapeAcceptorEdgeType.TAIL, onMovePoint.x, onMovePoint.y);
}
}
else if (targetIndex === this._points.length - 1) {
var canvas = this._diagram.canvas;
if (canvas) {
var onMovePoint = canvas.toLocal(e.data.global, undefined, this._onMovePoint);
this._edge.update(EShapeAcceptorEdgeType.HEAD, onMovePoint.x, onMovePoint.y);
}
}
};
EToolShapeEditLineConnector.prototype.toSnapped = function (target, diagram, result) {
var targetIndex = this._targetIndex;
if (targetIndex === 0) {
var edge = this._edge.find(EShapeAcceptorEdgeType.TAIL, target.x, target.y);
if (edge != null) {
result.copyFrom(edge.local);
}
this._edgeTail = edge;
}
else {
var points = this._points;
var pointsLength = points.length;
if (targetIndex === pointsLength - 1) {
var edge = this._edge.find(EShapeAcceptorEdgeType.HEAD, target.x, target.y);
if (edge != null) {
result.copyFrom(edge.local);
}
this._edgeHead = edge;
}
else {
diagram.snapper.toSnapped(target, result);
}
}
};
EToolShapeEditLineConnector.prototype.toPoints = function (shape, points, transform) {
var result = [];
if (shape instanceof EShapeConnectorLine) {
var edge = shape.edge;
var tailLocal = edge.tail.local;
var headLocal = edge.head.local;
var transformPosition = shape.transform.position;
var px = transformPosition.x;
var py = transformPosition.y;
var x0 = tailLocal.x - px;
var y0 = tailLocal.y - py;
var x1 = headLocal.x - px;
var y1 = headLocal.y - py;
var tailPoint = new Point(x0, y0);
result.push(transform.apply(tailPoint, tailPoint));
var bodyValues = shape.body.values;
var bodyValuesLength = bodyValues.length;
if (0 < bodyValuesLength) {
var cx = (x1 + x0) * 0.5;
var cy = (y1 + y0) * 0.5;
var dx = x1 - x0;
var dy = y1 - y0;
var a = Math.atan2(dy, dx);
var l = Math.sqrt(dx * dx + dy * dy);
var c = Math.cos(a) * l;
var s = Math.sin(a) * l;
for (var i = 0; i < bodyValuesLength; i += 2) {
var x = bodyValues[i + 0];
var y = bodyValues[i + 1];
var x2 = cx + c * x - s * y;
var y2 = cy + c * y + s * x;
var middlePoint = new Point(x2, y2);
result.push(transform.apply(middlePoint, middlePoint));
}
}
var headPoint = new Point(x1, y1);
result.push(transform.apply(headPoint, headPoint));
}
return result;
};
EToolShapeEditLineConnector.prototype.newShape = function (values, segments, style, oldShape) {
var boundary = toPointsBoundary(values, [0, 0, 0, 0]);
var cx = (boundary[2] + boundary[0]) * 0.5;
var cy = (boundary[3] + boundary[1]) * 0.5;
var sx = boundary[2] - boundary[0];
var sy = boundary[3] - boundary[1];
var result = oldShape.clone();
var transform = result.transform;
var transformPosition = transform.position;
var px = transformPosition.x;
var py = transformPosition.y;
result.lock(EShapeLockPart.UPLOADED);
transformPosition.set(px + cx, py + cy);
transform.scale.set(1, 1);
transform.rotation = 0;
transform.skew.set(0, 0);
result.points.toFitted(sx, sy);
result.size.set(sx, sy);
result.edge.lock();
result.body.set(EShapeConnectorBodies.from(values, 0, 0));
var local = this._work;
if (2 <= values.length) {
local.set(px + values[0], py + values[1]);
}
else {
local.set(px, py);
}
var edgeTail = this._edgeTail;
if (edgeTail !== undefined) {
if (this.isTailAccepted(result, local, edgeTail)) {
this.onTailAccepted(result, local, edgeTail);
}
}
if (2 <= values.length) {
var valuesLength = values.length;
local.set(px + values[valuesLength - 2], py + values[valuesLength - 1]);
}
else {
local.set(px, py);
}
var edgeHead = this._edgeHead;
if (edgeHead !== undefined) {
if (this.isHeadAccepted(result, local, edgeHead)) {
this.onHeadAccepted(result, local, edgeHead);
}
}
result.edge.unlock();
result.unlock(EShapeLockPart.UPLOADED, true);
return result;
};
EToolShapeEditLineConnector.prototype.isDanglingEdgeAllowed = function () {
var _a;
return (_a = this._options.dangling) !== null && _a !== void 0 ? _a : false;
};
EToolShapeEditLineConnector.prototype.isTailAccepted = function (connector, local, edge) {
if (edge == null) {
return this.isDanglingEdgeAllowed();
}
else {
return true;
}
};
EToolShapeEditLineConnector.prototype.onTailAccepted = function (connector, local, edge) {
if (edge != null) {
connector.edge.tail.set(edge.shape, edge.id, edge.x, edge.y, undefined, undefined, undefined, undefined, undefined, edge.acceptor.side);
}
else {
connector.edge.tail.set(null, null, null, null, undefined, local.x, local.y, undefined, undefined, EShapeAcceptorEdgeSide.TOP);
}
};
EToolShapeEditLineConnector.prototype.isHeadAccepted = function (connector, local, edge) {
if (edge == null) {
return this.isDanglingEdgeAllowed();
}
else {
return true;
}
};
EToolShapeEditLineConnector.prototype.onHeadAccepted = function (connector, local, edge) {
if (edge != null) {
connector.edge.head.set(edge.shape, edge.id, edge.x, edge.y, undefined, undefined, undefined, undefined, undefined, edge.acceptor.side);
}
else {
connector.edge.head.set(null, null, null, null, undefined, local.x, local.y, undefined, undefined, EShapeAcceptorEdgeSide.TOP);
}
};
return EToolShapeEditLineConnector;
}(EToolShapeEditLineBase));
export { EToolShapeEditLineConnector };
//# sourceMappingURL=e-tool-shape-edit-line-connector.js.map