diff --git a/src/shapes/group.class.js b/src/shapes/group.class.js index ee5de529fb0..4a15354ab78 100644 --- a/src/shapes/group.class.js +++ b/src/shapes/group.class.js @@ -47,9 +47,12 @@ * @param {Object} [options] Options object * @return {Object} thisArg */ - initialize: function(objects, options) { + initialize: function(objects, options, skipPropagation) { options = options || { }; + this._objects = []; + skipPropagation && this.callSuper('initialize', options); + this._objects = objects || []; for (var i = this._objects.length; i--; ) { this._objects[i].group = this; @@ -60,15 +63,22 @@ if (options.originX) { this.originX = options.originX; } - if (options.originY) { this.originY = options.originY; } - this._calcBounds(); - this._updateObjectsCoords(); - - this.callSuper('initialize', options); + if (!skipPropagation) { + this._calcBounds(); + this._updateObjectsCoords(); + this.callSuper('initialize', options); + } + else { + for (i = this._objects.length; i--; ) { + this._objects[i].setCoords(); + this._objects[i].__origHasControls = this._objects[i].hasControls; + this._objects[i].hasControls = false; + } + } this.setCoords(); this.saveCoords(); @@ -548,7 +558,7 @@ fabric.Group.fromObject = function(object, callback) { fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { delete object.objects; - callback && callback(new fabric.Group(enlivenedObjects, object)); + callback && callback(new fabric.Group(enlivenedObjects, object, true)); }); }; diff --git a/test/unit/group.js b/test/unit/group.js index e5a0541adb8..548e4d98bbb 100644 --- a/test/unit/group.js +++ b/test/unit/group.js @@ -13,6 +13,13 @@ return new fabric.Group([ rect1, rect2 ], {strokeWidth: 0}); } + function makeGroupWith2ObjectsWithOpacity() { + var rect1 = new fabric.Rect({ top: 100, left: 100, width: 30, height: 10, strokeWidth: 0, opacity: 0.5 }), + rect2 = new fabric.Rect({ top: 120, left: 50, width: 10, height: 40, strokeWidth: 0, opacity: 0.8 }); + + return new fabric.Group([ rect1, rect2 ], {strokeWidth: 0}); + } + function makeGroupWith4Objects() { var rect1 = new fabric.Rect({ top: 100, left: 100, width: 30, height: 10 }), rect2 = new fabric.Rect({ top: 120, left: 50, width: 10, height: 40 }), @@ -361,7 +368,7 @@ test('toObject without default values', function() { }); asyncTest('fromObject', function() { - var group = makeGroupWith2Objects(); + var group = makeGroupWith2ObjectsWithOpacity(); ok(typeof fabric.Group.fromObject == 'function'); var groupObject = group.toObject(); @@ -373,6 +380,9 @@ test('toObject without default values', function() { ok(newGroupFromObject instanceof fabric.Group); + deepEqual(objectFromOldGroup.objects[0], objectFromNewGroup.objects[0]); + deepEqual(objectFromOldGroup.objects[1], objectFromNewGroup.objects[1]); + // delete `objects` arrays, since `assertHashEqual` fails to compare them for equality delete objectFromOldGroup.objects; delete objectFromNewGroup.objects;