Add static methods to copy a layer

This commit is contained in:
Martín Capello 2024-09-10 18:02:22 -03:00
parent 220254158f
commit b110078a8b
3 changed files with 44 additions and 18 deletions

View File

@ -697,27 +697,15 @@ void DocApi::restackLayerBefore(Layer* layer, LayerGroup* parent, Layer* beforeT
Layer* DocApi::duplicateLayerAfter(Layer* sourceLayer, LayerGroup* parent, Layer* afterLayer)
{
ASSERT(parent);
std::unique_ptr<Layer> newLayerPtr;
Layer* newLayerPtr = Layer::MakeCopy(sourceLayer);
if (sourceLayer->isTilemap()) {
newLayerPtr.reset(new LayerTilemap(sourceLayer->sprite(),
static_cast<LayerTilemap*>(sourceLayer)->tilesetIndex()));
}
else if (sourceLayer->isImage())
newLayerPtr.reset(new LayerImage(sourceLayer->sprite()));
else if (sourceLayer->isGroup())
newLayerPtr.reset(new LayerGroup(sourceLayer->sprite()));
else
throw std::runtime_error("Invalid layer type");
m_document->copyLayerContent(sourceLayer, m_document, newLayerPtr.get());
m_document->copyLayerContent(sourceLayer, m_document, newLayerPtr);
newLayerPtr->setName(newLayerPtr->name() + " Copy");
addLayer(parent, newLayerPtr.get(), afterLayer);
addLayer(parent, newLayerPtr, afterLayer);
// Release the pointer as it is owned by the sprite now.
return newLayerPtr.release();
return newLayerPtr;
}
Layer* DocApi::duplicateLayerBefore(Layer* sourceLayer, LayerGroup* parent, Layer* beforeLayer)

View File

@ -14,8 +14,10 @@
#include "doc/cel.h"
#include "doc/grid.h"
#include "doc/image.h"
#include "doc/layer_tilemap.h"
#include "doc/primitives.h"
#include "doc/sprite.h"
#include "doc/tilesets.h"
#include <algorithm>
#include <cstring>
@ -43,6 +45,39 @@ Layer::~Layer()
{
}
// static
Layer* Layer::MakeCopy(doc::Layer* layer)
{
return MakeCopyWithSprite(layer, layer->sprite());
}
// static
Layer* Layer::MakeCopyWithSprite(doc::Layer* layer, doc::Sprite* sprite)
{
std::unique_ptr<doc::Layer> clone;
if (layer->isTilemap()) {
auto* srcTilemap = static_cast<LayerTilemap*>(layer);
tileset_index tilesetIndex = srcTilemap->tilesetIndex();
// If the caller is trying to make a copy of a tilemap layer specifying a
// different sprite as its owner, then we must copy the tilesets of the
// given tilemap layer into the new owner.
if (sprite != srcTilemap->sprite()) {
auto* srcTilesetCopy = Tileset::MakeCopyCopyingImages(srcTilemap->tileset());
tilesetIndex = sprite->tilesets()->add(srcTilesetCopy);
}
clone.reset(new LayerTilemap(sprite, tilesetIndex));
}
else if (layer->isImage())
clone.reset(new LayerImage(sprite));
else if (layer->isGroup())
clone.reset(new LayerGroup(sprite));
else
throw std::runtime_error("Invalid layer type");
return clone.release();
}
int Layer::getMemSize() const
{
return sizeof(Layer);

View File

@ -58,6 +58,9 @@ namespace doc {
public:
virtual ~Layer();
static Layer* MakeCopy(doc::Layer* layer);
static Layer* MakeCopyWithSprite(doc::Layer* layer, doc::Sprite* sprite);
virtual int getMemSize() const override;
const std::string& name() const { return m_name; }
@ -144,7 +147,7 @@ namespace doc {
BlendMode m_blendmode;
int m_opacity;
// Disable assigment
Layer& operator=(const Layer& other);
};
@ -183,7 +186,7 @@ namespace doc {
private:
void destroyAllCels();
CelList m_cels; // List of all cels inside this layer used by frames.
};