Commit 96333af4 authored by Jouni Pentikäinen's avatar Jouni Pentikäinen

Add command to move multiple keyframes at once

This allows the moves to be validated as one operation. In particular,
animation cycle ranges can be updated based on moved or overwritten
keyframes.
parent 2d4b7f09
...@@ -27,6 +27,13 @@ KisAnimationCycle::KisAnimationCycle(KisKeyframeChannel *channel, KisKeyframeSP ...@@ -27,6 +27,13 @@ KisAnimationCycle::KisAnimationCycle(KisKeyframeChannel *channel, KisKeyframeSP
, m_lastSourceKeyframe(lastKeyframe) , m_lastSourceKeyframe(lastKeyframe)
{} {}
KisAnimationCycle::KisAnimationCycle(const KisAnimationCycle &cycle, KisKeyframeSP firstKeyframe, KisKeyframeSP lastKeyframe)
: KisKeyframeBase(cycle.channel(), firstKeyframe->time())
, m_firstSourceKeyframe(firstKeyframe)
, m_lastSourceKeyframe(lastKeyframe)
, m_repeats(cycle.m_repeats)
{}
KisKeyframeSP KisAnimationCycle::firstSourceKeyframe() const KisKeyframeSP KisAnimationCycle::firstSourceKeyframe() const
{ {
return m_firstSourceKeyframe; return m_firstSourceKeyframe;
......
...@@ -30,6 +30,8 @@ class KRITAIMAGE_EXPORT KisAnimationCycle : public KisKeyframeBase { ...@@ -30,6 +30,8 @@ class KRITAIMAGE_EXPORT KisAnimationCycle : public KisKeyframeBase {
public: public:
KisAnimationCycle(KisKeyframeChannel *channel, KisKeyframeSP firstKeyframe, KisKeyframeSP lastKeyframe); KisAnimationCycle(KisKeyframeChannel *channel, KisKeyframeSP firstKeyframe, KisKeyframeSP lastKeyframe);
KisAnimationCycle(const KisAnimationCycle &cycle, KisKeyframeSP firstKeyframe, KisKeyframeSP lastKeyframe);
KisKeyframeSP firstSourceKeyframe() const; KisKeyframeSP firstSourceKeyframe() const;
KisKeyframeSP lastSourceKeyframe() const; KisKeyframeSP lastSourceKeyframe() const;
KisTimeSpan originalRange() const; KisTimeSpan originalRange() const;
......
...@@ -553,6 +553,11 @@ KisVisibleKeyframeIterator KisKeyframeChannel::visibleKeyframesFrom(int time) co ...@@ -553,6 +553,11 @@ KisVisibleKeyframeIterator KisKeyframeChannel::visibleKeyframesFrom(int time) co
return KisVisibleKeyframeIterator(visibleKeyframeAt(time)); return KisVisibleKeyframeIterator(visibleKeyframeAt(time));
} }
QList<QSharedPointer<KisAnimationCycle>> KisKeyframeChannel::cycles() const
{
return m_d->cycles.values();
}
KisTimeSpan KisKeyframeChannel::cycledRangeAt(int time) const KisTimeSpan KisKeyframeChannel::cycledRangeAt(int time) const
{ {
QSharedPointer<KisRepeatFrame> repeat = activeRepeatAt(time); QSharedPointer<KisRepeatFrame> repeat = activeRepeatAt(time);
......
...@@ -101,6 +101,8 @@ public: ...@@ -101,6 +101,8 @@ public:
KisVisibleKeyframeIterator visibleKeyframesFrom(int time) const; KisVisibleKeyframeIterator visibleKeyframesFrom(int time) const;
QList<QSharedPointer<KisAnimationCycle>> cycles() const;
/** /**
* Finds the original range of the cycle defined or repeated at the given time. * Finds the original range of the cycle defined or repeated at the given time.
* @arg time a time at any frame within the original cycle or any repeat of it. * @arg time a time at any frame within the original cycle or any repeat of it.
...@@ -199,6 +201,7 @@ private: ...@@ -199,6 +201,7 @@ private:
void addCycle(QSharedPointer<KisAnimationCycle> cycle); void addCycle(QSharedPointer<KisAnimationCycle> cycle);
void removeCycle(QSharedPointer<KisAnimationCycle> cycle); void removeCycle(QSharedPointer<KisAnimationCycle> cycle);
friend class KisMoveKeyframesCommand;
friend class KisMoveFrameCommand; friend class KisMoveFrameCommand;
friend class KisReplaceKeyframeCommand; friend class KisReplaceKeyframeCommand;
friend class KisSwapFramesCommand; friend class KisSwapFramesCommand;
......
This diff is collapsed.
...@@ -21,6 +21,23 @@ ...@@ -21,6 +21,23 @@
#include "kundo2command.h" #include "kundo2command.h"
#include "kritaimage_export.h" #include "kritaimage_export.h"
namespace KisKeyframeCommands
{
struct KRITAIMAGE_EXPORT KeyframeMove
{
KisKeyframeBaseSP keyframe;
int oldTime, newTime;
KeyframeMove() = default;
KeyframeMove(KisKeyframeBaseSP keyframe, int newTime);
};
/**
* Returns either a new command for operations needed to move the keyframes or null if the operation is invalid against the current state of the channel
*/
KRITAIMAGE_EXPORT KUndo2CommandSP tryMoveKeyframes(KisKeyframeChannel *channel, QVector<KeyframeMove> moves, KUndo2Command *parentCommand);
}
class KRITAIMAGE_EXPORT KisReplaceKeyframeCommand : public KUndo2Command class KRITAIMAGE_EXPORT KisReplaceKeyframeCommand : public KUndo2Command
{ {
public: public:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment