diff --git a/konva.js b/konva.js index 0709fa6d..3de57479 100644 --- a/konva.js +++ b/konva.js @@ -731,7 +731,9 @@ }, _sign: function (number) { if (number === 0) { - return 0; + // that is not what sign usually returns + // but that is what we need + return 1; } if (number > 0) { return 1; @@ -3504,6 +3506,21 @@ y: this.y(), }; }; + /** + * get absolute position of a node. That function can be used to calculate absolute position, but relative to any ancestor + * @method + * @name Konva.Node#getAbsolutePosition + * @param {Object} Ancestor optional ancestor node + * @returns {Konva.Node} + * @example + * + * // returns absolute position relative to top-left corner of canvas + * node.getAbsolutePosition(); + * + * // calculate absolute position of node, inside stage + * // so stage transforms are ignored + * node.getAbsolutePosition(stage) + */ Node.prototype.getAbsolutePosition = function (top) { var haveCachedParent = false; var parent = this.parent; diff --git a/src/Node.ts b/src/Node.ts index 75394adf..5e2256f0 100644 --- a/src/Node.ts +++ b/src/Node.ts @@ -1183,6 +1183,21 @@ export abstract class Node { y: this.y(), }; } + /** + * get absolute position of a node. That function can be used to calculate absolute position, but relative to any ancestor + * @method + * @name Konva.Node#getAbsolutePosition + * @param {Object} Ancestor optional ancestor node + * @returns {Konva.Node} + * @example + * + * // returns absolute position relative to top-left corner of canvas + * node.getAbsolutePosition(); + * + * // calculate absolute position of node, inside stage + * // so stage transforms are ignored + * node.getAbsolutePosition(stage) + */ getAbsolutePosition(top?) { let haveCachedParent = false; let parent = this.parent; diff --git a/src/Util.ts b/src/Util.ts index 5524dab0..6a5cba62 100644 --- a/src/Util.ts +++ b/src/Util.ts @@ -599,7 +599,9 @@ export const Util = { }, _sign(number: number) { if (number === 0) { - return 0; + // that is not what sign usually returns + // but that is what we need + return 1; } if (number > 0) { return 1; diff --git a/src/shapes/Text.ts b/src/shapes/Text.ts index 6e51bcd4..a9d2c267 100644 --- a/src/shapes/Text.ts +++ b/src/shapes/Text.ts @@ -31,6 +31,7 @@ export interface TextConfig extends ShapeConfig { verticalAlign?: string; padding?: number; lineHeight?: number; + letterSpacing?: number; wrap?: string; ellipsis?: boolean; } diff --git a/src/shapes/Transformer.ts b/src/shapes/Transformer.ts index fef44c77..5252e069 100644 --- a/src/shapes/Transformer.ts +++ b/src/shapes/Transformer.ts @@ -29,6 +29,7 @@ export interface TransformerConfig extends ContainerConfig { anchorStroke?: string; anchorStrokeWidth?: number; anchorSize?: number; + anchorCornerRadius?: number; keepRatio?: boolean; centeredScaling?: boolean; enabledAnchors?: Array; diff --git a/test/unit/shapes/Transformer-test.js b/test/unit/shapes/Transformer-test.js index e2d89e3f..e3084a31 100644 --- a/test/unit/shapes/Transformer-test.js +++ b/test/unit/shapes/Transformer-test.js @@ -4496,4 +4496,42 @@ suite('Transformer', function () { layer.add(tr); layer.draw(); }); + + // we don't support height = 0 + test.skip('try to tranform zero size shape', function () { + var stage = addStage(); + var layer = new Konva.Layer(); + stage.add(layer); + + var shape = new Konva.Line({ + x: stage.getWidth() / 4, + y: stage.getHeight() / 4, + points: [0, 0, 200, 0], + fill: 'black', + stroke: 'black', + strokeWidth: 4, + draggable: true, + }); + layer.add(shape); + + var tr = new Konva.Transformer({ + nodes: [shape], + enabledAnchors: ['middle-left', 'middle-right'], + ignoreStroke: true, + }); + layer.add(tr); + + layer.draw(); + + tr.simulateMouseDown({ + x: stage.width() / 2, + y: stage.height() / 2, + }); + tr.simulateMouseDown({ + x: stage.width() / 2 + 100, + y: stage.height() / 2, + }); + tr.simulateMouseUp(); + assert.equal(shape.scaleX(), 0.5); + }); });