Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSnapshotModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2019 Tusooa Zhu <tusooa@vista.aero>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "KisSnapshotModel.h"
8
9#include <QMap>
10#include <QList>
11#include <QPointer>
12#include <QPair>
13#include <QString>
14
15#include <KisDocument.h>
16#include <KisView.h>
17#include <KisViewManager.h>
18#include <kis_node_manager.h>
19#include <kis_name_server.h>
21
39
43
47
49{
50 if (curCanvas && curCanvas->imageView()) {
51 return curCanvas->imageView()->document();
52 }
53 return 0;
54}
55
57{
58 if (curCanvas && curCanvas->imageView()) {
59 KisView *view = curCanvas->imageView();
60 KisDocument *curDoc = curDocument();
61 if (curDoc && doc) {
62 curDoc->copyFromDocument(*doc);
69 }
70 // FIXME: more things need to be done
71 return true;
72 }
73 return false;
74}
75
77 : QAbstractListModel()
78 , m_d(new Private)
79{
80}
81
85
86int KisSnapshotModel::rowCount(const QModelIndex &parent) const
87{
88 if (parent.isValid()) {
89 return 0;
90 } else {
91 return m_d->curDocList.size();
92 }
93}
94
95QVariant KisSnapshotModel::data(const QModelIndex &index, int role) const
96{
97 if (!index.isValid() || index.row() >= rowCount(QModelIndex())) {
98 return QVariant();
99 }
100 int i = index.row();
101 switch (role) {
102 case Qt::DisplayRole:
103 case Qt::EditRole:
104 return m_d->curDocList[i].first;
105 break;
106 }
107 return QVariant();
108}
109
110bool KisSnapshotModel::setData(const QModelIndex &index, const QVariant &value, int role)
111{
112 if (!index.isValid() || index.row() >= rowCount(QModelIndex())) {
113 return false;
114 }
115 int i = index.row();
116 switch (role) {
117 case Qt::DisplayRole:
118 case Qt::EditRole:
119 m_d->curDocList[i].first = value.toString();
120 Q_EMIT dataChanged(index, index);
121 return true;
122 break;
123 }
124 return false;
125}
126
127Qt::ItemFlags KisSnapshotModel::flags(const QModelIndex &index) const
128{
129 if (!index.isValid()) {
130 return Qt::ItemIsEnabled;
131 }
132
133 return QAbstractListModel::flags(index) | Qt::ItemIsEditable;
134}
135
137{
138 if (m_d->curCanvas == canvas) {
139 return;
140 }
141
142 m_d->curNameServer.reset();
143
144 if (m_d->curDocument()) {
145 m_d->documentGroups.insert(m_d->curDocument(), m_d->curDocList);
146 } else {
147 Q_FOREACH (auto const &i, m_d->curDocList) {
148 delete i.second.data();
149 }
150 }
151
152 if (!m_d->curDocList.isEmpty()) {
153 beginRemoveRows(QModelIndex(), 0, m_d->curDocList.size() - 1);
154 m_d->curDocList.clear();
155 endRemoveRows();
156 }
157 m_d->curCanvas = canvas;
158
159 QPointer<KisDocument> curDoc = m_d->curDocument();
160 if (curDoc) {
161 Private::DocPList docList = m_d->documentGroups.take(curDoc);
162 beginInsertRows(QModelIndex(), docList.size(), docList.size());
163 m_d->curDocList = docList;
164 endInsertRows();
165
166 QSharedPointer<KisNameServer> nameServer = m_d->nameServers[curDoc];
167 if (!nameServer) {
168 nameServer.reset(new KisNameServer);
169 m_d->nameServers.insert(curDoc, nameServer);
170 }
171 m_d->curNameServer = nameServer;
172 }
173
174}
175
177{
178 if (!m_d->curDocument()) {
179 return false;
180 }
181 QPointer<KisDocument> clonedDoc(m_d->curDocument()->lockAndCreateSnapshot());
182 if (clonedDoc) {
183 beginInsertRows(QModelIndex(), m_d->curDocList.size(), m_d->curDocList.size());
184 m_d->curDocList << qMakePair(i18nc("snapshot names, e.g. \"Snapshot 1\"", "Snapshot %1", m_d->curNameServer->number()), clonedDoc);
185 endInsertRows();
186 return true;
187 }
188 return false;
189}
190
191bool KisSnapshotModel::slotRemoveSnapshot(const QModelIndex &index)
192{
193 if (!index.isValid() || index.row() >= m_d->curDocList.size()) {
194 return false;
195 }
196 int i = index.row();
197 beginRemoveRows(QModelIndex(), i, i);
198 QPair<QString, QPointer<KisDocument> > pair = m_d->curDocList.takeAt(i);
199 endRemoveRows();
200 delete pair.second.data();
201 return true;
202}
203
204bool KisSnapshotModel::slotSwitchToSnapshot(const QModelIndex &index)
205{
206 if (!index.isValid() || index.row() >= m_d->curDocList.size()) {
207 return false;
208 }
209
210 return m_d->switchToDocument(m_d->curDocList[index.row()].second);
211}
float value(const T *src, size_t ch)
KisImageSP image
void copyFromDocument(const KisDocument &rhs)
KisNodeWSP preActivatedNode
void emitNotification(KisImageSignalType type)
KisImageSignalRouter * signalRouter()
bool slotRemoveSnapshot(const QModelIndex &index)
bool slotSwitchToSnapshot(const QModelIndex &index)
Qt::ItemFlags flags(const QModelIndex &index) const override
QVariant data(const QModelIndex &index, int role) const override
int rowCount(const QModelIndex &parent) const override
~KisSnapshotModel() override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QScopedPointer< Private > m_d
void setCanvas(QPointer< KisCanvas2 > canvas)
bool switchToDocument(QPointer< KisDocument > doc)
QMap< KisDocument *, DocPList > documentGroups
QPointer< KisCanvas2 > curCanvas
QSharedPointer< KisNameServer > curNameServer
QPointer< KisDocument > curDocument()
QMap< KisDocument *, QSharedPointer< KisNameServer > > nameServers