mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-08 22:01:58 -05:00
18572276c5
Make sure items are considered selected right away if they are part of the DOM, even before they are getting drawn for the first time.
116 lines
2.9 KiB
JavaScript
116 lines
2.9 KiB
JavaScript
/*
|
|
* Paper.js
|
|
*
|
|
* This file is part of Paper.js, a JavaScript Vector Graphics Library,
|
|
* based on Scriptographer.org and designed to be largely API compatible.
|
|
* http://paperjs.org/
|
|
* http://scriptographer.org/
|
|
*
|
|
* Copyright (c) 2011, 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# */{
|
|
_type: '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.
|
|
*
|
|
* @param {Item[]} [children] An array of items that will be added to the
|
|
* newly created layer.
|
|
*
|
|
* @example
|
|
* var layer = new Layer();
|
|
*/
|
|
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._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)
|
|
};
|
|
});
|