Krita Source Code Documentation
Loading...
Searching...
No Matches
KisAnimCurvesChannelsModel Class Reference

#include <KisAnimCurvesChannelsModel.h>

+ Inheritance diagram for KisAnimCurvesChannelsModel:

Classes

struct  Private
 

Public Types

enum  ItemDataRole {
  CurveRole = Qt::UserRole , CurveColorRole , CurveVisibilityRole , CurveIsIsolatedRole ,
  NodeColorRole
}
 

Public Slots

void clear ()
 
void keyframeChannelAddedToNode (KisKeyframeChannel *channel)
 
void reset (const QModelIndex &index)
 
void selectedNodesChanged (const QList< KisNodeSP > &nodes)
 

Public Member Functions

int columnCount (const QModelIndex &parent) const override
 
QVariant data (const QModelIndex &index, int role) const override
 
QModelIndex index (int row, int column, const QModelIndex &parent) const override
 
 KisAnimCurvesChannelsModel (KisAnimCurvesModel *curvesModel, QObject *parent)
 
QModelIndex parent (const QModelIndex &child) const override
 
int rowCount (const QModelIndex &parent) const override
 
bool setData (const QModelIndex &index, const QVariant &value, int role) override
 
void setDummiesFacade (KisDummiesFacadeBase *facade)
 
 ~KisAnimCurvesChannelsModel () override
 

Private Slots

void slotNotifyDummyRemoved (KisNodeDummy *dummy)
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 19 of file KisAnimCurvesChannelsModel.h.

Member Enumeration Documentation

◆ ItemDataRole

Constructor & Destructor Documentation

◆ KisAnimCurvesChannelsModel()

KisAnimCurvesChannelsModel::KisAnimCurvesChannelsModel ( KisAnimCurvesModel * curvesModel,
QObject * parent )

Definition at line 71 of file KisAnimCurvesChannelsModel.cpp.

72 : QAbstractItemModel(parent)
73 , m_d(new Private(curvesModel))
74{}
QModelIndex parent(const QModelIndex &child) const override
const QScopedPointer< Private > m_d

◆ ~KisAnimCurvesChannelsModel()

KisAnimCurvesChannelsModel::~KisAnimCurvesChannelsModel ( )
override

Definition at line 76 of file KisAnimCurvesChannelsModel.cpp.

77{
78 qDeleteAll(m_d->items);
79 m_d->items.clear();
80}

References m_d.

Member Function Documentation

◆ clear

void KisAnimCurvesChannelsModel::clear ( )
slot

Definition at line 342 of file KisAnimCurvesChannelsModel.cpp.

343{
344 qDeleteAll(m_d->items);
345 m_d->items.clear();
346}

References m_d.

◆ columnCount()

int KisAnimCurvesChannelsModel::columnCount ( const QModelIndex & parent) const
override

Definition at line 259 of file KisAnimCurvesChannelsModel.cpp.

260{
261 Q_UNUSED(parent);
262 return 1;
263}

References parent().

◆ data()

QVariant KisAnimCurvesChannelsModel::data ( const QModelIndex & index,
int role ) const
override

Definition at line 265 of file KisAnimCurvesChannelsModel.cpp.

266{
267 const quintptr parentRow = index.internalId();
268 const bool indexIsNode = (parentRow == ID_NODE);
269 NodeListItem *item = m_d->itemForRow(indexIsNode ? index.row() : parentRow);
270
271 switch (role) {
272 case Qt::DisplayRole: {
273 if (indexIsNode) {
274 return item->dummy->node()->name();
275 } else {
276 KisKeyframeChannel *channel = item->curves.at(index.row())->channel();
277 return channel->name();
278 }
279 } break;
280
281 case CurveRole:
282 return !indexIsNode;
283
284 case CurveColorRole:
285 return indexIsNode ? QVariant() : item->curves.at(index.row())->color();
286
288 return indexIsNode ? QVariant() : item->curves.at(index.row())->visible();
289
290 case CurveIsIsolatedRole: {
291 const bool isVisible = item->curves.at(index.row())->visible();
292 if (!isVisible)
293 return false;
294
295 int numVisible = 0;
296 for (int i = 0; i < item->curves.size(); i++) {
297 if ( numVisible > 1)
298 return false;
299
300 if (item->curves.at(i)->visible())
301 numVisible++;
302 }
303
304 return (numVisible == 1);
305 }
306 case NodeColorRole: {
307
308 if (!indexIsNode)
309 return QVariant();
310
311 KisNodeViewColorScheme nodeColorScheme;
312 const QColor backgroundColor = qApp->palette().color(QPalette::Button);
313 const int colorLabelIndex = item->dummy->node()->colorLabelIndex();
314 const QColor nodeColor = nodeColorScheme.colorFromLabelIndex(colorLabelIndex);
315 return colorLabelIndex > 0 ? KisPaintingTweaks::blendColors(nodeColor, backgroundColor, 0.3) : backgroundColor;
316 }
317 default:
318 break;
319 }
320
321 return QVariant();
322}
const quintptr ID_NODE
QModelIndex index(int row, int column, const QModelIndex &parent) const override
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
KisNodeSP node() const
QColor colorFromLabelIndex(int index) const
QColor blendColors(const QColor &c1, const QColor &c2, qreal r1)
int colorLabelIndex() const
QString name() const
QList< KisAnimationCurve * > curves

References KisPaintingTweaks::blendColors(), KisNodeViewColorScheme::colorFromLabelIndex(), KisBaseNode::colorLabelIndex(), CurveColorRole, CurveIsIsolatedRole, CurveRole, NodeListItem::curves, CurveVisibilityRole, NodeListItem::dummy, ID_NODE, index(), m_d, KisBaseNode::name(), KisKeyframeChannel::name(), KisNodeDummy::node(), and NodeColorRole.

◆ index()

QModelIndex KisAnimCurvesChannelsModel::index ( int row,
int column,
const QModelIndex & parent ) const
override

Definition at line 213 of file KisAnimCurvesChannelsModel.cpp.

214{
215 Q_UNUSED(column);
216
217 if (!parent.isValid()) {
218 // Node
219
220 NodeListItem *item = m_d->itemForRow(row);
221 if (!item) return QModelIndex();
222
223 return createIndex(row, column, ID_NODE);
224 } else {
225 // Channel
226 if (parent.parent().isValid()) return QModelIndex();
227
228 NodeListItem *parentItem = m_d->itemForRow(parent.row());
229 if (!parentItem) return QModelIndex();
230
231 if (row >= parentItem->curves.count()) return QModelIndex();
232
233 return createIndex(row, column, parent.row());
234 }
235}

References NodeListItem::curves, ID_NODE, m_d, and parent().

◆ keyframeChannelAddedToNode

void KisAnimCurvesChannelsModel::keyframeChannelAddedToNode ( KisKeyframeChannel * channel)
slot

Definition at line 178 of file KisAnimCurvesChannelsModel.cpp.

179{
180 KisNodeDummy *dummy = m_d->dummiesFacade->dummyForNode(KisNodeSP(channel->node()));
181 int row = m_d->rowForDummy(dummy);
183
184 NodeListItem *item = m_d->itemForRow(row);
185
186 int newCurveRow = item->curves.count();
187 beginInsertRows(index(row, 0, QModelIndex()), newCurveRow, newCurveRow);
188
189 m_d->addCurveForChannel(item, channel);
190
191 endInsertRows();
192}
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
KisSharedPtr< KisNode > KisNodeSP
Definition kis_types.h:86

References NodeListItem::curves, index(), KIS_ASSERT_RECOVER_RETURN, m_d, and KisKeyframeChannel::node().

◆ parent()

QModelIndex KisAnimCurvesChannelsModel::parent ( const QModelIndex & child) const
override

Definition at line 237 of file KisAnimCurvesChannelsModel.cpp.

238{
239 quintptr parentIndex = child.internalId();
240 if (parentIndex == ID_NODE) return QModelIndex();
241 return createIndex(parentIndex, 0, ID_NODE);
242}

References ID_NODE.

◆ reset

void KisAnimCurvesChannelsModel::reset ( const QModelIndex & index)
slot

Definition at line 138 of file KisAnimCurvesChannelsModel.cpp.

139{
140 const quintptr parentRow = index.internalId();
141 const bool indexIsNode = (parentRow == ID_NODE);
142
143 if (indexIsNode) {
144 NodeListItem *item = m_d->itemForRow(index.row());
145
146 KisNodeSP node = item->dummy->node();
147 if (!node || !node->image())
148 return;
149
150 KisImageSP image = node->image().toStrongRef();
151
152 QList<KisAnimationCurve*> curves = item->curves;
153 QList<QString> ids;
154 Q_FOREACH( const KisAnimationCurve* curve, curves ) {
155 ids << curve->channel()->id();
156 }
157
158 KisAnimUtils::resetChannels(image, node, ids);
159
160 } else {
161 NodeListItem *item = m_d->itemForRow(parentRow);
162
163 KisAnimationCurve* curve = item->curves.at(index.row());
164
165 if (!curve)
166 return;
167
168 KisNodeSP node = item->dummy->node();
169
170 if (!node || !node->image())
171 return;
172
173 KisImageSP image = node->image().toStrongRef();
174 KisAnimUtils::resetChannel(image, node, curve->channel()->id());
175 }
176}
KisScalarKeyframeChannel * channel() const
KisSharedPtr< T > toStrongRef() const
toStrongRef returns a KisSharedPtr which may be dereferenced.
void resetChannels(KisImageSP image, KisNodeSP node, const QList< QString > &channelIDs)
void resetChannel(KisImageSP image, KisNodeSP node, const QString &channelID)
KisImageWSP image

References KisAnimationCurve::channel(), NodeListItem::curves, NodeListItem::dummy, KisKeyframeChannel::id(), ID_NODE, KisBaseNode::image, index(), m_d, KisNodeDummy::node(), KisAnimUtils::resetChannel(), KisAnimUtils::resetChannels(), and KisWeakSharedPtr< T >::toStrongRef().

◆ rowCount()

int KisAnimCurvesChannelsModel::rowCount ( const QModelIndex & parent) const
override

Definition at line 244 of file KisAnimCurvesChannelsModel.cpp.

245{
246 if (!parent.isValid()) {
247 // Root
248 return m_d->items.count();
249 } else if (parent.internalId() == ID_NODE) {
250 // Node
251 NodeListItem *item = m_d->itemForRow(parent.row());
252 return item->curves.count();
253 } else {
254 // Channel
255 return 0;
256 }
257}

References NodeListItem::curves, ID_NODE, m_d, and parent().

◆ selectedNodesChanged

void KisAnimCurvesChannelsModel::selectedNodesChanged ( const QList< KisNodeSP > & nodes)
slot

Definition at line 90 of file KisAnimCurvesChannelsModel.cpp.

91{
92 // Remove unselected nodes
93 for (int i = m_d->items.count()-1; i >= 0; i--) {
94 NodeListItem *item = m_d->items.at(i);
95 if (item && item->dummy) {
96 if (!nodes.contains(item->dummy->node())) {
97 beginRemoveRows(QModelIndex(), i, i);
98 m_d->items.removeAt(i);
99 endRemoveRows();
100
101 Q_FOREACH(KisAnimationCurve *curve, item->curves) {
102 m_d->curvesModel->removeCurve(curve);
103
104 }
105
106 if (!item->dummy->node().isNull()) {
107 item->dummy->node()->disconnect(this);
108 }
109
110 delete item;
111 }
112 }
113 }
114
115 // Add newly selected nodes
116 Q_FOREACH(KisNodeSP node, nodes) {
117 KisNodeDummy *dummy = m_d->dummiesFacade->dummyForNode(node);
118 if (!dummy) continue;
119
120 if (m_d->rowForDummy(dummy) == -1) {
121 beginInsertRows(QModelIndex(), m_d->items.count(), m_d->items.count());
122
123 NodeListItem *item = new NodeListItem(dummy);
124 m_d->items.append(item);
125
126 Q_FOREACH(KisKeyframeChannel *channel, dummy->node()->keyframeChannels()) {
127 m_d->addCurveForChannel(item, channel);
128 }
129
132
133 endInsertRows();
134 }
135 }
136}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void keyframeChannelAddedToNode(KisKeyframeChannel *channel)
bool isNull() const
QMap< QString, KisKeyframeChannel * > keyframeChannels
void keyframeChannelAdded(KisKeyframeChannel *channel)

References connect(), NodeListItem::curves, KisSharedPtr< T >::data(), NodeListItem::dummy, KisSharedPtr< T >::isNull(), KisBaseNode::keyframeChannelAdded(), keyframeChannelAddedToNode(), KisBaseNode::keyframeChannels, m_d, and KisNodeDummy::node().

◆ setData()

bool KisAnimCurvesChannelsModel::setData ( const QModelIndex & index,
const QVariant & value,
int role )
override

Definition at line 324 of file KisAnimCurvesChannelsModel.cpp.

325{
326 quintptr parentRow = index.internalId();
327 bool indexIsNode = (parentRow == ID_NODE);
328 NodeListItem *item = m_d->itemForRow(indexIsNode ? index.row() : parentRow);
329
330 switch (role) {
332 KIS_ASSERT_RECOVER_BREAK(!indexIsNode);
333 m_d->curvesModel->setCurveVisible(item->curves.at(index.row()), value.toBool());
334 this->dataChanged(index, index);
335 return true;
336 }
337
338 return false;
339}
float value(const T *src, size_t ch)
#define KIS_ASSERT_RECOVER_BREAK(cond)
Definition kis_assert.h:65

References NodeListItem::curves, CurveVisibilityRole, ID_NODE, index(), KIS_ASSERT_RECOVER_BREAK, m_d, and value().

◆ setDummiesFacade()

void KisAnimCurvesChannelsModel::setDummiesFacade ( KisDummiesFacadeBase * facade)

Definition at line 82 of file KisAnimCurvesChannelsModel.cpp.

83{
84 m_d->dummiesFacadeConnections.clear();
85 m_d->dummiesFacade = facade;
86 m_d->dummiesFacadeConnections.addConnection(m_d->dummiesFacade, SIGNAL(sigBeginRemoveDummy(KisNodeDummy*)),
88}
void slotNotifyDummyRemoved(KisNodeDummy *dummy)

References m_d, and slotNotifyDummyRemoved().

◆ slotNotifyDummyRemoved

void KisAnimCurvesChannelsModel::slotNotifyDummyRemoved ( KisNodeDummy * dummy)
privateslot

Definition at line 194 of file KisAnimCurvesChannelsModel.cpp.

195{
196 bool shouldChangeSelection = false;
197 KisNodeList newSelectedNodes;
198
199 Q_FOREACH (NodeListItem *item, m_d->items) {
200 if (item->dummy == dummy) {
201 shouldChangeSelection = true;
202 break;
203 }
204
205 newSelectedNodes << item->dummy->node();
206 }
207
208 if (shouldChangeSelection) {
209 selectedNodesChanged(newSelectedNodes);
210 }
211}
void selectedNodesChanged(const QList< KisNodeSP > &nodes)

References NodeListItem::dummy, m_d, KisNodeDummy::node(), and selectedNodesChanged().

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisAnimCurvesChannelsModel::m_d
private

Definition at line 57 of file KisAnimCurvesChannelsModel.h.


The documentation for this class was generated from the following files: