@joint/core
Version:
JavaScript diagramming library
107 lines (103 loc) • 3.51 kB
JavaScript
import * as g from '../g/index.mjs';
import V from '../V/index.mjs';
import * as util from '../util/index.mjs';
import { ToolView } from '../dia/ToolView.mjs';
// End Markers
const Arrowhead = ToolView.extend({
tagName: 'path',
xAxisVector: new g.Point(1, 0),
events: {
mousedown: 'onPointerDown',
touchstart: 'onPointerDown'
},
documentEvents: {
mousemove: 'onPointerMove',
touchmove: 'onPointerMove',
mouseup: 'onPointerUp',
touchend: 'onPointerUp',
touchcancel: 'onPointerUp'
},
options: {
scale: null
},
onRender: function() {
this.update();
},
update: function() {
var ratio = this.ratio;
var view = this.relatedView;
var tangent = view.getTangentAtRatio(ratio);
var position, angle;
if (tangent) {
position = tangent.start;
angle = tangent.vector().vectorAngle(this.xAxisVector) || 0;
} else {
position = view.getPointAtRatio(ratio);
angle = 0;
}
if (!position) return this;
var matrix = V.createSVGMatrix().translate(position.x, position.y).rotate(angle);
const { scale } = this.options;
if (scale) matrix = matrix.scale(scale);
this.vel.transform(matrix, { absolute: true });
return this;
},
onPointerDown: function(evt) {
if (this.guard(evt)) return;
evt.stopPropagation();
evt.preventDefault();
var relatedView = this.relatedView;
var paper = relatedView.paper;
relatedView.model.startBatch('arrowhead-move', { ui: true, tool: this.cid });
relatedView.startArrowheadMove(this.arrowheadType);
const data = evt.data || (evt.data = {});
this.delegateDocumentEvents(null, data);
paper.undelegateEvents();
this.focus();
this.el.style.pointerEvents = 'none';
relatedView.notifyPointerdown(...paper.getPointerArgs(evt));
},
onPointerMove: function(evt) {
var normalizedEvent = util.normalizeEvent(evt);
var coords = this.paper.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY);
this.relatedView.pointermove(normalizedEvent, coords.x, coords.y);
},
onPointerUp: function(evt) {
this.undelegateDocumentEvents();
var relatedView = this.relatedView;
var paper = relatedView.paper;
var normalizedEvent = util.normalizeEvent(evt);
var coords = paper.snapToGrid(normalizedEvent.clientX, normalizedEvent.clientY);
relatedView.pointerup(normalizedEvent, coords.x, coords.y);
paper.delegateEvents();
this.blur();
this.el.style.pointerEvents = '';
relatedView.model.stopBatch('arrowhead-move', { ui: true, tool: this.cid });
}
});
export const TargetArrowhead = Arrowhead.extend({
name: 'target-arrowhead',
ratio: 1,
arrowheadType: 'target',
attributes: {
'd': 'M -10 -8 10 0 -10 8 Z',
'fill': '#33334F',
'stroke': '#FFFFFF',
'stroke-width': 2,
'cursor': 'move',
'class': 'target-arrowhead'
}
});
export const SourceArrowhead = Arrowhead.extend({
name: 'source-arrowhead',
ratio: 0,
arrowheadType: 'source',
attributes: {
'd': 'M 10 -8 -10 0 10 8 Z',
'fill': '#33334F',
'stroke': '#FFFFFF',
'stroke-width': 2,
'cursor': 'move',
'class': 'source-arrowhead'
}
});