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 }