improve transformer performance

This commit is contained in:
Anton Lavrenov 2024-03-04 05:16:19 +07:00
parent b09ceb34f3
commit 73d65cb7d3
5 changed files with 58 additions and 38 deletions

View File

@ -155,6 +155,9 @@ export const Konva = {
isDragging() { isDragging() {
return Konva['DD'].isDragging; return Konva['DD'].isDragging;
}, },
isTransforming() {
return Konva['Transformer']?.isTransforming();
},
/** /**
* returns whether or not a drag and drop operation is ready, but may * returns whether or not a drag and drop operation is ready, but may
* not necessarily have started * not necessarily have started

View File

@ -1029,7 +1029,10 @@ export abstract class Node<Config extends NodeConfig = NodeConfig> {
} }
}); });
var dragSkip = !skipDragCheck && !Konva.hitOnDragEnabled && layerUnderDrag; var dragSkip =
!skipDragCheck &&
!Konva.hitOnDragEnabled &&
(layerUnderDrag || Konva.isTransforming());
return this.isListening() && this.isVisible() && !dragSkip; return this.isListening() && this.isVisible() && !dragSkip;
} }

View File

@ -507,7 +507,8 @@ export class Stage extends Container<Layer> {
this.setPointersPositions(evt); this.setPointersPositions(evt);
var targetShape = this._getTargetShape(eventType); var targetShape = this._getTargetShape(eventType);
var eventsEnabled = !DD.isDragging || Konva.hitOnDragEnabled; var eventsEnabled =
!(Konva.isDragging() || Konva.isTransforming()) || Konva.hitOnDragEnabled;
if (targetShape && eventsEnabled) { if (targetShape && eventsEnabled) {
targetShape._fireAndBubble(events.pointerout, { evt: evt }); targetShape._fireAndBubble(events.pointerout, { evt: evt });
targetShape._fireAndBubble(events.pointerleave, { evt: evt }); targetShape._fireAndBubble(events.pointerleave, { evt: evt });
@ -590,12 +591,13 @@ export class Stage extends Container<Layer> {
if (!events) { if (!events) {
return; return;
} }
if (DD.isDragging && DD.node!.preventDefault() && evt.cancelable) { if (Konva.isDragging() && DD.node!.preventDefault() && evt.cancelable) {
evt.preventDefault(); evt.preventDefault();
} }
this.setPointersPositions(evt); this.setPointersPositions(evt);
var eventsEnabled = !DD.isDragging || Konva.hitOnDragEnabled; var eventsEnabled =
!(Konva.isDragging() || Konva.isTransforming()) || Konva.hitOnDragEnabled;
if (!eventsEnabled) { if (!eventsEnabled) {
return; return;
} }

View File

@ -203,6 +203,7 @@ function getSnap(snaps: Array<number>, newRotationRad: number, tol: number) {
return snapped; return snapped;
} }
let activeTransformersCount = 0;
/** /**
* Transformer constructor. Transformer is a special type of group that allow you transform Konva * Transformer constructor. Transformer is a special type of group that allow you transform Konva
* primitives and shapes. Transforming tool is not changing `width` and `height` properties of nodes * primitives and shapes. Transforming tool is not changing `width` and `height` properties of nodes
@ -244,7 +245,6 @@ function getSnap(snaps: Array<number>, newRotationRad: number, tol: number) {
* }); * });
* layer.add(transformer); * layer.add(transformer);
*/ */
export class Transformer extends Group { export class Transformer extends Group {
_nodes: Array<Node>; _nodes: Array<Node>;
_movingAnchorName: string | null = null; _movingAnchorName: string | null = null;
@ -254,6 +254,10 @@ export class Transformer extends Group {
cos: number; cos: number;
_cursorChange: boolean; _cursorChange: boolean;
static isTransforming = () => {
return activeTransformersCount > 0;
};
constructor(config?: TransformerConfig) { constructor(config?: TransformerConfig) {
// call super constructor // call super constructor
super(config); super(config);
@ -690,6 +694,7 @@ export class Transformer extends Group {
x: pos.x - ap.x, x: pos.x - ap.x,
y: pos.y - ap.y, y: pos.y - ap.y,
}; };
activeTransformersCount++;
this._fire('transformstart', { evt: e.evt, target: this.getNode() }); this._fire('transformstart', { evt: e.evt, target: this.getNode() });
this._nodes.forEach((target) => { this._nodes.forEach((target) => {
target._fire('transformstart', { evt: e.evt, target }); target._fire('transformstart', { evt: e.evt, target });
@ -955,6 +960,7 @@ export class Transformer extends Group {
window.removeEventListener('touchend', this._handleMouseUp, true); window.removeEventListener('touchend', this._handleMouseUp, true);
} }
var node = this.getNode(); var node = this.getNode();
activeTransformersCount--;
this._fire('transformend', { evt: e, target: node }); this._fire('transformend', { evt: e, target: node });
if (node) { if (node) {

View File

@ -4967,40 +4967,46 @@ describe('Transformer', function () {
simulateMouseUp(tr, { x: 110, y: 2 }); simulateMouseUp(tr, { x: 110, y: 2 });
}); });
// it('skip render on hit graph while transforming', function () { it('skip render on hit graph while transforming', function () {
// var stage = addStage(); var stage = addStage();
// var layer = new Konva.Layer(); var layer = new Konva.Layer();
// stage.add(layer); stage.add(layer);
// var rect = new Konva.Rect({ var rect = new Konva.Rect({
// x: 55, x: 55,
// y: 55, y: 55,
// draggable: true, draggable: true,
// width: 100, width: 100,
// height: 100, height: 100,
// fill: 'yellow', fill: 'yellow',
// }); });
// layer.add(rect); layer.add(rect);
// var tr = new Konva.Transformer({ var tr = new Konva.Transformer({
// nodes: [rect], nodes: [rect],
// }); });
// layer.add(tr); layer.add(tr);
// layer.draw(); layer.draw();
// simulateMouseDown(tr, { simulateMouseDown(tr, {
// x: 100, x: 100,
// y: 2, y: 2,
// }); });
// simulateMouseMove(tr, { simulateMouseMove(tr, {
// x: 110, x: 110,
// y: 2, y: 2,
// }); });
// const shape = layer.getIntersection({ let shape = layer.getIntersection({
// x: 100, x: 100,
// y: 100, y: 100,
// }); });
// assert.equal(shape, null); assert.equal(shape, null);
// simulateMouseUp(tr, { x: 110, y: 2 }); simulateMouseUp(tr, { x: 110, y: 2 });
// }); layer.draw();
shape = layer.getIntersection({
x: 100,
y: 100,
});
assert.equal(shape, rect);
});
}); });