/* * Paper.js - The Swiss Army Knife of Vector Graphics Scripting. * http://paperjs.org/ * * Copyright (c) 2011 - 2013, Juerg Lehni & Jonathan Puckey * http://lehni.org/ & http://jonathanpuckey.com/ * * Distributed under the MIT license. See LICENSE file for details. * * All rights reserved. */ /** * @name Layer * * @class The Layer item represents a layer in a Paper.js project. * * The layer which is currently active can be accessed through * {@link Project#activeLayer}. * An array of all layers in a project can be accessed through * {@link Project#layers}. * * @extends Group */ var Layer = this.Layer = Group.extend(/** @lends Layer# */{ _class: 'Layer', // DOCS: improve constructor code example. /** * Creates a new Layer item and places it at the end of the * {@link Project#layers} array. The newly created layer will be activated, * so all newly created items will be placed within it. * * @name Layer#initialize * @param {Item[]} [children] An array of items that will be added to the * newly created layer. * * @example * var layer = new Layer(); */ /** * Creates a new Layer item and places it at the end of the * {@link Project#layers} array. The newly created layer will be activated, * so all newly created items will be placed within it. * * @param {Object} object An object literal containing properties to * be set on the layer. * * @example {@paperscript} * var path = new Path([100, 100], [100, 200]); * var path2 = new Path([50, 150], [150, 150]); * * // Create a layer. The properties in the object literal * // are set on the newly created layer. * var layer = new Layer({ * children: [path, path2], * strokeColor: 'black', * position: view.center * }); */ initialize: function(items) { this._project = paper.project; // Push it onto project.layers and set index: this._index = this._project.layers.push(this) - 1; this.base.apply(this, arguments); this.activate(); }, /** * Removes the layer from its project's layers list * or its parent's children list. */ _remove: function(notify) { if (this._parent) return this.base(notify); if (this._index != null) { Base.splice(this._project.layers, null, this._index, 1); // Tell project we need a redraw. This is similar to _changed() // mechanism. this._project._needsRedraw(); return true; } return false; }, getNextSibling: function() { return this._parent ? this.base() : this._project.layers[this._index + 1] || null; }, getPreviousSibling: function() { return this._parent ? this.base() : this._project.layers[this._index - 1] || null; }, isInserted: function() { return this._parent ? this.base() : this._index != null; }, /** * Activates the layer. * * @example * var firstLayer = project.activeLayer; * var secondLayer = new Layer(); * console.log(project.activeLayer == secondLayer); // true * firstLayer.activate(); * console.log(project.activeLayer == firstLayer); // true */ activate: function() { this._project.activeLayer = this; } }, new function () { function insert(above) { return function(item) { // If the item is a layer and contained within Project#layers, use // our own version of move(). if (item instanceof Layer && !item._parent && this._remove(true)) { Base.splice(item._project.layers, [this], item._index + (above ? 1 : 0), 0); this._setProject(item._project); return true; } return this.base(item); }; } return { insertAbove: insert(true), insertBelow: insert(false) }; });