From d2b146c21cea02d5c74470eda172d597f40b9bdf Mon Sep 17 00:00:00 2001 From: Joe Rozek Date: Thu, 4 Sep 2014 10:53:34 -0700 Subject: [PATCH] support for preserving object stacking --- .gitignore | 1 + src/static_canvas.class.js | 20 ++++++++++++++++++-- test/unit/canvas_static.js | 5 +++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 06b77a9a..1356683f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +*.iml /node_modules/ /npm-debug.log before_commit diff --git a/src/static_canvas.class.js b/src/static_canvas.class.js index 8b934cc3..c976dd08 100644 --- a/src/static_canvas.class.js +++ b/src/static_canvas.class.js @@ -133,6 +133,13 @@ */ imageSmoothingEnabled: true, + /** + * Indicates whether objects should remain in current stack position when selected. When false objects are brought to top and rendered as part of the selection group + * @type Boolean + * @default + */ + preserveObjectStacking: false, + /** * The transformation (in the format of Canvas transform) which focuses the viewport * @type Array @@ -702,13 +709,22 @@ ctx.save(); var v = this.viewportTransform; ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - object.render(ctx); + if (this._shouldRenderObject(object)) { + object.render(ctx); + } ctx.restore(); if (!this.controlsAboveOverlay) { object._renderControls(ctx); } }, + _shouldRenderObject: function(object) { + if (!object) { + return false; + } + return (object !== this.getActiveGroup() || !this.preserveObjectStacking); + }, + /** * @private * @param {fabric.Object} obj Object that was added @@ -830,7 +846,7 @@ var i, length; // fast path - if (!activeGroup) { + if (!activeGroup || this.preserveObjectStacking) { for (i = 0, length = this._objects.length; i < length; ++i) { this._draw(ctx, this._objects[i]); } diff --git a/test/unit/canvas_static.js b/test/unit/canvas_static.js index 87114c02..b53ac28a 100644 --- a/test/unit/canvas_static.js +++ b/test/unit/canvas_static.js @@ -421,6 +421,11 @@ equal(canvas, canvas.renderAll()); }); + test('preserveObjectStacking', function() { + ok(typeof canvas.preserveObjectStacking == 'boolean'); + ok(!canvas.preserveObjectStacking); + }); + test('renderTop', function() { ok(typeof canvas.renderTop == 'function'); equal(canvas, canvas.renderTop());