Have #_removeFromParent() handle deselection and change notification.

This commit is contained in:
Jürg Lehni 2011-06-19 17:30:47 +01:00
parent 9d2f8c5035
commit 4eb6d78f1f
2 changed files with 25 additions and 11 deletions

View file

@ -665,7 +665,7 @@ var Item = this.Item = Base.extend({
*/ */
insertChild: function(index, item) { insertChild: function(index, item) {
if (this._children) { if (this._children) {
item._removeFromParent(); item._removeFromParent(false, true);
Base.splice(this._children, [item], index, 0); Base.splice(this._children, [item], index, 0);
item._parent = this; item._parent = this;
item._setProject(this._project); item._setProject(this._project);
@ -773,11 +773,16 @@ var Item = this.Item = Base.extend({
/** /**
* Removes the item from its parent's children list. * Removes the item from its parent's children list.
*/ */
_removeFromParent: function() { _removeFromParent: function(deselect, notify) {
if (this._parent) { if (this._parent) {
if (deselect)
this.setSelected(false);
if (this._name) if (this._name)
this._removeFromNamed(); this._removeFromNamed();
Base.splice(this._parent._children, null, this._index, 1); Base.splice(this._parent._children, null, this._index, 1);
// Notify parent of changed hierarchy
if (notify)
this._parent._changed(ChangeFlags.HIERARCHY);
this._parent = null; this._parent = null;
return true; return true;
} }
@ -791,9 +796,7 @@ var Item = this.Item = Base.extend({
* @return {Boolean} {@true the item was removed} * @return {Boolean} {@true the item was removed}
*/ */
remove: function() { remove: function() {
if (this.isSelected()) return this._removeFromParent(true, true);
this.setSelected(false);
return this._removeFromParent();
}, },
/** /**
@ -823,7 +826,9 @@ var Item = this.Item = Base.extend({
to = Base.pick(to, this._children.length); to = Base.pick(to, this._children.length);
var removed = this._children.splice(from, to - from); var removed = this._children.splice(from, to - from);
for (var i = removed.length - 1; i >= 0; i--) for (var i = removed.length - 1; i >= 0; i--)
removed[i].remove(); removed[i]._removeFromParent(true, false);
if (removed.length > 0)
this._changed(ChangeFlags.HIERARCHY);
return removed; return removed;
}, },

View file

@ -53,9 +53,17 @@ var Layer = this.Layer = Group.extend({
* Removes the layer from its project's layers list * Removes the layer from its project's layers list
* or its parent's children list. * or its parent's children list.
*/ */
_removeFromParent: function() { _removeFromParent: function(deselect, notify) {
return this._parent ? this.base() if (this._parent)
: !!Base.splice(this._project.layers, null, this._index, 1).length; return this.base(deselect, notify);
if (this._index != null) {
if (deselect)
this.setSelected(false);
Base.splice(this._project.layers, null, this._index, 1);
// TODO: If notify == true, notify project of hierarchy change
return true;
}
return false;
}, },
getNextSibling: function() { getNextSibling: function() {
@ -83,9 +91,10 @@ var Layer = this.Layer = Group.extend({
}, new function () { }, new function () {
function move(above) { function move(above) {
return function(item) { return function(item) {
// if the item is a layer and contained within Project#layers // If the item is a layer and contained within Project#layers, use
// our own version of move().
if (item instanceof Layer && !item._parent if (item instanceof Layer && !item._parent
&& this._removeFromParent()) { && this._removeFromParent(false, true)) {
Base.splice(item._project.layers, [this], Base.splice(item._project.layers, [this],
item._index + (above ? 1 : -1), 0); item._index + (above ? 1 : -1), 0);
this._setProject(item._project); this._setProject(item._project);