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 Q_FOREACH(KisKeyframeChannel *channel, channels) {
185 channelConnectionsStore.clear();
186 }
187
188 connectionsSet.remove(dummy);
189}
190
192{
193 KIS_ASSERT_RECOVER_RETURN(!m_d->dummiesList.contains(dummy));
194
195 if (m_d->converter.isDummyVisible(dummy)) {
196 int pos = m_d->converter.rowForDummy(dummy);
197
198 m_d->model->callBeginInsertRows(QModelIndex(), pos, pos);
199 m_d->dummiesList.insert(pos, 1, dummy);
200 m_d->tryConnectDummy(dummy);
201 m_d->model->callEndInsertRows();
202 }
203}
204
206{
207 if (m_d->dummiesList.contains(dummy)) {
208 int pos = m_d->dummiesList.indexOf(dummy);
209
210 m_d->model->callBeginRemoveRows(QModelIndex(), pos, pos);
211 m_d->disconnectDummy(dummy);
212 m_d->dummiesList.remove(pos);
213 m_d->model->callEndRemoveRows();
214 }
215
216 m_d->converter.notifyDummyRemoved(dummy);
217}
218
220{
221 const bool present = m_d->dummiesList.contains(dummy);
222 const bool shouldBe = m_d->converter.isDummyVisible(dummy);
223
224 m_d->tryConnectDummy(dummy);
225
226 if (!present && shouldBe) {
227 slotEndInsertDummy(dummy);
228 } else if (present && !shouldBe) {
230 }
231}
232
234{
235 if (m_d->showGlobalSelectionMask != m_d->displayModeAdapter->showGlobalSelectionMask()) {
236
237 m_d->model->callBeginResetModel();
238
239 Q_FOREACH (KisNodeDummy *dummy, m_d->dummiesList) {
240 m_d->disconnectDummy(dummy);
241 }
242 m_d->dummiesList.clear();
243
244 m_d->showGlobalSelectionMask = m_d->displayModeAdapter->showGlobalSelectionMask();
245 m_d->converter.setShowGlobalSelectionMask(m_d->showGlobalSelectionMask);
246
247 m_d->populateDummiesList();
248
249 m_d->model->callEndResetModel();
250 }
251}
252
255 const QString &prefix)
256{
257 KisNodeSP node = root->node();
258
259 if (converter.isDummyAvailableForTimeline(root) &&
260 !root->node()->isPinnedToTimeline()) {
261
262 *list <<
264 QString(prefix + node->name()),
265 root);
266 }
267
268 KisNodeDummy *dummy = root->lastChild();
269 while(dummy) {
270 findOtherLayers(dummy, list, prefix + " ");
271 dummy = dummy->prevSibling();
272 }
273}
274
277{
278 OtherLayersList list;
279
280 KisNodeDummy *rootDummy = m_d->dummiesFacade->rootDummy();
281 if (!rootDummy) return list;
282
283 m_d->findOtherLayers(rootDummy, &list, "");
284 return list;
285}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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