mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-30 04:20:23 +00:00
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:
parent
a528a1e7b4
commit
afdb6b511f
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user