Krita Source Code Documentation
Loading...
Searching...
No Matches
KisWindowLayoutResource Class Reference

#include <KisWindowLayoutResource.h>

+ Inheritance diagram for KisWindowLayoutResource:

Classes

struct  Private
 

Public Member Functions

void applyLayout ()
 
KoResourceSP clone () const override
 
QString defaultFileExtension () const override
 
 KisWindowLayoutResource (const KisWindowLayoutResource &rhs)
 
 KisWindowLayoutResource (const QString &filename)
 
bool loadFromDevice (QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
 
KisWindowLayoutResourceoperator= (const KisWindowLayoutResource &rhs)=delete
 
QPair< QString, QString > resourceType () const override
 
bool saveToDevice (QIODevice *dev) const override
 
 ~KisWindowLayoutResource () override
 
- Public Member Functions inherited from KoResource
bool active () const
 
void addMetaData (QString key, QVariant value)
 store the given key, value pair in the resource
 
virtual void clearSideLoadedResources ()
 
virtual QList< KoResourceLoadResultembeddedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
QString filename () const
 
QImage image () const
 
bool isDirty () const
 
virtual bool isEphemeral () const
 
virtual bool isSerializable () const
 
 KoResource ()
 
 KoResource (const KoResource &rhs)
 
 KoResource (const QString &filename)
 
virtual QList< KoResourceLoadResultlinkedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
bool load (KisResourcesInterfaceSP resourcesInterface)
 
QString md5Sum (bool generateIfEmpty=true) const
 
QMap< QString, QVariant > metadata () const
 get a map with all the metadata
 
virtual QString name () const
 
KoResourceoperator= (const KoResource &rhs)=delete
 
bool permanent () const
 
virtual QList< int > requiredCanvasResources () const
 
QList< KoResourceLoadResultrequiredResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
int resourceId () const
 
bool save ()
 
void setActive (bool active)
 
void setDirty (bool value)
 Mark the preset as modified but not saved.
 
void setFilename (const QString &filename)
 
void setImage (const QImage &image)
 
void setMD5Sum (const QString &md5sum)
 Set the md5sum of this resource. It must be in hex-encoded string format.
 
void setName (const QString &name)
 
void setPermanent (bool permanent)
 
void setResourceId (int id)
 
void setStorageLocation (const QString &location)
 
void setValid (bool valid)
 
void setVersion (int version)
 
virtual QList< KoResourceLoadResultsideLoadedResources (KisResourcesInterfaceSP globalResourcesInterface) const
 
KoResourceSignature signature () const
 
QString storageLocation () const
 
QList< KoResourceLoadResulttakeSideLoadedResources (KisResourcesInterfaceSP globalResourcesInterface)
 
virtual QImage thumbnail () const
 thumbnail the thumbnail image to use in resource selectors
 
virtual QString thumbnailPath () const
 thumbnailPath returns the path to a separate thumbnail image, outside the actual resource file itself. If the path is relative, it is supposed start in the same location as the resource itself. If it's absolute, that is, it starts with "/", it is from the root of the storage.
 
virtual void updateThumbnail ()
 updateThumbnail updates the thumbnail for this resource. Reimplement if your thumbnail is something else than the image set with setImage.
 
bool valid () const
 
int version () const
 Get the version of the resource.
 
virtual ~KoResource ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Static Public Member Functions

static KisWindowLayoutResourceSP fromCurrentWindows (const QString &filename, const QList< QPointer< KisMainWindow > > &mainWindows, bool showImageInAllWindows, bool primaryWorkspaceFollowsFocus, KisMainWindow *primaryWindow)
 

Protected Member Functions

virtual void loadXml (const QDomElement &root) const
 
virtual void saveXml (QDomDocument &doc, QDomElement &root) const
 
void setWindows (const QList< QPointer< KisMainWindow > > &mainWindows)
 

Private Attributes

QScopedPointer< Privated
 

Additional Inherited Members

- Public Attributes inherited from KoResource
bool active {true}
 
QString filename
 
QImage image
 
QString md5sum
 
QMap< QString, QVariant > metadata
 
bool modified {false}
 
QString name
 
bool permanent {false}
 
int resourceId {-1}
 
QString storageLocation
 
bool valid {false}
 
int version {-1}
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Detailed Description

Definition at line 18 of file KisWindowLayoutResource.h.

Constructor & Destructor Documentation

◆ KisWindowLayoutResource() [1/2]

KisWindowLayoutResource::KisWindowLayoutResource ( const QString & filename)
explicit

Definition at line 211 of file KisWindowLayoutResource.cpp.

213 , d(new Private)
214{}
QScopedPointer< Private > d
QString filename

◆ ~KisWindowLayoutResource()

KisWindowLayoutResource::~KisWindowLayoutResource ( )
override

Definition at line 216 of file KisWindowLayoutResource.cpp.

217{}

◆ KisWindowLayoutResource() [2/2]

KisWindowLayoutResource::KisWindowLayoutResource ( const KisWindowLayoutResource & rhs)

Definition at line 219 of file KisWindowLayoutResource.cpp.

220 : KoResource(rhs)
221 , d(new Private(*rhs.d))
222{
223}

Member Function Documentation

◆ applyLayout()

void KisWindowLayoutResource::applyLayout ( )

Definition at line 243 of file KisWindowLayoutResource.cpp.

244{
245 auto *kisPart = KisPart::instance();
246 auto *layoutManager= KisWindowLayoutManager::instance();
247
248 layoutManager->setLastUsedLayout(this);
249
250 QList<QPointer<KisMainWindow>> currentWindows = kisPart->mainWindows();
251
252 if (d->windows.isEmpty()) {
253 // No windows defined (e.g. fresh new session). Leave things as they are, but make sure there's at least one visible main window
254 if (kisPart->mainwindowCount() == 0) {
255 kisPart->createMainWindow();
256 } else {
257 kisPart->mainWindows().first()->show();
258 }
259 } else {
260 d->openNecessaryWindows(currentWindows);
261 d->closeUnneededWindows(currentWindows);
262 }
263
264 // Wait for the windows to finish opening / closing before applying saved geometry.
265 // If we don't, the geometry may get reset after we apply it.
266 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
267
268 Q_FOREACH(const auto &window, d->windows) {
269 QPointer<KisMainWindow> mainWindow = kisPart->windowById(window.windowId);
271
272 mainWindow->restoreGeometry(window.geometry.data);
273 mainWindow->restoreWorkspaceState(window.windowState);
274
275 mainWindow->setCanvasDetached(window.canvasDetached);
276 if (window.canvasDetached) {
277 QWidget *canvasWindow = mainWindow->canvasWindow();
278 canvasWindow->restoreGeometry(window.canvasWindowGeometry.data);
279 }
280 }
281
282 QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
283
284 QList<QScreen*> screens = d->getScreensInConsistentOrder();
285 Q_FOREACH(const auto &window, d->windows) {
286 Private::WindowGeometry geometry = window.geometry;
287 QPointer<KisMainWindow> mainWindow = kisPart->windowById(window.windowId);
289
290 if (geometry.screen >= 0 && geometry.screen < screens.size()) {
291 geometry.forceOntoCorrectScreen(mainWindow, screens);
292 }
293 if (window.canvasDetached) {
294 Private::WindowGeometry canvasWindowGeometry = window.canvasWindowGeometry;
295 if (canvasWindowGeometry.screen >= 0 && canvasWindowGeometry.screen < screens.size()) {
296 canvasWindowGeometry.forceOntoCorrectScreen(mainWindow->canvasWindow(), screens);
297 }
298 }
299 }
300
301 layoutManager->setShowImageInAllWindowsEnabled(d->showImageInAllWindows);
302 layoutManager->setPrimaryWorkspaceFollowsFocus(d->primaryWorkspaceFollowsFocus, d->primaryWindow);
303}
static KisPart * instance()
Definition KisPart.cpp:131
static KisWindowLayoutManager * instance()
#define KIS_SAFE_ASSERT_RECOVER_BREAK(cond)
Definition kis_assert.h:127

References d, KisWindowLayoutResource::Private::WindowGeometry::forceOntoCorrectScreen(), KisPart::instance(), KisWindowLayoutManager::instance(), KIS_SAFE_ASSERT_RECOVER_BREAK, and KisWindowLayoutResource::Private::WindowGeometry::screen.

◆ clone()

KoResourceSP KisWindowLayoutResource::clone ( ) const
overridevirtual

Implements KoResource.

Definition at line 225 of file KisWindowLayoutResource.cpp.

226{
227 return KoResourceSP(new KisWindowLayoutResource(*this));
228}
KisWindowLayoutResource(const QString &filename)
QSharedPointer< KoResource > KoResourceSP

References KisWindowLayoutResource().

◆ defaultFileExtension()

QString KisWindowLayoutResource::defaultFileExtension ( ) const
overridevirtual
Returns
the default file extension which should be used when saving the resource

Reimplemented from KoResource.

Definition at line 407 of file KisWindowLayoutResource.cpp.

408{
409 return QString(".kwl");
410}

◆ fromCurrentWindows()

KisWindowLayoutResourceSP KisWindowLayoutResource::fromCurrentWindows ( const QString & filename,
const QList< QPointer< KisMainWindow > > & mainWindows,
bool showImageInAllWindows,
bool primaryWorkspaceFollowsFocus,
KisMainWindow * primaryWindow )
static

Definition at line 230 of file KisWindowLayoutResource.cpp.

234{
236 resource->setWindows(mainWindows);
237 resource->d->showImageInAllWindows = showImageInAllWindows;
238 resource->d->primaryWorkspaceFollowsFocus = primaryWorkspaceFollowsFocus;
239 resource->d->primaryWindow = primaryWindow->id();
240 return resource;
241}

References KoResource::filename, KisMainWindow::id, and KisWindowLayoutResource().

◆ loadFromDevice()

bool KisWindowLayoutResource::loadFromDevice ( QIODevice * dev,
KisResourcesInterfaceSP resourcesInterface )
overridevirtual

Implements KoResource.

Definition at line 322 of file KisWindowLayoutResource.cpp.

323{
324 Q_UNUSED(resourcesInterface);
325
326 QDomDocument doc;
327 if (!doc.setContent(dev)) {
328 return false;
329 }
330
331 QDomElement element = doc.documentElement();
332 setName(element.attribute("name"));
333
334 d->windows.clear();
335
336 loadXml(element);
337
338 setValid(true);
339 return true;
340}
virtual void loadXml(const QDomElement &root) const
void setValid(bool valid)
void setName(const QString &name)

References d, loadXml(), KoResource::setName(), and KoResource::setValid().

◆ loadXml()

void KisWindowLayoutResource::loadXml ( const QDomElement & root) const
protectedvirtual

Reimplemented in KisSessionResource.

Definition at line 367 of file KisWindowLayoutResource.cpp.

368{
369 d->showImageInAllWindows = KisDomUtils::toInt(element.attribute("showImageInAllWindows", "0"));
370 d->primaryWorkspaceFollowsFocus = KisDomUtils::toInt(element.attribute("primaryWorkspaceFollowsFocus", "0"));
371 d->primaryWindow = QUuid::fromString(element.attribute("primaryWindow"));
372
373#ifdef Q_OS_ANDROID
374 if (element.firstChildElement("window") != element.lastChildElement("window")) {
375 QMessageBox::warning(qApp->activeWindow(), i18nc("@title:window", "Krita"),
376 "Workspaces with multiple windows isn't supported on Android");
377 return;
378 }
379#endif
380
381 for (auto windowElement = element.firstChildElement("window");
382 !windowElement.isNull();
383 windowElement = windowElement.nextSiblingElement("window")) {
384
385 Private::Window window;
386
387 window.windowId = QUuid(windowElement.attribute("id", QUuid().toString()));
388 if (window.windowId.isNull()) {
389 window.windowId = QUuid::createUuid();
390 }
391
392 window.geometry = Private::WindowGeometry::load(windowElement);
393
394 QDomElement canvasWindowElement = windowElement.firstChildElement("canvasWindow");
395 if (!canvasWindowElement.isNull()) {
396 window.canvasDetached = true;
397 window.canvasWindowGeometry = Private::WindowGeometry::load(canvasWindowElement);
398 }
399
400 QDomElement state = windowElement.firstChildElement("windowState");
401 window.windowState = QByteArray::fromBase64(state.text().toLatin1());
402
403 d->windows.append(window);
404 }
405}
int toInt(const QString &str, bool *ok=nullptr)
QString toString(const QString &value)
static WindowGeometry load(const QDomElement &element)

References KisWindowLayoutResource::Private::Window::canvasDetached, KisWindowLayoutResource::Private::Window::canvasWindowGeometry, d, KisWindowLayoutResource::Private::Window::geometry, KisWindowLayoutResource::Private::WindowGeometry::load(), KisDomUtils::toInt(), KisWindowLayoutResource::Private::Window::windowId, and KisWindowLayoutResource::Private::Window::windowState.

◆ operator=()

KisWindowLayoutResource & KisWindowLayoutResource::operator= ( const KisWindowLayoutResource & rhs)
delete

◆ resourceType()

QPair< QString, QString > KisWindowLayoutResource::resourceType ( ) const
inlineoverridevirtual
Returns
the resource type

Implements KoResource.

Definition at line 40 of file KisWindowLayoutResource.h.

41 {
42 return QPair<QString, QString>(ResourceType::WindowLayouts, "");
43 }
const QString WindowLayouts

References ResourceType::WindowLayouts.

◆ saveToDevice()

bool KisWindowLayoutResource::saveToDevice ( QIODevice * dev) const
overridevirtual

Reimplemented from KoResource.

Definition at line 305 of file KisWindowLayoutResource.cpp.

306{
307 QDomDocument doc;
308 QDomElement root = doc.createElement("WindowLayout");
309 root.setAttribute("name", name());
310 root.setAttribute("version", WINDOW_LAYOUT_VERSION);
311
312 saveXml(doc, root);
313
314 doc.appendChild(root);
315
316 QTextStream textStream(dev);
318 doc.save(textStream, 4);
319 return true;
320}
static const int WINDOW_LAYOUT_VERSION
virtual void saveXml(QDomDocument &doc, QDomElement &root) const
void setUtf8OnStream(QTextStream &stream)
QString name

References KoResource::name, saveXml(), KisPortingUtils::setUtf8OnStream(), and WINDOW_LAYOUT_VERSION.

◆ saveXml()

void KisWindowLayoutResource::saveXml ( QDomDocument & doc,
QDomElement & root ) const
protectedvirtual

Reimplemented in KisSessionResource.

Definition at line 342 of file KisWindowLayoutResource.cpp.

343{
344 root.setAttribute("showImageInAllWindows", (int)d->showImageInAllWindows);
345 root.setAttribute("primaryWorkspaceFollowsFocus", (int)d->primaryWorkspaceFollowsFocus);
346 root.setAttribute("primaryWindow", d->primaryWindow.toString());
347
348 Q_FOREACH(const auto &window, d->windows) {
349 QDomElement elem = doc.createElement("window");
350 elem.setAttribute("id", window.windowId.toString());
351
352 window.geometry.save(doc, elem);
353
354 if (window.canvasDetached) {
355 QDomElement canvasWindowElement = doc.createElement("canvasWindow");
356 window.canvasWindowGeometry.save(doc, canvasWindowElement);
357 elem.appendChild(canvasWindowElement);
358 }
359
360 QDomElement state = doc.createElement("windowState");
361 state.appendChild(doc.createCDATASection(window.windowState.toBase64()));
362 elem.appendChild(state);
363 root.appendChild(elem);
364 }
365}

References d.

◆ setWindows()

void KisWindowLayoutResource::setWindows ( const QList< QPointer< KisMainWindow > > & mainWindows)
protected

Definition at line 412 of file KisWindowLayoutResource.cpp.

413{
414 d->windows.clear();
415
416 QList<QScreen*> screens = d->getScreensInConsistentOrder();
417
418 Q_FOREACH(auto window, mainWindows) {
419 if (!window->isVisible()) continue;
420
421 Private::Window state;
422 state.windowId = window->id();
423 state.windowState = window->saveState();
424 state.geometry = Private::WindowGeometry::fromWindow(window, screens);
425
426 state.canvasDetached = window->canvasDetached();
427 if (state.canvasDetached) {
428 state.canvasWindowGeometry = Private::WindowGeometry::fromWindow(window->canvasWindow(), screens);
429 }
430
431 d->windows.append(state);
432 }
433}
static WindowGeometry fromWindow(const QWidget *window, QList< QScreen * > screens)

References KisWindowLayoutResource::Private::Window::canvasDetached, KisWindowLayoutResource::Private::Window::canvasWindowGeometry, d, KisWindowLayoutResource::Private::WindowGeometry::fromWindow(), KisWindowLayoutResource::Private::Window::geometry, KisWindowLayoutResource::Private::Window::windowId, and KisWindowLayoutResource::Private::Window::windowState.

Member Data Documentation

◆ d

QScopedPointer<Private> KisWindowLayoutResource::d
private

Definition at line 57 of file KisWindowLayoutResource.h.


The documentation for this class was generated from the following files: