mirror of
https://github.com/Hopiu/fabric.js.git
synced 2026-05-05 20:34:45 +00:00
parent
dd6cbe93a2
commit
2c2111ebe3
2 changed files with 57 additions and 31 deletions
|
|
@ -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;
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue