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 KisDocument *curDoc = curDocument();
60 if (curDoc && doc) {
61 curDoc->copyFromDocument(*doc);
68 }
69 // FIXME: more things need to be done
70 return true;
71 }
72 return false;
73}
74
76 : QAbstractListModel()
77 , m_d(new Private)
78{
79}
80
84
85int KisSnapshotModel::rowCount(const QModelIndex &parent) const
86{
87 if (parent.isValid()) {
88 return 0;
89 } else {
90 return m_d->curDocList.size();
91 }
92}
93
94QVariant KisSnapshotModel::data(const QModelIndex &index, int role) const
95{
96 if (!index.isValid() || index.row() >= rowCount(QModelIndex())) {
97 return QVariant();
98 }
99 int i = index.row();
100 switch (role) {
101 case Qt::DisplayRole:
102 case Qt::EditRole:
103 return m_d->curDocList[i].first;
104 break;
105 }
106 return QVariant();
107}
108
109bool KisSnapshotModel::setData(const QModelIndex &index, const QVariant &value, int role)
110{
111 if (!index.isValid() || index.row() >= rowCount(QModelIndex())) {
112 return false;
113 }
114 int i = index.row();
115 switch (role) {
116 case Qt::DisplayRole:
117 case Qt::EditRole:
118 m_d->curDocList[i].first = value.toString();
119 Q_EMIT dataChanged(index, index);
120 return true;
121 break;
122 }
123 return false;
124}
125
126Qt::ItemFlags KisSnapshotModel::flags(const QModelIndex &index) const
127{
128 if (!index.isValid()) {
129 return Qt::ItemIsEnabled;
130 }
131
132 return QAbstractListModel::flags(index) | Qt::ItemIsEditable;
133}
134
136{
137 if (m_d->curCanvas == canvas) {
138 return;
139 }
140
141 m_d->curNameServer.reset();
142
143 if (m_d->curDocument()) {
144 m_d->documentGroups.insert(m_d->curDocument(), m_d->curDocList);
145 } else {
146 Q_FOREACH (auto const &i, m_d->curDocList) {
147 delete i.second.data();
148 }
149 }
150
151 if (!m_d->curDocList.isEmpty()) {
152 beginRemoveRows(QModelIndex(), 0, m_d->curDocList.size() - 1);
153 m_d->curDocList.clear();
154 endRemoveRows();
155 }
156 m_d->curCanvas = canvas;
157
158 QPointer<KisDocument> curDoc = m_d->curDocument();
159 if (curDoc) {
160 Private::DocPList docList = m_d->documentGroups.take(curDoc);
161 beginInsertRows(QModelIndex(), docList.size(), docList.size());
162 m_d->curDocList = docList;
163 endInsertRows();
164
165 QSharedPointer<KisNameServer> nameServer = m_d->nameServers[curDoc];
166 if (!nameServer) {
167 nameServer.reset(new KisNameServer);
168 m_d->nameServers.insert(curDoc, nameServer);
169 }
170 m_d->curNameServer = nameServer;
171 }
172
173}
174
176{
177 if (!m_d->curDocument()) {
178 return false;
179 }
180 QPointer<KisDocument> clonedDoc(m_d->curDocument()->lockAndCreateSnapshot());
181 if (clonedDoc) {
182 beginInsertRows(QModelIndex(), m_d->curDocList.size(), m_d->curDocList.size());
183 m_d->curDocList << qMakePair(i18nc("snapshot names, e.g. \"Snapshot 1\"", "Snapshot %1", m_d->curNameServer->number()), clonedDoc);
184 endInsertRows();
185 return true;
186 }
187 return false;
188}
189
190bool KisSnapshotModel::slotRemoveSnapshot(const QModelIndex &index)
191{
192 if (!index.isValid() || index.row() >= m_d->curDocList.size()) {
193 return false;
194 }
195 int i = index.row();
196 beginRemoveRows(QModelIndex(), i, i);
197 QPair<QString, QPointer<KisDocument> > pair = m_d->curDocList.takeAt(i);
198 endRemoveRows();
199 delete pair.second.data();
200 return true;
201}
202
203bool KisSnapshotModel::slotSwitchToSnapshot(const QModelIndex &index)
204{
205 if (!index.isValid() || index.row() >= m_d->curDocList.size()) {
206 return false;
207 }
208
209 return m_d->switchToDocument(m_d->curDocList[index.row()].second);
210}
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