From eecc65d256a65cfc0ab2809671fdc915c79eb046 Mon Sep 17 00:00:00 2001 From: Martin Stamm Date: Tue, 30 Nov 2021 16:33:31 +0100 Subject: [PATCH] feat(canvas): allow passing planes descriptors --- lib/core/Canvas.js | 39 ++++++++++++++++++++---------------- test/spec/core/CanvasSpec.js | 38 ++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/lib/core/Canvas.js b/lib/core/Canvas.js index 2c27b1fba..b116fbcd7 100644 --- a/lib/core/Canvas.js +++ b/lib/core/Canvas.js @@ -369,38 +369,43 @@ Canvas.prototype.getPlane = function(name) { * Creates a plane that is used to draw elements on it. If no * root element is provided, an implicit root will be used. * - * @param {string} name + * @param {string|Object} plane * @param {Object|djs.model.Root} [rootElement] optional root element * * @return {Object} plane descriptor with { layer, rootElement, name } */ -Canvas.prototype.createPlane = function(name, rootElement) { - if (!name) { +Canvas.prototype.createPlane = function(plane, rootElement) { + if (!plane) { throw new Error('must specify a name'); } - if (this._planes[name]) { - throw new Error('plane <' + name + '> already exists'); + if (this._planes[plane] || this._planes[plane.name]) { + throw new Error('plane <' + plane + '> already exists'); + } + + if (typeof plane === 'string') { + plane = { name: plane }; } - if (!rootElement) { - rootElement = { - id: '__implicitroot' + name, + if (!plane.layer) { + var svgLayer = this.getLayer(plane.name, PLANE_LAYER_INDEX); + svgAttr(svgLayer, 'display', 'none'); + + plane.layer = svgLayer; + } + + if (!plane.rootElement) { + rootElement = rootElement || { + id: '__implicitroot' + plane.name, children: [], isImplicit: true }; - } - var svgLayer = this.getLayer(name, PLANE_LAYER_INDEX); - svgAttr(svgLayer, 'display', 'none'); - var plane = this._planes[name] = { - layer: svgLayer, - name: name, - rootElement: null - }; + this.setRootElementForPlane(rootElement, plane); + } - this.setRootElementForPlane(rootElement, plane); + this._planes[plane.name] = plane; return plane; }; diff --git a/test/spec/core/CanvasSpec.js b/test/spec/core/CanvasSpec.js index 2514d79e2..2f287dedc 100644 --- a/test/spec/core/CanvasSpec.js +++ b/test/spec/core/CanvasSpec.js @@ -2413,7 +2413,43 @@ describe('Canvas', function() { // when canvas.renamePlane(plane); - }).to.throw('must specify a name'); + }).to.throw('must specify a plane'); + })); + + + it('should accept a plane descriptor', inject(function(canvas) { + + // given + var plane = { + name: 'a', + rootElement: { id: 'root' }, + layer: canvas.getLayer('a') + }; + + // when + canvas.createPlane(plane); + + // then + expect(canvas.getPlane('a')).to.exist; + expect(canvas.getPlane('a')).to.equal(plane); + })); + + + it('should fill missing plane attributes', inject(function(canvas) { + + // given + var plane = { + name: 'a' + }; + + // when + canvas.createPlane(plane); + + // then + expect(canvas.getPlane('a')).to.exist; + expect(canvas.getPlane('a')).to.equal(plane); + expect(plane.rootElement).to.exist; + expect(plane.layer).to.exist; }));