Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSessionResource.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Jouni Pentikäinen <joupent@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <QDomElement>
9
10#include <KisPart.h>
12#include <KisDocument.h>
13
14#include <ksharedconfig.h>
15#include <KisViewManager.h>
16#include <KisMainWindow.h>
17
18
20{
21 struct View
22 {
23 QUuid windowId;
24 // NOTE: path of the file without scheme
25 QString file;
27
29 Q_FOREACH(KisMainWindow *window, KisPart::instance()->mainWindows()) {
30 if (window->id() == this->windowId) return window;
31 }
32
33 return nullptr;
34 }
35 };
36 QString profileName;
38};
39
41 : KisWindowLayoutResource(filename)
42 , d(new Private)
43{}
44
47
53
58
60{
61 auto *kisPart = KisPart::instance();
62
64
65 QMap<QString, KisDocument *> documents;
66
67 // Find documents which are already open so we don't need to reload them
68 QList<QPointer<KisView>> oldViews = kisPart->views();
69 Q_FOREACH(const QPointer<KisView> view, oldViews) {
70 KisDocument *document = view->document();
71 const QString path = document->path();
72 documents.insert(path, document);
73 }
74
75 Q_FOREACH(auto &viewData, d->views) {
76 QString path = viewData.file;
77
78 KisMainWindow *window = viewData.getWindow();
79
80 if (!window) {
81 qDebug() << "Warning: session file contains inconsistent data.";
82 } else {
83 KisDocument *document = documents.value(path);
84
85 if (!document) {
86 document = kisPart->createDocument();
87
88 bool ok = document->openPath(path);
89 if (!ok) {
90 delete document;
91 continue;
92 }
93
94 kisPart->addDocument(document);
95 documents.insert(path, document);
96 }
97 //update profile
98 QString profileName;
99 profileName = d->profileName;
100 window->viewManager()->changeAuthorProfile(profileName);
102
103
104 KisView *view = window->newView(document);
105 view->restoreViewState(viewData.viewConfig);
106 }
107 }
108
109 Q_FOREACH(QPointer<KisView> view, oldViews) {
110 view->closeView();
111 }
112
113}
114
115
117{
118 return ".ksn";
119}
120
122{
123 KisPart *kisPart = KisPart::instance();
124 const auto &windows = kisPart->mainWindows();
125 setWindows(windows);
126
127 d->views.clear();
128 Q_FOREACH(const KisView *view, kisPart->views()) {
129 if (view->document()->path().isEmpty()) continue;
130
131 auto viewData = Private::View();
132 viewData.windowId = view->mainWindow()->id();
133 viewData.file = view->document()->path();
134 view->saveViewState(viewData.viewConfig);
135 d->views.append(viewData);
136 }
137
138 setValid(true);
139}
140
141void KisSessionResource::saveXml(QDomDocument &doc, QDomElement &root) const
142{
144
145 Q_FOREACH(const auto view, d->views) {
146 QDomElement elem = doc.createElement("view");
147
148 elem.setAttribute("window", view.windowId.toString());
149 // we convert to QUrl to maintain compatibility with Krita 4.4
150 elem.setAttribute("src", QUrl::fromLocalFile(view.file).toString());
151 view.viewConfig.toXML(doc, elem);
152
153 root.appendChild(elem);
154
155 // Save profile
156 KConfigGroup appAuthorGroup(KSharedConfig::openConfig(), "Author");
157 QString profileName = appAuthorGroup.readEntry("active-profile", "");
158
159 QDomElement session = doc.createElement("session");
160 session.setAttribute("profile", profileName);
161 root.appendChild(session);
162
163 }
164
165}
166
167void KisSessionResource::loadXml(const QDomElement &root) const
168{
170
171 d->views.clear();
172 for (auto viewElement = root.firstChildElement("view");
173 !viewElement.isNull();
174 viewElement = viewElement.nextSiblingElement("view")) {
175 Private::View view;
176
177 view.file = QUrl(viewElement.attribute("src")).toLocalFile();
178 view.windowId = QUuid(viewElement.attribute("window"));
179 view.viewConfig.fromXML(viewElement);
180
181 d->views.append(view);
182 }
183 //Load session
184 d->profileName.clear();
185 auto sessionElement = root.firstChildElement("session");
186 d->profileName = QString(sessionElement.attribute("profile"));
187
188}
bool openPath(const QString &path, OpenFlags flags=None)
openPath Open a Path
Main window for Krita.
KisView * newView(QObject *document, QMdiSubWindow *subWindow=0)
KisViewManager * viewManager
QList< QPointer< KisMainWindow > > mainWindows
Definition KisPart.cpp:107
static KisPart * instance()
Definition KisPart.cpp:131
QList< QPointer< KisView > > views
Definition KisPart.cpp:106
KoResourceSP clone() const override
QString defaultFileExtension() const override
void saveXml(QDomDocument &doc, QDomElement &root) const override
QScopedPointer< Private > d
KisSessionResource(const QString &filename)
void loadXml(const QDomElement &root) const override
void slotUpdateAuthorProfileActions()
void changeAuthorProfile(const QString &profileName)
KisMainWindow * mainWindow() const
Definition KisView.cpp:1093
void restoreViewState(const KisPropertiesConfiguration &config)
Definition KisView.cpp:1293
QPointer< KisDocument > document
Definition KisView.cpp:121
void saveViewState(KisPropertiesConfiguration &config) const
Definition KisView.cpp:1276
void setWindows(const QList< QPointer< KisMainWindow > > &mainWindows)
virtual void saveXml(QDomDocument &doc, QDomElement &root) const
virtual void loadXml(const QDomElement &root) const
QSharedPointer< KoResource > KoResourceSP
bool fromXML(const QString &xml, bool clear=true) override
KisPropertiesConfiguration viewConfig
void setValid(bool valid)