From 124da9ca26c02b50de9081941a96a68f61a28dc1 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Fri, 8 Sep 2017 12:05:06 +0200 Subject: [PATCH] backport subtarget fix --- src/canvas.class.js | 6 +++++- test/unit/canvas.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/canvas.class.js b/src/canvas.class.js index 82aee625..a07c33c4 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -1106,7 +1106,8 @@ pointer = this.getPointer(e, ignoreZoom), activeObject = this._activeObject, aObjects = this.getActiveObjects(), - activeTarget; + activeTarget, activeTargetSubs; + // first check current group (if one exists) // active group does not check sub targets like normal groups. // if active group just exits. @@ -1126,11 +1127,14 @@ } else { activeTarget = activeObject; + activeTargetSubs = this.targets; + this.targets = []; } } var target = this._searchPossibleTargets(this._objects, pointer); if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) { target = activeTarget; + this.targets = activeTargetSubs; } return target; }, diff --git a/test/unit/canvas.js b/test/unit/canvas.js index f164c8a1..38b77491 100644 --- a/test/unit/canvas.js +++ b/test/unit/canvas.js @@ -465,6 +465,37 @@ canvas.remove(group); }); + test('findTarget with subTargetCheck on activeObject and preserveObjectStacking true', function() { + var rect = makeRect({ left: 0, top: 0 }), + rect2 = makeRect({ left: 30, top: 30}), target, + group = new fabric.Group([rect, rect2]); + canvas.preserveObjectStacking = true; + canvas.add(group); + canvas.setActiveObject(group); + group.subTargetCheck = true; + target = canvas.findTarget({ + clientX: 9, clientY: 9 + }); + equal(target, group, 'Should return the group'); + equal(canvas.targets[0], rect, 'should return the rect'); + + target = canvas.findTarget({ + clientX: 9, clientY: 9 + }); + + target = canvas.findTarget({ + clientX: 9, clientY: 9 + }); + + target = canvas.findTarget({ + clientX: 9, clientY: 9 + }); + + equal(canvas.targets.length, 1, 'multiple calls to subtarget should not add more to targets'); + + canvas.remove(group); + }); + test('findTarget with perPixelTargetFind', function() { ok(typeof canvas.findTarget == 'function'); var triangle = makeTriangle({ left: 0, top: 0 }), target;