8#include <klocalizedstring.h>
34 bool collapsed {
false};
35 bool supportsLodMoves {
false};
36 bool animated {
false};
37 bool pinnedToTimeline {
false};
41 : id(QUuid::createUuid())
48 : compositeOp(rhs.compositeOp),
49 id(QUuid::createUuid()),
51 collapsed(rhs.collapsed),
52 supportsLodMoves(rhs.supportsLodMoves),
53 animated(rhs.animated),
54 pinnedToTimeline(rhs.pinnedToTimeline),
57 QMapIterator<QString, QVariant> iter = rhs.properties.propertyIterator();
58 while (iter.hasNext()) {
93 if (rhs.
m_d->opacityProperty.hasChannel()) {
94 m_d->opacityProperty.transferKeyframeData(rhs.
m_d->opacityProperty);
95 m_d->keyframeChannels.insert(
m_d->opacityProperty.channel()->id(),
m_d->opacityProperty.channel());
113 return m_d->opacityProperty.get();
118 m_d->opacityProperty.set(val);
124 return int(
float(
opacity() * 100) / 255 + 0.5);
129 setOpacity(
int(
float(val * 255) / 100 + 0.5));
134 return m_d->compositeOp;
163 return m_d->properties;
175 while (iter.hasNext()) {
177 m_d->properties.setProperty(iter.key(), iter.value());
186 while (iter.hasNext()) {
188 if (
m_d->properties.contains(iter.key())) {
189 if (
m_d->properties.value(iter.key()) != iter.value())
199 Q_UNUSED(aspectRatioMode);
202 QImage
image(w, h, QImage::Format_ARGB32);
205 }
catch (
const std::bad_alloc&) {
219 Q_UNUSED(aspectRatioMode);
228 return recursive && isVisible && parentNode ?
229 parentNode->visible(recursive) : isVisible;
235 if (!loading && isVisible ==
visible)
return;
276 const KisBaseNode* isolatedRoot =
m_d->image->isolationRootNode().data();
278 return (
this == isolatedRoot);
284 if (isLocked == locked)
return;
292 bool editable =
true;
293 if (checkVisibility) {
302 if (parentNode && parentNode !=
this) {
303 editable = parentNode->isEditable(checkVisibility);
316 const bool oldCollapsed =
m_d->collapsed;
327 return m_d->collapsed;
334 if (currentLabel == index)
return;
358 return m_d->supportsLodMoves;
390 return m_d->keyframeChannels;
395 QMap<QString, KisKeyframeChannel*>::const_iterator i =
m_d->keyframeChannels.constFind(
id);
396 if (i ==
m_d->keyframeChannels.constEnd()) {
404 return m_d->pinnedToTimeline;
409 if (pinned ==
m_d->pinnedToTimeline)
return;
411 m_d->pinnedToTimeline = pinned;
419 if (!channel && create) {
432 return m_d->animated;
437 m_d->animated =
true;
443 m_d->keyframeChannels.insert(channel->
id(), channel);
450 Q_ASSERT(!
m_d->opacityProperty.hasChannel());
455 if (device && node) {
456 m_d->opacityProperty.makeAnimated(node);
457 return m_d->opacityProperty.channel();
475 dbg.nospace() <<
"Property(" << prop.
id <<
", " << prop.
state;
478 dbg.nospace() <<
", in-stasis";
481 dbg.nospace() <<
")";
float value(const T *src, size_t ch)
const quint8 OPACITY_OPAQUE_U8
const QString COMPOSITE_OVER
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
static const KoID Opacity
static const KoID colorLabelIndex
static KisBaseNode::Property getProperty(const KoID &id, bool state)
static const KoID visible
QMapIterator< QString, QVariant > propertyIterator() const
void setProperty(const QString &name, const QVariant &value)
QDebug operator<<(QDebug dbg, const KisBaseNode::Property &prop)
void setPinnedToTimeline(bool pinned)
void setNodeProperty(const QString &name, const QVariant &value)
void setSupportsLodMoves(bool value)
virtual bool supportsLodPainting() const
QMap< QString, KisKeyframeChannel * > keyframeChannels
quint8 percentOpacity() const
virtual KisPaintDeviceSP colorSampleSourceDevice() const
virtual void setUserLocked(bool l)
bool isIsolatedRoot() const
virtual void baseNodeInvalidateAllFramesCallback()
virtual KisPaintDeviceSP projection() const =0
const QString & compositeOpId() const
virtual void baseNodeCollapsedChangedCallback()
bool isEditable(bool checkVisibility=true) const
virtual void baseNodeChangedCallback()
KisBaseNode(KisImageWSP image)
void setOpacity(quint8 val)
virtual void setVisible(bool visible, bool loading=false)
bool isPinnedToTimeline() const
KisKeyframeChannel * getKeyframeChannel(const QString &id, bool create)
void mergeNodeProperties(const KoProperties &properties)
virtual void setImage(KisImageWSP image)
virtual QImage createThumbnail(qint32 w, qint32 h, Qt::AspectRatioMode aspectRatioMode=Qt::IgnoreAspectRatio)
virtual KisKeyframeChannel * requestKeyframeChannel(const QString &id)
bool belongsToIsolatedGroup() const
const KoProperties & nodeProperties() const
virtual KisPaintDeviceSP original() const =0
KisAnimatedOpacityProperty opacityProperty
virtual void notifyParentVisibilityChanged(bool value)
void setUuid(const QUuid &id)
void setColorLabelIndex(int index)
KisBaseNode::Property hack_visible
Private(KisImageWSP p_image)
void setCollapsed(bool collapsed)
virtual int thumbnailSeqNo() const
void keyframeChannelAdded(KisKeyframeChannel *channel)
int colorLabelIndex() const
void opacityChanged(quint8 value)
void setPercentOpacity(quint8 val)
virtual KisPaintDeviceSP paintDevice() const =0
virtual PropertyList sectionModelProperties() const
void setCompositeOpId(const QString &compositeOpId)
Private(const Private &rhs)
virtual void addKeyframeChannel(KisKeyframeChannel *channel)
virtual bool isFakeNode() const
bool check(const KoProperties &properties) const
virtual bool visible(bool recursive=false) const
virtual KisBaseNodeSP parentCallback() const
virtual QImage createThumbnailForFrame(qint32 w, qint32 h, int time, Qt::AspectRatioMode aspectRatioMode=Qt::IgnoreAspectRatio)
bool hasEditablePaintDevice() const
virtual bool supportsKeyframeChannel(const QString &id)
virtual void setSectionModelProperties(const PropertyList &properties)