aseprite/src/app/cmd/add_layer.cpp

97 lines
2.2 KiB
C++
Raw Normal View History

2015-02-12 23:16:25 +08:00
// Aseprite
// Copyright (C) 2001-2016 David Capello
2015-02-12 23:16:25 +08:00
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/cmd/add_layer.h"
#include "doc/document.h"
#include "doc/document_event.h"
#include "doc/layer.h"
#include "doc/layer_io.h"
#include "doc/subobjects_io.h"
namespace app {
namespace cmd {
using namespace doc;
2016-06-08 06:38:56 +08:00
AddLayer::AddLayer(Layer* group, Layer* newLayer, Layer* afterThis)
: m_group(group)
, m_newLayer(newLayer)
, m_afterThis(afterThis)
, m_size(0)
{
}
void AddLayer::onExecute()
{
2016-06-08 06:38:56 +08:00
Layer* group = m_group.layer();
Layer* newLayer = m_newLayer.layer();
Layer* afterThis = m_afterThis.layer();
2016-06-08 06:38:56 +08:00
addLayer(group, newLayer, afterThis);
}
void AddLayer::onUndo()
{
2016-06-08 06:38:56 +08:00
Layer* group = m_group.layer();
Layer* layer = m_newLayer.layer();
write_layer(m_stream, layer);
m_size = size_t(m_stream.tellp());
2016-06-08 06:38:56 +08:00
removeLayer(group, layer);
}
void AddLayer::onRedo()
{
2016-06-08 06:38:56 +08:00
Layer* group = m_group.layer();
SubObjectsFromSprite io(group->sprite());
Layer* newLayer = read_layer(m_stream, &io);
Layer* afterThis = m_afterThis.layer();
2016-06-08 06:38:56 +08:00
addLayer(group, newLayer, afterThis);
m_stream.str(std::string());
m_stream.clear();
m_size = 0;
}
2016-06-08 06:38:56 +08:00
void AddLayer::addLayer(Layer* group, Layer* newLayer, Layer* afterThis)
{
static_cast<LayerGroup*>(group)->insertLayer(newLayer, afterThis);
2016-06-08 06:38:56 +08:00
group->incrementVersion();
2016-06-08 06:38:56 +08:00
Document* doc = group->sprite()->document();
DocumentEvent ev(doc);
2016-06-08 06:38:56 +08:00
ev.sprite(group->sprite());
ev.layer(newLayer);
doc->notifyObservers<DocumentEvent&>(&DocumentObserver::onAddLayer, ev);
}
2016-06-08 06:38:56 +08:00
void AddLayer::removeLayer(Layer* group, Layer* layer)
{
2016-06-08 06:38:56 +08:00
Document* doc = group->sprite()->document();
DocumentEvent ev(doc);
ev.sprite(layer->sprite());
ev.layer(layer);
doc->notifyObservers<DocumentEvent&>(&DocumentObserver::onBeforeRemoveLayer, ev);
2016-06-08 06:38:56 +08:00
static_cast<LayerGroup*>(group)->removeLayer(layer);
group->incrementVersion();
doc->notifyObservers<DocumentEvent&>(&DocumentObserver::onAfterRemoveLayer, ev);
delete layer;
}
} // namespace cmd
} // namespace app