Krita Source Code Documentation
Loading...
Searching...
No Matches
timeline_node_list_keeper.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
12
13#include <QSet>
14#include <QPointer>
18
65
67 KisDummiesFacadeBase *dummiesFacade,
68 KisNodeDisplayModeAdapter *displayModeAdapter)
69 : m_d(new Private(this, model, dummiesFacade, displayModeAdapter))
70{
71 KIS_ASSERT_RECOVER_RETURN(m_d->dummiesFacade);
72
73 connect(m_d->dummiesFacade, SIGNAL(sigEndInsertDummy(KisNodeDummy*)),
75 connect(m_d->dummiesFacade, SIGNAL(sigBeginRemoveDummy(KisNodeDummy*)),
77 connect(m_d->dummiesFacade, SIGNAL(sigDummyChanged(KisNodeDummy*)),
79
80 m_d->populateDummiesList();
81
82 connect(m_d->displayModeAdapter, SIGNAL(sigNodeDisplayModeChanged(bool, bool)), SLOT(slotDisplayModeChanged()));
83}
84
88
90{
91 if (row >= 0 && row < m_d->dummiesList.size()) {
92 return m_d->dummiesList[row];
93 }
94
95 return 0;
96}
97
99{
100 return m_d->dummiesList.indexOf(dummy);
101}
102
104{
105 return m_d->dummiesList.size();
106}
107
109{
110 bool oldRemoved = false;
111 bool newAdded = false;
112
113 KisNodeDummy *oldActiveDummy = m_d->converter.activeDummy();
114 m_d->converter.updateActiveDummy(dummy, &oldRemoved, &newAdded);
115
116 if (oldRemoved) {
117 slotBeginRemoveDummy(oldActiveDummy);
118 }
119
120 if (newAdded) {
121 slotEndInsertDummy(dummy);
122 }
123}
124
126{
132 if (!dummy) return;
133
134 int pos = m_d->converter.rowForDummy(dummy);
135 if (pos < 0) return;
136
137 QModelIndex index0 = m_d->model->index(pos, 0);
138 QModelIndex index1 = m_d->model->index(pos, m_d->model->columnCount() - 1);
139 m_d->model->callIndexChanged(index0, index1);
140}
141
143{
144 QMap<QString, KisKeyframeChannel*> channels = dummy->node()->keyframeChannels();
145
146 if (channels.isEmpty()) {
147 if (connectionsSet.contains(dummy)) {
148 connectionsSet.remove(dummy);
149 }
150
151 return;
152 }
153
154 if (connectionsSet.contains(dummy)) return;
155
156 QPointer<KisNodeDummy> safeDummyPointer(dummy);
157
158 Q_FOREACH(KisKeyframeChannel *channel, channels) {
160 q,
161 [this, safeDummyPointer ] () {
162 // make sure that the pointer is invalidated when
163 // the dummy is destroyed, it might happen on
164 // reordering of the signals
165 q->slotUpdateDummyContent(safeDummyPointer);
166 });
167 }
168 connectionsSet.insert(dummy);
169}
170
172{
173 if (!connectionsSet.contains(dummy)) return;
174
175 QMap<QString, KisKeyframeChannel*> channels = dummy->node()->keyframeChannels();
176
177 if (channels.isEmpty()) {
178 if (connectionsSet.contains(dummy)) {
179 connectionsSet.remove(dummy);
180 }
181 return;
182 }
183
184 channelConnectionsStore.clear();
185
186 connectionsSet.remove(dummy);
187}
188
190{
191 KIS_ASSERT_RECOVER_RETURN(!m_d->dummiesList.contains(dummy));
192
193 if (m_d->converter.isDummyVisible(dummy)) {
194 int pos = m_d->converter.rowForDummy(dummy);
195
196 m_d->model->callBeginInsertRows(QModelIndex(), pos, pos);
197 m_d->dummiesList.insert(pos, 1, dummy);
198 m_d->tryConnectDummy(dummy);
199 m_d->model->callEndInsertRows();
200 }
201}
202
204{
205 if (m_d->dummiesList.contains(dummy)) {
206 int pos = m_d->dummiesList.indexOf(dummy);
207
208 m_d->model->callBeginRemoveRows(QModelIndex(), pos, pos);
209 m_d->disconnectDummy(dummy);
210 m_d->dummiesList.remove(pos);
211 m_d->model->callEndRemoveRows();
212 }
213
214 m_d->converter.notifyDummyRemoved(dummy);
215}
216
218{
219 const bool present = m_d->dummiesList.contains(dummy);
220 const bool shouldBe = m_d->converter.isDummyVisible(dummy);
221
222 m_d->tryConnectDummy(dummy);
223
224 if (!present && shouldBe) {
225 slotEndInsertDummy(dummy);
226 } else if (present && !shouldBe) {
228 }
229}
230
232{
233 if (m_d->showGlobalSelectionMask != m_d->displayModeAdapter->showGlobalSelectionMask()) {
234
235 m_d->model->callBeginResetModel();
236
237 Q_FOREACH (KisNodeDummy *dummy, m_d->dummiesList) {
238 m_d->disconnectDummy(dummy);
239 }
240 m_d->dummiesList.clear();
241
242 m_d->showGlobalSelectionMask = m_d->displayModeAdapter->showGlobalSelectionMask();
243 m_d->converter.setShowGlobalSelectionMask(m_d->showGlobalSelectionMask);
244
245 m_d->populateDummiesList();
246
247 m_d->model->callEndResetModel();
248 }
249}
250
253 const QString &prefix)
254{
255 KisNodeSP node = root->node();
256
257 if (converter.isDummyAvailableForTimeline(root) &&
258 !root->node()->isPinnedToTimeline()) {
259
260 *list <<
262 QString(prefix + node->name()),
263 root);
264 }
265
266 KisNodeDummy *dummy = root->lastChild();
267 while(dummy) {
268 findOtherLayers(dummy, list, prefix + " ");
269 dummy = dummy->prevSibling();
270 }
271}
272
275{
276 OtherLayersList list;
277
278 KisNodeDummy *rootDummy = m_d->dummiesFacade->rootDummy();
279 if (!rootDummy) return list;
280
281 m_d->findOtherLayers(rootDummy, &list, "");
282 return list;
283}
KisKeyframeChannel stores and manages KisKeyframes. Maps units of time to virtual keyframe values....
void sigAnyKeyframeChange()
KisNodeDummy * lastChild() const
KisNodeSP node() const
int indexOf(KisNodeDummy *child) const
KisNodeDummy * prevSibling() const
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void slotBeginRemoveDummy(KisNodeDummy *dummy)
int rowForDummy(KisNodeDummy *dummy)
TimelineNodeListKeeper(ModelWithExternalNotifications *model, KisDummiesFacadeBase *dummiesFacade, KisNodeDisplayModeAdapter *displayModeAdapter)
KisNodeDummy * dummyFromRow(int row)
void slotEndInsertDummy(KisNodeDummy *dummy)
const QScopedPointer< Private > m_d
OtherLayersList otherLayersList() const
void slotUpdateDummyContent(QPointer< KisNodeDummy > dummy)
void updateActiveDummy(KisNodeDummy *dummy)
void slotDummyChanged(KisNodeDummy *dummy)
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
QMap< QString, KisKeyframeChannel * > keyframeChannels
bool isPinnedToTimeline() const
QString name() const
Private(TimelineNodeListKeeper *_q, ModelWithExternalNotifications *_model, KisDummiesFacadeBase *_dummiesFacade, KisNodeDisplayModeAdapter *_displayModeAdapter)
void findOtherLayers(KisNodeDummy *root, TimelineNodeListKeeper::OtherLayersList *list, const QString &prefix)
KisSignalAutoConnectionsStore channelConnectionsStore
ModelWithExternalNotifications * model
KisNodeDisplayModeAdapter * displayModeAdapter