Normalize selection events (#4340)

* different object managment
This commit is contained in:
Andrea Bogazzi 2017-09-25 15:14:15 -04:00 committed by GitHub
parent dd6cbe93a2
commit 2c2111ebe3
2 changed files with 57 additions and 31 deletions

View file

@ -17,11 +17,12 @@
* @see {@link fabric.Canvas#initialize} for constructor definition
*
* @fires object:added
* @fires object:removed
* @fires object:modified
* @fires object:rotating
* @fires object:scaling
* @fires object:moving
* @fires object:selected
* @fires object:selected this event is deprecated. use selection:created
*
* @fires before:selection:cleared
* @fires selection:cleared
@ -1395,6 +1396,46 @@
this.callSuper('_onObjectRemoved', obj);
},
/**
* @private
* Compares the old activeObject with the current one and fires correct events
* @param {fabric.Object} obj old activeObject
*/
_fireSelectionEvents: function(oldObjects, e) {
var somethingChanged = false, objects = this.getActiveObjects(),
added = [], removed = [], opt = { e: e };
oldObjects.forEach(function(oldObject) {
if (objects.indexOf(oldObject) === -1) {
somethingChanged = true;
oldObject.fire('deselected', opt);
removed.push(oldObject);
}
});
objects.forEach(function(object) {
if (oldObjects.indexOf(object) === -1) {
somethingChanged = true;
object.fire('selected', opt);
added.push(object);
}
});
if (oldObjects.length > 0 && objects.length > 0) {
opt.selected = added;
opt.deselected = removed;
somethingChanged && this.fire('selection:updated', opt);
}
else if (objects.length > 0) {
if (objects.length === 1) {
this.fire('object:selected', opt);
}
opt.selected = added;
this.fire('selection:created', opt);
}
else if (oldObjects.length > 0) {
opt.deselected = removed;
this.fire('selection:cleared', opt);
}
},
/**
* Sets given object as the only active object on canvas
* @param {fabric.Object} object Object to set as an active one
@ -1403,15 +1444,9 @@
* @chainable
*/
setActiveObject: function (object, e) {
var currentActiveObject = this._activeObject;
if (object === currentActiveObject) {
return this;
}
if (this._setActiveObject(object, e)) {
currentActiveObject && currentActiveObject.fire('deselected', { e: e });
this.fire('object:selected', { target: object, e: e });
object.fire('selected', { e: e });
}
var currentActives = this.getActiveObjects();
this._setActiveObject(object, e);
this._fireSelectionEvents(currentActives, e);
return this;
},
@ -1460,14 +1495,12 @@
* @chainable
*/
discardActiveObject: function (e) {
var activeObject = this._activeObject;
if (activeObject) {
this.fire('before:selection:cleared', { target: activeObject, e: e });
if (this._discardActiveObject(e)) {
this.fire('selection:cleared', { e: e, target: activeObject });
activeObject.fire('deselected', { e: e });
}
var currentActives = this.getActiveObjects();
if (currentActives.length) {
this.fire('before:selection:cleared', { target: currentActives[0], e: e });
}
this._discardActiveObject(e);
this._fireSelectionEvents(currentActives, e);
return this;
},

View file

@ -47,34 +47,31 @@
* @private
*/
_updateActiveSelection: function(target, e) {
var activeSelection = this._activeObject;
var activeSelection = this._activeObject,
currentActiveObjects = activeSelection._objects.slice(0);
if (activeSelection.contains(target)) {
activeSelection.removeWithUpdate(target);
target.fire('deselected', { e: e });
this._hoveredTarget = target;
if (activeSelection.size() === 1) {
// activate last remaining object
this.setActiveObject(activeSelection.item(0), e);
return;
this._setActiveObject(activeSelection.item(0), e);
}
}
else {
activeSelection.addWithUpdate(target);
target.fire('selected', { e: e });
this._hoveredTarget = activeSelection;
}
this.fire('selection:updated', { target: activeSelection, e: e, updated: target });
this._fireSelectionEvents(currentActiveObjects, e);
},
/**
* @private
*/
_createActiveSelection: function(target, e) {
var group = this._createGroup(target);
var currentActives = this.getActiveObjects(), group = this._createGroup(target);
this._hoveredTarget = group;
this.setActiveObject(group, e);
target.fire('selected', { e: e });
this.fire('selection:created', { target: group, e: e });
this._setActiveObject(group, e);
this._fireSelectionEvents(currentActives, e);
},
/**
@ -110,11 +107,7 @@
aGroup = new fabric.ActiveSelection(group.reverse(), {
canvas: this
});
group.forEach(function(object) {
object.fire('selected', { e: e });
});
this.setActiveObject(aGroup, e);
this.fire('selection:created', { target: aGroup, e: e });
}
},