From 4a4f42bdb289fd1f41377db416118757b2517e10 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 10 Jan 2016 23:36:47 +0100 Subject: [PATCH 1/8] preliminary clenaup 1 --- src/canvas.class.js | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/canvas.class.js b/src/canvas.class.js index e40d4f876f6..a7f7b3b1524 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -261,9 +261,8 @@ * @param {fabric.Object} target Object to test against * @return {Boolean} true if point is contained within an area of given object */ - containsPoint: function (e, target) { - var pointer = this.getPointer(e, true), - xy = this._normalizePointer(target, pointer); + containsPoint: function (pointer, target) { + var xy = this._normalizePointer(target, pointer); // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html @@ -860,36 +859,37 @@ /** * @private */ - _isLastRenderedObject: function(e) { + _isLastRenderedObject: function(pointer) { + var lastRendered = this.lastRenderedObjectWithControlsAboveOverlay; return ( this.controlsAboveOverlay && - this.lastRenderedObjectWithControlsAboveOverlay && - this.lastRenderedObjectWithControlsAboveOverlay.visible && - this.containsPoint(e, this.lastRenderedObjectWithControlsAboveOverlay) && - this.lastRenderedObjectWithControlsAboveOverlay._findTargetCorner(this.getPointer(e, true))); + lastRendered && + lastRendered.visible && + (this.containsPoint(pointer, lastRendered) || + lastRendered._findTargetCorner(pointer))); }, /** * Method that determines what object we are clicking on * @param {Event} e mouse event - * @param {Boolean} skipGroup when true, group is skipped and only objects are traversed through + * @param {Boolean} skipGroup when true, ActiveGroup is skipped and only objects are traversed through */ - findTarget: function (e, skipGroup) { + findTarget: function (e) { if (this.skipTargetFind) { return; } - - if (this._isLastRenderedObject(e)) { + var pointer = this.getPointer(e, true); + if (this._isLastRenderedObject(pointer)) { return this.lastRenderedObjectWithControlsAboveOverlay; } // first check current group (if one exists) var activeGroup = this.getActiveGroup(); - if (activeGroup && !skipGroup && this.containsPoint(e, activeGroup)) { + if (activeGroup && this.containsPoint(pointer, activeGroup)) { return activeGroup; } - var target = this._searchPossibleTargets(e, skipGroup); + var target = this._searchPossibleTargets(pointer, this._objects); this._fireOverOutEvents(target, e); return target; @@ -920,11 +920,11 @@ /** * @private */ - _checkTarget: function(e, obj, pointer) { + _checkTarget: function(pointer, obj) { if (obj && obj.visible && obj.evented && - this.containsPoint(e, obj)){ + this.containsPoint(pointer, obj)){ if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) { var isTransparent = this.isTargetTransparent(obj, pointer.x, pointer.y); if (!isTransparent) { @@ -940,18 +940,16 @@ /** * @private */ - _searchPossibleTargets: function(e, skipGroup) { + _searchPossibleTargets: function(pointer, objects) { // Cache all targets where their bounding box contains point. - var target, - pointer = this.getPointer(e, true), - i = this._objects.length; + var target,i = objects.length; // Do not check for currently grouped objects, since we check the parent group itself. // untill we call this function specifically to search inside the activeGroup while (i--) { - if ((!this._objects[i].group || skipGroup) && this._checkTarget(e, this._objects[i], pointer)){ - this.relatedTarget = this._objects[i]; - target = this._objects[i]; + if ((!this._objects[i].group) && this._checkTarget(pointer, this._objects[i])) { + this.relatedTarget = objects[i]; + target = objects[i]; break; } } From b38c3852dc8e1d59c9034800a5dd7d0a32aedc01 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 10 Jan 2016 23:38:24 +0100 Subject: [PATCH 2/8] Update canvas_grouping.mixin.js --- src/mixins/canvas_grouping.mixin.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/mixins/canvas_grouping.mixin.js b/src/mixins/canvas_grouping.mixin.js index 65b2bafdce4..b77c17035b4 100644 --- a/src/mixins/canvas_grouping.mixin.js +++ b/src/mixins/canvas_grouping.mixin.js @@ -24,18 +24,16 @@ * @param {fabric.Object} target */ _handleGrouping: function (e, target) { - - if (target === this.getActiveGroup()) { - - // if it's a group, find target again, this time skipping group - target = this.findTarget(e, true); - + var activeGroup = this.getActiveGroup(); + // if it's the activeGroup, find target again, specifiy active group objects + if (target === activeGroup) { + target = this._searchPossibleTargets(e, activeGroup._objects); // if even object is not found, bail out - if (!target || target.isType('group')) { + if (!target) { return; } } - if (this.getActiveGroup()) { + if (this.activeGroup) { this._updateActiveGroup(target, e); } else { From 07a2df8b7f2f01378a0b9b26013ea38965104900 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Mon, 11 Jan 2016 01:34:46 +0100 Subject: [PATCH 3/8] Update canvas.class.js --- src/canvas.class.js | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/canvas.class.js b/src/canvas.class.js index a7f7b3b1524..0a71bb8c938 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -273,21 +273,17 @@ * @private */ _normalizePointer: function (object, pointer) { - var activeGroup = this.getActiveGroup(), - isObjectInGroup = ( - activeGroup && - object.type !== 'group' && - activeGroup.contains(object)), + var group = object.group, lt, m; - if (isObjectInGroup) { + if (group) { m = fabric.util.multiplyTransformMatrices( this.viewportTransform, - activeGroup.calcTransformMatrix()); + group.calcTransformMatrix()); m = fabric.util.invertTransform(m); pointer = fabric.util.transformPoint(pointer, m , false); - lt = fabric.util.transformPoint(activeGroup.getCenterPoint(), m , false); + lt = fabric.util.transformPoint(group.getCenterPoint(), m , false); pointer.x -= lt.x; pointer.y -= lt.y; } @@ -874,7 +870,7 @@ * @param {Event} e mouse event * @param {Boolean} skipGroup when true, ActiveGroup is skipped and only objects are traversed through */ - findTarget: function (e) { + findTarget: function (e, skipGroup) { if (this.skipTargetFind) { return; } @@ -885,13 +881,11 @@ // first check current group (if one exists) var activeGroup = this.getActiveGroup(); - if (activeGroup && this.containsPoint(pointer, activeGroup)) { + if (activeGroup && !skipGroup && this.containsPoint(pointer, activeGroup)) { return activeGroup; } - var target = this._searchPossibleTargets(pointer, this._objects); - this._fireOverOutEvents(target, e); - + var target = this._searchPossibleTargets(e, pointer, this._objects); return target; }, @@ -940,16 +934,16 @@ /** * @private */ - _searchPossibleTargets: function(pointer, objects) { + _searchPossibleTargets: function(e, pointer, objects) { // Cache all targets where their bounding box contains point. var target,i = objects.length; // Do not check for currently grouped objects, since we check the parent group itself. // untill we call this function specifically to search inside the activeGroup while (i--) { - if ((!this._objects[i].group) && this._checkTarget(pointer, this._objects[i])) { - this.relatedTarget = objects[i]; + if (this._checkTarget(pointer, objects[i])) { target = objects[i]; + this._fireOverOutEvents(target, e); break; } } From 84a5376b7b7d6a89407529290b720ec9224579ed Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Mon, 11 Jan 2016 01:36:02 +0100 Subject: [PATCH 4/8] Update canvas_grouping.mixin.js --- src/mixins/canvas_grouping.mixin.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mixins/canvas_grouping.mixin.js b/src/mixins/canvas_grouping.mixin.js index b77c17035b4..bf727b28e9a 100644 --- a/src/mixins/canvas_grouping.mixin.js +++ b/src/mixins/canvas_grouping.mixin.js @@ -25,15 +25,16 @@ */ _handleGrouping: function (e, target) { var activeGroup = this.getActiveGroup(); - // if it's the activeGroup, find target again, specifiy active group objects if (target === activeGroup) { - target = this._searchPossibleTargets(e, activeGroup._objects); + // if it's a group, find target again, specifiy active group objects + target = this.findTarget(e, true); + // if even object is not found, bail out if (!target) { return; } } - if (this.activeGroup) { + if (activeGroup) { this._updateActiveGroup(target, e); } else { From b3fb4c28471df5c94995d99585b0b16892150079 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Mon, 11 Jan 2016 02:12:07 +0100 Subject: [PATCH 5/8] Update canvas.class.js --- src/canvas.class.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/canvas.class.js b/src/canvas.class.js index 0a71bb8c938..7b68fab271b 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -943,11 +943,13 @@ while (i--) { if (this._checkTarget(pointer, objects[i])) { target = objects[i]; - this._fireOverOutEvents(target, e); + if (target.type === 'group') { + this._searchPossibleTargets(e, pointer, target._objects); + } break; } } - + this._fireOverOutEvents(target, e); return target; }, From e3748285a46c1e1e558db7ad368324aebe2daed9 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 17 Jan 2016 15:40:56 +0100 Subject: [PATCH 6/8] Update canvas.class.js --- src/canvas.class.js | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/canvas.class.js b/src/canvas.class.js index 7b68fab271b..e17d826adb3 100644 --- a/src/canvas.class.js +++ b/src/canvas.class.js @@ -262,8 +262,14 @@ * @return {Boolean} true if point is contained within an area of given object */ containsPoint: function (pointer, target) { - var xy = this._normalizePointer(target, pointer); + var xy; + if (target.group && target.group === this.getActiveGroup()) { + xy = this._normalizePointer(target.group, pointer); + } + else { + xy = { x: pointer.x, y: pointer.y }; + } // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html return (target.containsPoint(xy) || target._findTargetCorner(pointer)); @@ -273,20 +279,17 @@ * @private */ _normalizePointer: function (object, pointer) { - var group = object.group, - lt, m; + var lt, m; - if (group) { - m = fabric.util.multiplyTransformMatrices( - this.viewportTransform, - group.calcTransformMatrix()); + m = fabric.util.multiplyTransformMatrices( + this.viewportTransform, + object.calcTransformMatrix()); - m = fabric.util.invertTransform(m); - pointer = fabric.util.transformPoint(pointer, m , false); - lt = fabric.util.transformPoint(group.getCenterPoint(), m , false); - pointer.x -= lt.x; - pointer.y -= lt.y; - } + m = fabric.util.invertTransform(m); + pointer = fabric.util.transformPoint(pointer, m , false); + lt = fabric.util.transformPoint(object.getCenterPoint(), m , false); + pointer.x -= lt.x; + pointer.y -= lt.y; return { x: pointer.x, y: pointer.y }; }, @@ -874,6 +877,7 @@ if (this.skipTargetFind) { return; } + this.targets = [ ]; var pointer = this.getPointer(e, true); if (this._isLastRenderedObject(pointer)) { return this.lastRenderedObjectWithControlsAboveOverlay; @@ -884,7 +888,6 @@ if (activeGroup && !skipGroup && this.containsPoint(pointer, activeGroup)) { return activeGroup; } - var target = this._searchPossibleTargets(e, pointer, this._objects); return target; }, @@ -937,14 +940,16 @@ _searchPossibleTargets: function(e, pointer, objects) { // Cache all targets where their bounding box contains point. - var target,i = objects.length; + var target, i = objects.length, normalizedPointer; // Do not check for currently grouped objects, since we check the parent group itself. // untill we call this function specifically to search inside the activeGroup while (i--) { if (this._checkTarget(pointer, objects[i])) { target = objects[i]; + this.targets.push(target); if (target.type === 'group') { - this._searchPossibleTargets(e, pointer, target._objects); + normalizedPointer = this._normalizePointer(target, pointer); + this._searchPossibleTargets(e, normalizedPointer, target._objects); } break; } @@ -1287,3 +1292,4 @@ */ fabric.Element = fabric.Canvas; })(); +s From 51482e31150fb3cb12b4602b386ab51512afcdb1 Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 17 Jan 2016 15:42:59 +0100 Subject: [PATCH 7/8] Update canvas_events.mixin.js --- src/mixins/canvas_events.mixin.js | 32 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/mixins/canvas_events.mixin.js b/src/mixins/canvas_events.mixin.js index 5e221e10241..89e942bef30 100644 --- a/src/mixins/canvas_events.mixin.js +++ b/src/mixins/canvas_events.mixin.js @@ -271,10 +271,8 @@ if (target) { target.isMoving = false; } - - shouldRender && this.renderAll(); - this._handleCursorAndEvent(e, target); + shouldRender && this.renderAll(); }, _handleCursorAndEvent: function(e, target) { @@ -287,7 +285,9 @@ }, 50); this.fire('mouse:up', { target: target, e: e }); - target && target.fire('mouseup', { e: e }); + for (var i = 0; i < this.targets.length; i++) { + this.targets[i].fire('mouseup', { e: e }) + } }, /** @@ -352,8 +352,8 @@ this.fire('mouse:down', { e: e }); var target = this.findTarget(e); - if (typeof target !== 'undefined') { - target.fire('mousedown', { e: e, target: target }); + for (var i = 0; i < this.targets.length; i++) { + this.targets[i].fire('mousedown', { e: e }) } }, @@ -371,8 +371,8 @@ this.fire('mouse:move', { e: e }); var target = this.findTarget(e); - if (typeof target !== 'undefined') { - target.fire('mousemove', { e: e, target: target }); + for (var i = 0; i < this.targets.length; i++) { + this.targets[i].fire('mousemove', { e: e }) } }, @@ -389,8 +389,8 @@ this.fire('mouse:up', { e: e }); var target = this.findTarget(e); - if (typeof target !== 'undefined') { - target.fire('mouseup', { e: e, target: target }); + for (var i = 0; i < this.targets.length; i++) { + this.targets[i].fire('mouseup', { e: e }) } }, @@ -422,7 +422,6 @@ var target = this.findTarget(e), pointer = this.getPointer(e, true); - // save pointer for check in __onMouseUp event this._previousPointer = pointer; @@ -441,11 +440,12 @@ this._beforeTransform(e, target); this._setupCurrentTransform(e, target); } - // we must renderAll so that active image is placed on the top canvas - shouldRender && this.renderAll(); this.fire('mouse:down', { target: target, e: e }); - target && target.fire('mousedown', { e: e }); + for (var i = 0; i < this.targets.length; i++) { + this.targets[i].fire('mousedown', { e: e }) + } + shouldRender && this.renderAll(); }, /** @@ -572,7 +572,9 @@ } this.fire('mouse:move', { target: target, e: e }); - target && target.fire('mousemove', { e: e }); + for (var i = 0; i < this.targets.length; i++) { + this.targets[i].fire('mousemove', { e: e }) + } }, /** From 42beee726c6131ceb0a0dcd4b672ef789b5c007b Mon Sep 17 00:00:00 2001 From: Andrea Bogazzi Date: Sun, 17 Jan 2016 15:43:34 +0100 Subject: [PATCH 8/8] Update object_geometry.mixin.js --- src/mixins/object_geometry.mixin.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mixins/object_geometry.mixin.js b/src/mixins/object_geometry.mixin.js index a7abe20b795..8012735e229 100644 --- a/src/mixins/object_geometry.mixin.js +++ b/src/mixins/object_geometry.mixin.js @@ -87,6 +87,9 @@ * @return {Boolean} true if point is inside the object */ containsPoint: function(point) { + if (!this.oCoords) { + this.setCoords(); + } var lines = this._getImageLines(this.oCoords), xPoints = this._findCrossPoints(point, lines);