Fix all commands using uniqueCels() (sprite size, rotate/flip sprite, etc.)

We have to iterate all layers on commands that modify the whole
sprite. It doesn't matter if the layer is "browsable" (e.g. it's
expanded or collapsed).
This commit is contained in:
David Capello 2016-12-08 09:11:54 -03:00
parent a528a1e7b4
commit afdb6b511f
8 changed files with 70 additions and 14 deletions

View File

@ -48,7 +48,7 @@ protected:
if (m_offset > 0) {
int i = m_offset;
while (i-- > 0) {
layer = layer->getNextInWholeHierarchy();
layer = layer->getNextBrowsable();
if (!layer)
layer = site.sprite()->firstBrowsableLayer();
}
@ -56,7 +56,7 @@ protected:
else if (m_offset < 0) {
int i = m_offset;
while (i++ < 0) {
layer = layer->getPreviousInWholeHierarchy();
layer = layer->getPreviousBrowsable();
if (!layer)
layer = site.sprite()->root()->lastLayer();
}

View File

@ -495,7 +495,7 @@ Layer* DocumentApi::duplicateLayerAfter(Layer* sourceLayer, LayerGroup* parent,
Layer* DocumentApi::duplicateLayerBefore(Layer* sourceLayer, LayerGroup* parent, Layer* beforeLayer)
{
ASSERT(parent);
Layer* afterThis = (beforeLayer ? beforeLayer->getPreviousInWholeHierarchy(): nullptr);
Layer* afterThis = (beforeLayer ? beforeLayer->getPreviousBrowsable(): nullptr);
Layer* newLayer = duplicateLayerAfter(sourceLayer, parent, afterThis);
if (newLayer)
restackLayerBefore(newLayer, parent, beforeLayer);

View File

@ -127,7 +127,7 @@ void DocumentRange::selectLayerRange(Layer* fromLayer, Layer* toLayer)
goNext = true;
break;
}
it = it->getNextInWholeHierarchy();
it = it->getNextBrowsable();
}
if (!goNext) {
@ -137,7 +137,7 @@ void DocumentRange::selectLayerRange(Layer* fromLayer, Layer* toLayer)
goPrev = true;
break;
}
it = it->getPreviousInWholeHierarchy();
it = it->getPreviousBrowsable();
}
}
}
@ -149,9 +149,9 @@ void DocumentRange::selectLayerRange(Layer* fromLayer, Layer* toLayer)
break;
if (goNext)
it = it->getNextInWholeHierarchy();
it = it->getNextBrowsable();
else if (goPrev)
it = it->getPreviousInWholeHierarchy();
it = it->getPreviousBrowsable();
else
break;
} while (it);

View File

@ -357,7 +357,7 @@ void paste()
DocumentRange dstRange;
dstRange.startRange(dstLayer, dstFrameFirst, DocumentRange::kCels);
for (layer_t i=1; i<srcRange.layers(); ++i) {
dstLayer = dstLayer->getPreviousInWholeHierarchy();
dstLayer = dstLayer->getPreviousBrowsable();
if (dstLayer == nullptr)
break;
}

View File

@ -41,7 +41,7 @@ CelsRange::iterator::iterator(const Sprite* sprite,
, m_flags(flags)
{
// Get first cel
Layer* layer = sprite->root()->firstLayer();
Layer* layer = sprite->root()->firstLayerInWholeHierarchy();
while (layer && !m_cel) {
if (layer->isImage()) {
m_frameIterator = m_selFrames.begin();

View File

@ -74,7 +74,7 @@ Layer* Layer::getNext() const
return nullptr;
}
Layer* Layer::getPreviousInWholeHierarchy() const
Layer* Layer::getPreviousBrowsable() const
{
// Go to children
if (isBrowsable())
@ -93,12 +93,52 @@ Layer* Layer::getPreviousInWholeHierarchy() const
return parent->getPrevious();
}
Layer* Layer::getNextBrowsable() const
{
// Go to next layer
if (Layer* next = getNext()) {
// Go to children
while (next->isBrowsable()) {
Layer* firstChild = static_cast<const LayerGroup*>(next)->firstLayer();
if (!firstChild)
break;
next = firstChild;
}
return next;
}
// Go to parent
if (m_sprite && parent() != m_sprite->root())
return m_parent;
return nullptr;
}
Layer* Layer::getPreviousInWholeHierarchy() const
{
// Go to children
if (isGroup() && static_cast<const LayerGroup*>(this)->layersCount() > 0)
return static_cast<const LayerGroup*>(this)->lastLayer();
// Go to previous layer
if (Layer* prev = getPrevious())
return prev;
// Go to previous layer in the parent
LayerGroup* parent = this->parent();
while (parent != sprite()->root() &&
!parent->getPrevious()) {
parent = parent->parent();
}
return parent->getPrevious();
}
Layer* Layer::getNextInWholeHierarchy() const
{
// Go to next layer
if (Layer* next = getNext()) {
// Go to children
while (next->isBrowsable()) {
while (next->isGroup() && static_cast<const LayerGroup*>(next)->layersCount() > 0) {
Layer* firstChild = static_cast<const LayerGroup*>(next)->firstLayer();
if (!firstChild)
break;
@ -357,6 +397,18 @@ int LayerGroup::getMemSize() const
return size;
}
Layer* LayerGroup::firstLayerInWholeHierarchy() const
{
Layer* layer = firstLayer();
if (layer) {
while (layer->isGroup() &&
static_cast<LayerGroup*>(layer)->layersCount() > 0) {
layer = static_cast<LayerGroup*>(layer)->firstLayer();
}
}
return layer;
}
void LayerGroup::allLayers(LayerList& list) const
{
for (Layer* child : m_layers) {

View File

@ -62,6 +62,9 @@ namespace doc {
Layer* getPrevious() const;
Layer* getNext() const;
Layer* getPreviousBrowsable() const;
Layer* getNextBrowsable() const;
Layer* getPreviousInWholeHierarchy() const;
Layer* getNextInWholeHierarchy() const;
@ -187,6 +190,7 @@ namespace doc {
void stackLayer(Layer* layer, Layer* after);
Layer* firstLayer() const { return (m_layers.empty() ? nullptr: m_layers.front()); }
Layer* firstLayerInWholeHierarchy() const;
Layer* lastLayer() const { return (m_layers.empty() ? nullptr: m_layers.back()); }
void allLayers(LayerList& list) const;

View File

@ -62,7 +62,7 @@ LayerList SelectedLayers::toLayerList() const
for (Layer* layer = (*begin())->sprite()->firstBrowsableLayer();
layer != nullptr;
layer = layer->getNextInWholeHierarchy()) {
layer = layer->getNextBrowsable()) {
if (contains(layer))
output.push_back(layer);
}
@ -114,11 +114,11 @@ retry:;
if (layerDelta > 0) {
for (layer_t i=0; layer && i<layerDelta; ++i)
layer = layer->getNextInWholeHierarchy();
layer = layer->getNextBrowsable();
}
else if (layerDelta < 0) {
for (layer_t i=0; layer && i>layerDelta; --i) {
layer = layer->getPreviousInWholeHierarchy();
layer = layer->getPreviousBrowsable();
}
}