On shift select and multiselection, check for onSelect callback (#5348)

* add onSelect on the grouping logic

* added test for group selector

* another test
This commit is contained in:
Andrea Bogazzi 2018-10-28 22:06:39 +01:00 committed by GitHub
parent 847fe90c4b
commit 8115d6969f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 4 deletions

View file

@ -14,7 +14,7 @@
_shouldGroup: function(e, target) {
var activeObject = this._activeObject;
return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&
(activeObject !== target || activeObject.type === 'activeSelection');
(activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });
},
/**
@ -24,6 +24,7 @@
*/
_handleGrouping: function (e, target) {
var activeObject = this._activeObject;
// avoid multi select when shift click on a corner
if (activeObject.__corner) {
return;
}
@ -96,7 +97,7 @@
*/
_groupSelectedObjects: function (e) {
var group = this._collectObjects(),
var group = this._collectObjects(e),
aGroup;
// do not create group for 1 element only
@ -114,7 +115,7 @@
/**
* @private
*/
_collectObjects: function() {
_collectObjects: function(e) {
var group = [],
currentObject,
x1 = this._groupSelector.ex,
@ -129,7 +130,7 @@
for (var i = this._objects.length; i--; ) {
currentObject = this._objects[i];
if (!currentObject || !currentObject.selectable || !currentObject.visible) {
if (!currentObject || !currentObject.selectable || !currentObject.visible || currentObject.onSelect({ e: e })) {
continue;
}

View file

@ -573,6 +573,67 @@
canvas.selectionFullyContained = false;
});
QUnit.test('_collectObjects does not collect objects that have onSelect returning true', function(assert) {
canvas.selectionFullyContained = false;
var rect1 = new fabric.Rect({ width: 10, height: 10, top: 2, left: 2 });
rect1.onSelect = function() {
return true;
};
var rect2 = new fabric.Rect({ width: 10, height: 10, top: 2, left: 2 });
canvas.add(rect1, rect2);
canvas._groupSelector = {
top: 20,
left: 20,
ex: 1,
ey: 1
};
var collected = canvas._collectObjects();
assert.equal(collected.length, 1, 'objects are in the same position buy only one gets selected');
assert.equal(collected[0], rect2, 'contains rect2 but not rect 1');
});
QUnit.test('_shouldGroup return false if onSelect return true', function(assert) {
var rect = new fabric.Rect();
var rect2 = new fabric.Rect();
rect.onSelect = function() {
return true;
};
canvas._activeObject = rect2;
var selectionKey = canvas.selectionKey;
var event = {};
event[selectionKey] = true;
var returned = canvas._shouldGroup(event, rect);
assert.equal(returned, false, 'if onSelect returns true, shouldGroup return false');
});
QUnit.test('_shouldGroup return true if onSelect return false and selectionKey is true', function(assert) {
var rect = new fabric.Rect();
var rect2 = new fabric.Rect();
rect.onSelect = function() {
return false;
};
canvas._activeObject = rect2;
var selectionKey = canvas.selectionKey;
var event = {};
event[selectionKey] = true;
var returned = canvas._shouldGroup(event, rect);
assert.equal(returned, true, 'if onSelect returns false, shouldGroup return true');
});
QUnit.test('_shouldGroup return false if selectionKey is false', function(assert) {
var rect = new fabric.Rect();
var rect2 = new fabric.Rect();
rect.onSelect = function() {
return false;
};
canvas._activeObject = rect2;
var selectionKey = canvas.selectionKey;
var event = {};
event[selectionKey] = false;
var returned = canvas._shouldGroup(event, rect);
assert.equal(returned, false, 'shouldGroup return false');
});
QUnit.test('_fireSelectionEvents fires multiple things', function(assert) {
var rect1Deselected = false;
var rect3Selected = false;