File indexing completed on 2024-05-12 15:58:23

0001 /*
0002  *  SPDX-FileCopyrightText: 2020 Emmet O 'Neill <emmetoneill.pdx@gmail.com>
0003  *  SPDX-FileCopyrightText: 2020 Eoin O 'Neill <eoinoneill1991@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "kis_keyframe_commands.h"
0009 #include "kis_scalar_keyframe_channel.h"
0010 #include "kis_signals_blocker.h"
0011 
0012 KisInsertKeyframeCommand::KisInsertKeyframeCommand(KisKeyframeChannel *channel, int time, KisKeyframeSP keyframe, KUndo2Command *parentCmd)
0013     : KUndo2Command(parentCmd),
0014       m_channel(channel),
0015       m_time(time),
0016       m_keyframe(keyframe)
0017 {
0018     m_overwritten = m_channel->keyframeAt(m_time);
0019 }
0020 
0021 void KisInsertKeyframeCommand::redo()
0022 {
0023     m_channel->insertKeyframe(m_time, m_keyframe);
0024 }
0025 
0026 void KisInsertKeyframeCommand::undo()
0027 {
0028     m_channel->removeKeyframe(m_time);
0029 
0030     if (m_overwritten) {
0031         m_channel->insertKeyframe(m_time, m_overwritten);
0032     }
0033 }
0034 
0035 
0036 KisRemoveKeyframeCommand::KisRemoveKeyframeCommand(KisKeyframeChannel *channel, int time, KUndo2Command *parentCmd)
0037     : KUndo2Command(parentCmd),
0038       m_channel(channel),
0039       m_time(time)
0040 {
0041     m_cached = channel->keyframeAt(time);
0042 }
0043 
0044 void KisRemoveKeyframeCommand::redo()
0045 {
0046     m_channel->removeKeyframe(m_time);
0047 }
0048 
0049 void KisRemoveKeyframeCommand::undo()
0050 {
0051     m_channel->insertKeyframe(m_time, m_cached);
0052 }
0053 
0054 KisScalarKeyframeUpdateCommand::KisScalarKeyframeUpdateCommand(KisScalarKeyframe *keyframe, qreal value, KisScalarKeyframe::InterpolationMode interpolationMode, KisScalarKeyframe::TangentsMode tangentMode, QPointF tangentLeft, QPointF tangentRight, KUndo2Command *parentCmd)
0055     : KUndo2Command(parentCmd),
0056       keyframe(keyframe),
0057       cachedValue(keyframe->value(), value),
0058       cachedInterpolationMode(keyframe->interpolationMode(), interpolationMode),
0059       cachedTangentsMode(keyframe->tangentsMode(), tangentMode),
0060       cachedTangentLeft(keyframe->leftTangent(), tangentLeft),
0061       cachedTangentRight(keyframe->rightTangent(), tangentRight)
0062 {}
0063 
0064 void KisScalarKeyframeUpdateCommand::redo()
0065 {
0066     KIS_ASSERT(keyframe);
0067 
0068     QSharedPointer<ScalarKeyframeLimits> limits = keyframe->m_channelLimits.toStrongRef();
0069     if (limits) {
0070         keyframe->m_value = limits->clamp(cachedValue.second);
0071     } else {
0072         keyframe->m_value = cachedValue.second;
0073     }
0074 
0075     keyframe->m_interpolationMode = cachedInterpolationMode.second;
0076     keyframe->m_tangentsMode = cachedTangentsMode.second;
0077     keyframe->m_leftTangent = cachedTangentLeft.second;
0078     keyframe->m_rightTangent = cachedTangentRight.second;
0079 
0080     keyframe->sigChanged(keyframe);
0081 }
0082 
0083 void KisScalarKeyframeUpdateCommand::undo()
0084 {
0085     KIS_ASSERT(keyframe);
0086 
0087     QSharedPointer<ScalarKeyframeLimits> limits = keyframe->m_channelLimits.toStrongRef();
0088     if (limits) {
0089         keyframe->m_value = limits->clamp(cachedValue.first);
0090     } else {
0091         keyframe->m_value = cachedValue.first;
0092     }
0093 
0094     keyframe->m_interpolationMode = cachedInterpolationMode.first;
0095     keyframe->m_tangentsMode = cachedTangentsMode.first;
0096     keyframe->m_leftTangent = cachedTangentLeft.first;
0097     keyframe->m_rightTangent = cachedTangentRight.first;
0098 
0099     keyframe->sigChanged(keyframe);
0100 }