mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-06 12:39:57 +00:00
Adjust frame tags when we move/copy frames
This commit is contained in:
parent
d36f10ee02
commit
5a95c6a48b
@ -164,26 +164,12 @@ void DocumentApi::setPixelFormat(Sprite* sprite, PixelFormat newFormat, Ditherin
|
|||||||
void DocumentApi::addFrame(Sprite* sprite, frame_t newFrame)
|
void DocumentApi::addFrame(Sprite* sprite, frame_t newFrame)
|
||||||
{
|
{
|
||||||
copyFrame(sprite, newFrame-1, newFrame);
|
copyFrame(sprite, newFrame-1, newFrame);
|
||||||
|
|
||||||
// As FrameTag::setFrameRange() changes m_frameTags, we need to use
|
|
||||||
// a copy of this collection
|
|
||||||
std::vector<FrameTag*> tags(sprite->frameTags().begin(), sprite->frameTags().end());
|
|
||||||
for (FrameTag* tag : tags) {
|
|
||||||
frame_t from = tag->fromFrame();
|
|
||||||
frame_t to = tag->toFrame();
|
|
||||||
if (newFrame <= from) { ++from; }
|
|
||||||
if (newFrame <= to+1) { ++to; }
|
|
||||||
|
|
||||||
if (from != tag->fromFrame() ||
|
|
||||||
to != tag->toFrame()) {
|
|
||||||
m_transaction.execute(new cmd::SetFrameTagRange(tag, from, to));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentApi::addEmptyFrame(Sprite* sprite, frame_t newFrame)
|
void DocumentApi::addEmptyFrame(Sprite* sprite, frame_t newFrame)
|
||||||
{
|
{
|
||||||
m_transaction.execute(new cmd::AddFrame(sprite, newFrame));
|
m_transaction.execute(new cmd::AddFrame(sprite, newFrame));
|
||||||
|
adjustFrameTags(sprite, newFrame, +1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentApi::addEmptyFramesTo(Sprite* sprite, frame_t newFrame)
|
void DocumentApi::addEmptyFramesTo(Sprite* sprite, frame_t newFrame)
|
||||||
@ -196,30 +182,14 @@ void DocumentApi::copyFrame(Sprite* sprite, frame_t fromFrame, frame_t newFrame)
|
|||||||
{
|
{
|
||||||
ASSERT(sprite);
|
ASSERT(sprite);
|
||||||
m_transaction.execute(new cmd::CopyFrame(sprite, fromFrame, newFrame));
|
m_transaction.execute(new cmd::CopyFrame(sprite, fromFrame, newFrame));
|
||||||
|
adjustFrameTags(sprite, newFrame, +1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentApi::removeFrame(Sprite* sprite, frame_t frame)
|
void DocumentApi::removeFrame(Sprite* sprite, frame_t frame)
|
||||||
{
|
{
|
||||||
ASSERT(frame >= 0);
|
ASSERT(frame >= 0);
|
||||||
m_transaction.execute(new cmd::RemoveFrame(sprite, frame));
|
m_transaction.execute(new cmd::RemoveFrame(sprite, frame));
|
||||||
|
adjustFrameTags(sprite, frame, -1, false);
|
||||||
// As FrameTag::setFrameRange() changes m_frameTags, we need to use
|
|
||||||
// a copy of this collection
|
|
||||||
std::vector<FrameTag*> tags(sprite->frameTags().begin(), sprite->frameTags().end());
|
|
||||||
for (FrameTag* tag : tags) {
|
|
||||||
frame_t from = tag->fromFrame();
|
|
||||||
frame_t to = tag->toFrame();
|
|
||||||
if (frame < from) { --from; }
|
|
||||||
if (frame <= to) { --to; }
|
|
||||||
|
|
||||||
if (from != tag->fromFrame() ||
|
|
||||||
to != tag->toFrame()) {
|
|
||||||
if (from > to)
|
|
||||||
m_transaction.execute(new cmd::RemoveFrameTag(sprite, tag));
|
|
||||||
else
|
|
||||||
m_transaction.execute(new cmd::SetFrameTagRange(tag, from, to));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DocumentApi::setTotalFrames(Sprite* sprite, frame_t frames)
|
void DocumentApi::setTotalFrames(Sprite* sprite, frame_t frames)
|
||||||
@ -257,17 +227,18 @@ void DocumentApi::moveFrame(Sprite* sprite, frame_t frame, frame_t beforeFrame)
|
|||||||
if (frame < beforeFrame) {
|
if (frame < beforeFrame) {
|
||||||
for (frame_t c=frame; c<beforeFrame-1; ++c)
|
for (frame_t c=frame; c<beforeFrame-1; ++c)
|
||||||
setFrameDuration(sprite, c, sprite->frameDuration(c+1));
|
setFrameDuration(sprite, c, sprite->frameDuration(c+1));
|
||||||
|
|
||||||
setFrameDuration(sprite, beforeFrame-1, frlen_aux);
|
setFrameDuration(sprite, beforeFrame-1, frlen_aux);
|
||||||
}
|
}
|
||||||
// Moving the frame to the past.
|
// Moving the frame to the past.
|
||||||
else if (beforeFrame < frame) {
|
else if (beforeFrame < frame) {
|
||||||
for (frame_t c=frame; c>beforeFrame; --c)
|
for (frame_t c=frame; c>beforeFrame; --c)
|
||||||
setFrameDuration(sprite, c, sprite->frameDuration(c-1));
|
setFrameDuration(sprite, c, sprite->frameDuration(c-1));
|
||||||
|
|
||||||
setFrameDuration(sprite, beforeFrame, frlen_aux);
|
setFrameDuration(sprite, beforeFrame, frlen_aux);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
adjustFrameTags(sprite, frame, -1, true);
|
||||||
|
adjustFrameTags(sprite, beforeFrame, +1, true);
|
||||||
|
|
||||||
// Change cel positions.
|
// Change cel positions.
|
||||||
moveFrameLayer(sprite->folder(), frame, beforeFrame);
|
moveFrameLayer(sprite->folder(), frame, beforeFrame);
|
||||||
}
|
}
|
||||||
@ -545,4 +516,33 @@ void DocumentApi::setPalette(Sprite* sprite, frame_t frame, Palette* newPalette)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DocumentApi::adjustFrameTags(Sprite* sprite, frame_t frame, frame_t delta, bool between)
|
||||||
|
{
|
||||||
|
// As FrameTag::setFrameRange() changes m_frameTags, we need to use
|
||||||
|
// a copy of this collection
|
||||||
|
std::vector<FrameTag*> tags(sprite->frameTags().begin(), sprite->frameTags().end());
|
||||||
|
|
||||||
|
for (FrameTag* tag : tags) {
|
||||||
|
frame_t from = tag->fromFrame();
|
||||||
|
frame_t to = tag->toFrame();
|
||||||
|
|
||||||
|
if (delta == +1) {
|
||||||
|
if (frame <= from) { ++from; }
|
||||||
|
if (frame <= to+1) { ++to; }
|
||||||
|
}
|
||||||
|
else if (delta == -1) {
|
||||||
|
if (frame < from) { --from; }
|
||||||
|
if (frame <= to) { --to; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from != tag->fromFrame() ||
|
||||||
|
to != tag->toFrame()) {
|
||||||
|
if (from > to)
|
||||||
|
m_transaction.execute(new cmd::RemoveFrameTag(sprite, tag));
|
||||||
|
else
|
||||||
|
m_transaction.execute(new cmd::SetFrameTagRange(tag, from, to));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace app
|
} // namespace app
|
||||||
|
@ -106,6 +106,7 @@ namespace app {
|
|||||||
private:
|
private:
|
||||||
void setCelFramePosition(Cel* cel, frame_t frame);
|
void setCelFramePosition(Cel* cel, frame_t frame);
|
||||||
void moveFrameLayer(Layer* layer, frame_t frame, frame_t beforeFrame);
|
void moveFrameLayer(Layer* layer, frame_t frame, frame_t beforeFrame);
|
||||||
|
void adjustFrameTags(Sprite* sprite, frame_t frame, frame_t delta, bool between);
|
||||||
|
|
||||||
Document* m_document;
|
Document* m_document;
|
||||||
Transaction& m_transaction;
|
Transaction& m_transaction;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user