Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAnimatedOpacityProperty.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2021 Eoin O 'Neill <eoinoneill1991@gmail.com>
3 * SPDX-FileCopyrightText: 2021 Emmet O 'Neill <emmetoneill.pdx@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
11 : QObject(parent),
12 m_bounds(bounds),
13 m_props(props),
14 m_defaultValue(defaultValue)
15{
16}
17
19 QVariant variant;
20 bool ok = m_props->property("opacity", variant);
21 const quint8 value = ok ? variant.toInt() : m_defaultValue;
22
23 if (m_channel) {
24 qreal chanValue = m_channel->currentValue();
25 if (!qIsNaN(chanValue)){
26 return (chanValue * 255 / 100);
27 }
28 }
29
30 return value;
31}
32
34 quint8 valueToAssign;
35 if (m_channel && m_channel->keyframeCount() > 0) {
36 const int currentTime = m_bounds->currentTime();
37 const float currentValue = m_channel->valueAt(currentTime);
38 KisScalarKeyframeSP key = m_channel->keyframeAt<KisScalarKeyframe>(currentTime);
39
40 if (!key) {
41 m_channel->addScalarKeyframe(currentTime, currentValue);
42 key = m_channel->keyframeAt<KisScalarKeyframe>(currentTime);
43 KIS_ASSERT(key);
44 }
45
46 const int translatedOldValue = key->value() * 255 / 100; //0..100 -> 0..255
47
48 if (translatedOldValue == value) {
49 return;
50 }
51
52 key->setValue(qreal(value) * 100 / 255);
53
54 valueToAssign = qreal(m_channel->currentValue()) * 255 / 100;
55 } else {
56 valueToAssign = value;
57 }
58
59 if (m_props->intProperty("opacity", m_defaultValue) == valueToAssign) {
60 return;
61 }
62
63 m_props->setProperty("opacity", valueToAssign);
64 KIS_ASSERT(valueToAssign == value); //Sanity check.
65 Q_EMIT changed(valueToAssign);
66}
67
71 new KisDefaultBoundsNodeWrapper(parentNode)
72 ));
73
74 m_channel->setNode(parentNode);
75 m_channel->setDefaultBounds(new KisDefaultBoundsNodeWrapper(parentNode));
76 m_channel->setLimits(0, 100);
77 m_channel->setDefaultInterpolationMode(KisScalarKeyframe::Linear);
78 m_channel->setDefaultValue(100);
79
80 connect(m_channel.data(), SIGNAL(sigKeyframeChanged(const KisKeyframeChannel*,int)), this, SLOT(slotKeyChanged(const KisKeyframeChannel*,int)));
81 connect(m_channel.data(), SIGNAL(sigKeyframeHasBeenRemoved(const KisKeyframeChannel*,int)), this, SLOT(slotKeyRemoval(const KisKeyframeChannel*,int)));
82}
83
88 KIS_ASSERT(channelNew);
89 m_channel.reset(channelNew);
90 m_channel->setDefaultBounds(m_bounds);
91
92 connect(m_channel.data(), SIGNAL(sigKeyframeChanged(const KisKeyframeChannel*,int)), this, SLOT(slotKeyChanged(const KisKeyframeChannel*,int)));
93 connect(m_channel.data(), SIGNAL(sigKeyframeHasBeenRemoved(const KisKeyframeChannel*,int)), this, SLOT(slotKeyRemoval(const KisKeyframeChannel*,int)));
94}
95
102
104
105 if (m_channel->isCurrentTimeAffectedBy(time)) {
106 Q_EMIT changed(m_channel->currentValue() * 255 / 100);
107 }
108}
109
111{
112 //Key removed is the last one, we should let everyone know that we'll be
113 //reverting to the previous opacity value.
114 //This will either be the last keyframe value or the last cached value assignment.
115 if (m_channel && m_channel->keyframeCount() == 0) {
116 Q_EMIT changed(m_props->intProperty("opacity", 255));
117 } else {
118 Q_EMIT changed(m_channel->currentValue() * 255 / 100);
119 }
120}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisScalarKeyframeChannel * channel() const
void slotKeyChanged(const KisKeyframeChannel *, int time)
void transferKeyframeData(const KisAnimatedOpacityProperty &rhs)
QScopedPointer< KisScalarKeyframeChannel > m_channel
KisAnimatedOpacityProperty(KisDefaultBoundsBaseSP bounds, KoProperties *const props, quint8 defaultValue, QObject *parent=nullptr)
void changed(quint8 value)
void slotKeyRemoval(const KisKeyframeChannel *, int)
void makeAnimated(KisNode *parentNode)
void updateDefaultBounds(KisDefaultBoundsBaseSP bounds)
virtual int currentTime() const =0
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
static const KoID Opacity
The KisScalarKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisSca...
The KisScalarKeyframe class is a concrete subclass of KisKeyframe that wraps a scalar value and inter...
int intProperty(const QString &name, int defaultValue=0) const
void setProperty(const QString &name, const QVariant &value)
bool property(const QString &name, QVariant &value) const
#define KIS_ASSERT_RECOVER(cond)
Definition kis_assert.h:55
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
#define bounds(x, a, b)