in src/canvastools/ts/CanvasTools/Selection/Selectors/PolygonSelector.ts [200:323]
private buildUIElements() {
this.node = this.paper.g();
this.node.addClass("polygonSelector");
this.crossA = new CrossElement(this.paper, this.boundRect);
this.nextPoint = this.paper.circle(0, 0, PolygonSelector.DEFAULT_SELECTOR_RADIUS);
this.nextPoint.addClass("nextPointStyle");
this.nextSegment = this.paper.g();
this.nextL1 = this.paper.line(0, 0, 0, 0);
this.nextLN = this.paper.line(0, 0, 0, 0);
this.nextL1.addClass("nextSegmentStyle");
this.nextLN.addClass("nextSegmentStyle");
this.nextSegment.add(this.nextL1);
this.nextSegment.add(this.nextLN);
this.pointsGroup = this.paper.g();
this.pointsGroup.addClass("polygonGroupStyle");
this.polygon = this.paper.polygon([]);
this.polygon.addClass("polygonStyle");
this.node.add(this.polygon);
this.node.add(this.pointsGroup);
this.node.add(this.crossA.node);
this.node.add(this.nextSegment);
this.node.add(this.nextPoint);
const listeners: EventListeners = [
{
event: "pointerenter",
base: this.parentNode,
listener: () => this.show(),
bypass: false,
},
{
event: "pointerleave",
base: this.parentNode,
listener: (e: PointerEvent) => {
if (!this.isCapturing) {
this.hide();
} else {
const rect = this.parentNode.getClientRects();
const p = new Point2D(e.clientX - rect[0].left, e.clientY - rect[0].top);
this.moveCross(this.crossA, p);
this.movePoint(this.nextPoint, p);
}
},
bypass: false,
},
{
event: "pointerdown",
base: this.parentNode,
listener: (e: PointerEvent) => {
if (!this.isCapturing) {
this.isCapturing = true;
if (typeof this.callbacks.onSelectionBegin === "function") {
this.callbacks.onSelectionBegin();
}
}
},
bypass: false,
},
{
event: "click",
base: this.parentNode,
listener: (e: MouseEvent) => {
if (e.detail <= 1 && this.isCapturing) {
window.requestAnimationFrame(() => {
const p = new Point2D(this.crossA.x, this.crossA.y);
this.addPoint(p.x, p.y);
this.lastPoint = p;
this.redoQueue = [];
});
if (typeof this.callbacks.onNextSelectionPoint === "function") {
this.callbacks.onNextSelectionPoint(new Point2D(this.crossA.x, this.crossA.y));
}
}
},
bypass: false,
},
{
event: "pointermove",
base: this.parentNode,
listener: (e: PointerEvent) => {
window.requestAnimationFrame(() => {
const rect = this.parentNode.getClientRects();
const p = new Point2D(e.clientX - rect[0].left, e.clientY - rect[0].top);
this.moveCross(this.crossA, p);
this.movePoint(this.nextPoint, p);
if (this.lastPoint != null) {
this.moveLine(this.nextLN, this.lastPoint, p);
this.moveLine(this.nextL1, this.points[0], p);
} else {
this.moveLine(this.nextLN, p, p);
this.moveLine(this.nextL1, p, p);
}
});
e.preventDefault();
},
bypass: false,
},
{
event: "dblclick",
base: this.parentNode,
listener: () => this.submitPolygon(),
bypass: false,
},
{
event: "keyup",
base: window,
listener: (e: KeyboardEvent) => {
if (e.code === "Escape") {
this.submitPolygon();
}
},
bypass: true,
},
];
this.subscribeToEvents(listeners);
}