Gustavo Fuhr 19353a9423 Merged in eslint-prettier-config (pull request #53)
Eslint prettier config

* config eslint + manual fixes

* Merge branch 'develop' into eslint-prettier-config

* fixes eslint web2d


Approved-by: Paulo Veiga
2022-07-14 03:12:12 +00:00

113 lines
3.2 KiB
JavaScript

/*
* Copyright [2021] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { $defined } from '@wisemapping/core-js';
import ElementPeer from './ElementPeer';
import Point from '../../Point';
class ArrowPeer extends ElementPeer {
constructor() {
const svgElement = window.document.createElementNS(ElementPeer.svgNamespace, 'path');
super(svgElement);
this._style = {};
this._controlPoint = new Point();
this._fromPoint = new Point();
}
setFrom(x, y) {
this._fromPoint.x = x;
this._fromPoint.y = y;
this._redraw();
}
setControlPoint(point) {
this._controlPoint = point;
this._redraw();
}
setStrokeColor(color) {
this.setStroke(null, null, color, null);
}
setStrokeWidth(width) {
this.setStroke(width);
}
setDashed(isDashed, length, spacing) {
if ($defined(isDashed) && isDashed && $defined(length) && $defined(spacing)) {
this._native.setAttribute('stroke-dasharray', `${length}${spacing}`);
} else {
this._native.setAttribute('stroke-dasharray', '');
}
}
_updateStyle() {
let style = '';
for (const key in this._style) {
if (Object.prototype.hasOwnProperty.call(this._style, key)) {
style += `${key}:${this._style[key]} `;
}
}
this._native.setAttribute('style', style);
}
_redraw() {
let x;
let y;
let xp;
let yp;
if (
$defined(this._fromPoint.x) &&
$defined(this._fromPoint.y) &&
$defined(this._controlPoint.x) &&
$defined(this._controlPoint.y)
) {
if (this._controlPoint.y === 0) this._controlPoint.y = 1;
const y0 = this._controlPoint.y;
const x0 = this._controlPoint.x;
const x2 = x0 + y0;
const y2 = y0 - x0;
const x3 = x0 - y0;
const y3 = y0 + x0;
const m = y2 / x2;
const mp = y3 / x3;
const l = 6;
// eslint-disable-next-line no-restricted-properties
const { pow } = Math;
x = x2 === 0 ? 0 : Math.sqrt(pow(l, 2) / (1 + pow(m, 2)));
x *= Math.sign(x2);
y = x2 === 0 ? l * Math.sign(y2) : m * x;
xp = x3 === 0 ? 0 : Math.sqrt(pow(l, 2) / (1 + pow(mp, 2)));
xp *= Math.sign(x3);
yp = x3 === 0 ? l * Math.sign(y3) : mp * xp;
const path =
`M${this._fromPoint.x},${this._fromPoint.y} ` +
`L${x + this._fromPoint.x},${y + this._fromPoint.y} M${this._fromPoint.x},${
this._fromPoint.y
} ` +
`L${xp + this._fromPoint.x},${yp + this._fromPoint.y}`;
this._native.setAttribute('d', path);
}
}
}
export default ArrowPeer;