From 37c3ce1b475500b03d1736d192c6f5de85435ab7 Mon Sep 17 00:00:00 2001 From: Eric Rowell Date: Mon, 9 Dec 2013 22:31:18 -0800 Subject: [PATCH] added layer hitGraphEnabled flag --- src/Layer.js | 54 ++++++++++++++++++++--- src/Node.js | 3 +- src/Stage.js | 3 ++ test/performance/common/random-squares.js | 14 +++--- test/unit/Layer-test.js | 31 +++++++++++++ 5 files changed, 93 insertions(+), 12 deletions(-) diff --git a/src/Layer.js b/src/Layer.js index bc626a85..7be32f1f 100644 --- a/src/Layer.js +++ b/src/Layer.js @@ -263,22 +263,43 @@ }, getStage: function() { return this.parent; + }, + /** + * enable hit graph + * @name enableHitGraph + * @method + * @memberof Kinetic.Layer.prototype + * @returns {Node} + */ + enableHitGraph: function() { + this.setHitGraphEnabled(true); + return this; + }, + /** + * disable hit graph + * @name enableHitGraph + * @method + * @memberof Kinetic.Layer.prototype + * @returns {Node} + */ + disableHitGraph: function() { + this.setHitGraphEnabled(false); + return this; } }); Kinetic.Util.extend(Kinetic.Layer, Kinetic.Container); // add getters and setters - Kinetic.Factory.addGetterSetter(Kinetic.Layer, 'clearBeforeDraw', function() { - return true; - }); + Kinetic.Factory.addGetterSetter(Kinetic.Layer, 'clearBeforeDraw', true); /** * set flag which determines if the layer is cleared or not * before drawing * @name setClearBeforeDraw * @method - * @memberof Kinetic.Node.prototype + * @memberof Kinetic.Layer.prototype * @param {Boolean} clearBeforeDraw + * @returns {Node} */ /** @@ -286,6 +307,29 @@ * before drawing * @name getClearBeforeDraw * @method - * @memberof Kinetic.Node.prototype + * @memberof Kinetic.Layer.prototype + * @returns {Boolean} */ + + Kinetic.Factory.addGetterSetter(Kinetic.Layer, 'hitGraphEnabled', true); + + /** + * enable / disable hit graph + * @name setHitGraphEnabled + * @method + * @memberof Kinetic.Layer.prototype + * @param {Boolean} enable + * @returns {Node} + */ + + /** + * get flag which determines if the layer is cleared or not + * before drawing + * @name getHitGraphEnabled + * @method + * @memberof Kinetic.Layer.prototype + * @returns {Boolean} + */ + + Kinetic.Layer.prototype.isHitGraphEnabled = Kinetic.Layer.prototype.getHitGraphEnabled; })(); diff --git a/src/Node.js b/src/Node.js index daea9889..4737c2b8 100644 --- a/src/Node.js +++ b/src/Node.js @@ -418,7 +418,8 @@ * @returns {Boolean} */ shouldDrawHit: function() { - return this.isListening() && this.isVisible() && !Kinetic.isDragging(); + var layer = this.getLayer(); + return layer && layer.isHitGraphEnabled() && this.isListening() && this.isVisible() && !Kinetic.isDragging(); }, /** * determine if node is visible or not. Node is visible only diff --git a/src/Stage.js b/src/Stage.js index 1fcc0185..bedb899f 100644 --- a/src/Stage.js +++ b/src/Stage.js @@ -82,6 +82,9 @@ this._setAttr(CONTAINER, container); return this; }, + shouldDrawHit: function() { + return true; + }, draw: function() { Kinetic.Node.prototype.draw.call(this); return this; diff --git a/test/performance/common/random-squares.js b/test/performance/common/random-squares.js index f02cf7da..73816e6f 100644 --- a/test/performance/common/random-squares.js +++ b/test/performance/common/random-squares.js @@ -79,16 +79,15 @@ function make_shape(color) { if (VERSION === 'new') { - /* + return new Kinetic.Rect({ fill: color, width: 10, - height: 10, - listening: false + height: 10 }); - */ + - + /* return new Kinetic.Shape({ drawFunc: function(context) { var _context = context._context; @@ -99,6 +98,7 @@ _context.fill(); } }); + */ } else { return new Kinetic.Shape(function(){ @@ -120,7 +120,9 @@ width: 578, height: 200 }); - circlesLayer = new Kinetic.Layer(); + circlesLayer = new Kinetic.Layer({ + hitGraphEnabled: false + }); } else { stage = new Kinetic.Stage("container", width, height); circlesLayer = new Kinetic.Layer(); diff --git a/test/unit/Layer-test.js b/test/unit/Layer-test.js index bc76d63d..46e924a9 100644 --- a/test/unit/Layer-test.js +++ b/test/unit/Layer-test.js @@ -261,4 +261,35 @@ suite('Layer', function() { quality: 1 }); }); + + // ====================================================== + test('hit graph enable disable', function() { + var stage = addStage(); + var layer = new Kinetic.Layer(); + + var circle = new Kinetic.Circle({ + x: stage.getWidth() / 2, + y: stage.getHeight() / 2, + radius: 70, + fill: 'red', + stroke: 'black', + strokeWidth: 4 + }); + + layer.add(circle); + stage.add(layer); + + assert.equal(layer.isHitGraphEnabled(), true); + assert.equal(layer.shouldDrawHit(), true); + + layer.disableHitGraph(); + + assert.equal(layer.isHitGraphEnabled(), false); + assert.equal(layer.shouldDrawHit(), false); + + layer.enableHitGraph(); + + assert.equal(layer.isHitGraphEnabled(), true); + assert.equal(layer.shouldDrawHit(), true); + }); }); \ No newline at end of file