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

#include <KisDocument.h>

+ Inheritance diagram for KisDocument:

Public Types

enum  OpenFlag { None = 0 , DontAddToRecent = 0x1 , RecoveryFile = 0x2 }
 

Signals

void canceled (const QString &)
 
void clearStatusBarMessage ()
 
void completed ()
 
void modified (bool)
 
void sigAssistantsChanged ()
 
void sigAudioLevelChanged (qreal level)
 
void sigAudioTracksChanged ()
 
void sigBackgroundSavingFinished (KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
 
void sigCompleteBackgroundSaving (const KritaUtils::ExportFileJob &job, KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
 
void sigGridConfigChanged (const KisGridConfig &config)
 
void sigGuidesConfigChanged (const KisGuidesConfig &config)
 
void sigLoadingFinished ()
 
void sigMirrorAxisConfigChanged ()
 
void sigPaletteListChanged (const QList< KoColorSetSP > &oldPaletteList, const QList< KoColorSetSP > &newPaletteList)
 
void sigPathChanged (const QString &path)
 
void sigReadWriteChanged (bool value)
 
void sigRecoveredChanged (bool value)
 
void sigReferenceImagesChanged ()
 
void sigReferenceImagesLayerChanged (KisSharedPtr< KisReferenceImagesLayer > layer)
 
void sigSavingFinished (const QString &filePath)
 
void sigStoryboardCommentListChanged ()
 
void sigStoryboardItemListChanged ()
 
void statusBarMessage (const QString &text, int timeout=0)
 
void unitChanged (const KoUnit &unit)
 

Public Member Functions

QList< KisPaintingAssistantSPassistants () const
 
QColor assistantsGlobalColor ()
 
void autoSaveOnPause ()
 Start saving when android activity is pushed to the background.
 
QString caption () const
 
void clearUndoHistory ()
 
KisDocumentclone (bool addStorage=false)
 creates a clone of the document and returns it. Please make sure that you hold all the necessary locks on the image before asking for a clone!
 
bool closePath (bool promptToSave=true)
 
QList< KoColorcolorHistory ()
 
void copyFrom (const Private &rhs, KisDocument *q)
 
void copyFromDocument (const KisDocument &rhs)
 
void copyFromImpl (const Private &rhs, KisDocument *q, KisDocument::CopyPolicy policy)
 
KoDocumentInfoDlgcreateDocumentInfoDialog (QWidget *parent, KoDocumentInfo *docInfo) const
 
QDomDocument createDomDocument (const QString &tagName, const QString &version) const
 
KisUndoStorecreateUndoStore ()
 
QRectF documentBounds () const
 
KoDocumentInfodocumentInfo () const
 
QString embeddedResourcesStorageId () const
 
QString errorMessage () const
 
bool exportDocument (const QString &path, const QByteArray &mimeType, bool isAdvancedExporting=false, bool showWarnings=false, KisPropertiesConfigurationSP exportConfiguration=0)
 
bool exportDocumentSync (const QString &path, const QByteArray &mimeType, KisPropertiesConfigurationSP exportConfiguration=0)
 
bool fileBatchMode () const
 
QPixmap generatePreview (const QSize &size)
 Generates a preview picture of the document.
 
qreal getAudioLevel ()
 
QVector< QFileInfo > getAudioTracks () const
 
QVector< StoryboardCommentgetStoryboardCommentsList ()
 returns the list of comments for the storyboard docker in the document
 
StoryboardItemList getStoryboardItemList ()
 returns the list of pointers to storyboard Items for the document
 
KisGridConfig gridConfig () const
 
const KisGuidesConfigguidesConfig () const
 returns the guides data for this document.
 
void hackPreliminarySetImage (KisImageSP image)
 
KisImageWSP image () const
 
bool importDocument (const QString &path)
 
KisImportExportManagerimportExportManager () const
 importExportManager gives access to the internal import/export manager
 
bool isAutoSaveActive ()
 
bool isAutosaving () const
 
bool isInSaving () const
 isInSaving shown if the document has any (background) saving process or not
 
bool isModified () const
 
bool isNativeFormat (const QByteArray &mimeType) const
 Checks whether a given mimeType can be handled natively.
 
bool isReadWrite () const
 
bool isRecovered () const
 
bool isSaving () const
 
QList< KoResourceLoadResultlinkedDocumentResources ()
 linkedDocumentResources List returns all the resources linked to the document, such as palettes
 
QString linkedResourcesStorageId () const
 
bool loadNativeFormat (const QString &file)
 
QString localFilePath () const
 
KisDocumentlockAndCloneForSaving ()
 try to clone the image. This method handles all the locking for you. If locking has failed, no cloning happens
 
KisDocumentlockAndCloneImpl (bool fetchResourcesFromLayers)
 
KisDocumentlockAndCreateSnapshot ()
 
QByteArray mimeType () const
 
const KisMirrorAxisConfigmirrorAxisConfig () const
 
bool newImage (const QString &name, qint32 width, qint32 height, const KoColorSpace *cs, const KoColor &bgColor, KisConfig::BackgroundStyle bgStyle, int numberOfLayers, const QString &imageDescription, const double imageResolution)
 
bool openPath (const QString &path, OpenFlags flags=None)
 openPath Open a Path
 
QString path () const
 
KisNodeSP preActivatedNode () const
 
 Private (const Private &rhs, KisDocument *_q)
 
 Private (KisDocument *_q)
 
KisSharedPtr< KisReferenceImagesLayerreferenceImagesLayer () const
 
void removeAutoSaveFiles (const QString &autosaveBaseName, bool wasRecovered)
 
void resetPath ()
 
bool save (bool showWarnings, KisPropertiesConfigurationSP exportConfiguration)
 
bool saveAs (const QString &path, const QByteArray &mimeType, bool showWarnings, KisPropertiesConfigurationSP exportConfiguration=0)
 
KisImageSP savingImage () const
 savingImage provides a detached, shallow copy of the original image that must be used when saving. Any strokes in progress will not be applied to this image, so the result might be missing some data. On the other hand, it won't block.
 
QByteArray serializeToNativeByteArray ()
 serializeToNativeByteArray daves the document into a .kra file written to a memory-based byte-array
 
void setAssistants (const QList< KisPaintingAssistantSP > &value)
 @replace the current list of assistants with
 
void setAssistantsGlobalColor (QColor color)
 
void setAudioTracks (QVector< QFileInfo > f)
 
void setAudioVolume (qreal level)
 
void setAutoSaveActive (bool autoSaveIsActive)
 
void setColorHistory (const QList< KoColor > &colors)
 
void setCurrentImage (KisImageSP image, bool forceInitialUpdate=true, KisNodeSP preActivatedNode=nullptr)
 
void setEmergencyAutoSaveInterval ()
 
void setEmpty (bool empty=true)
 Sets the document to empty.
 
void setErrorMessage (const QString &errMsg)
 
void setFileBatchMode (const bool batchMode)
 
void setGridConfig (const KisGridConfig &config)
 
void setGuidesConfig (const KisGuidesConfig &data)
 
void setImageAndInitIdleWatcher (KisImageSP _image)
 
void setInfiniteAutoSaveInterval ()
 
void setLocalFilePath (const QString &localFilePath)
 
void setMimeType (const QByteArray &mimeType)
 Sets the mime type for the document.
 
void setMimeTypeAfterLoading (const QString &mimeType)
 
void setMirrorAxisConfig (const KisMirrorAxisConfig &config)
 
void setModified (bool _mod)
 
void setNormalAutoSaveInterval ()
 
void setPaletteList (const QList< KoColorSetSP > &paletteList, bool emitSignal=false)
 setPaletteList replaces the palettes in the document's local resource storage with the list of palettes passed to this function. It will then Q_EMIT sigPaletteListChanged with both the old and the new list, if emitSignal is true.
 
void setPath (const QString &path)
 
void setPreActivatedNode (KisNodeSP activatedNode)
 
void setReadWrite (bool readwrite=true)
 Sets whether the document can be edited or is read only.
 
void setRecovered (bool value)
 
void setReferenceImagesLayer (KisSharedPtr< KisReferenceImagesLayer > layer, bool updateImage)
 
void setStoryboardCommentList (const QVector< StoryboardComment > &storyboardCommentList, bool emitSignal=false)
 sets the list of comments for the storyboard docker in the document, emits empty signal if emitSignal is true.
 
void setStoryboardItemList (const StoryboardItemList &storyboardItemList, bool emitSignal=false)
 sets the storyboardItemList in the document, emits empty signal if emitSignal is true.
 
void setUnit (const KoUnit &unit)
 
void setWarningMessage (const QString &warningMsg)
 
KoShapeControllerBaseshapeController () const
 
KoShapeLayershapeForNode (KisNodeSP layer) const
 
void syncDecorationsWrapperLayerState ()
 
KUndo2StackundoStack ()
 
KoUnit unit () const
 
void updateDocumentMetadataOnSaving (const QString &filePath, const QByteArray &mimeType)
 
void updateEditingTime (bool forceStoreElapsed)
 
void uploadLinkedResourcesFromLayersToStorage ()
 
void waitForSavingToComplete ()
 
QString warningMessage () const
 
 ~KisDocument ()
 
 ~Private ()
 

Static Public Member Functions

static QDomDocument createDomDocument (const QString &appName, const QString &tagName, const QString &version)
 
static QStringList extraNativeMimeTypes ()
 
static QByteArray nativeFormatMimeType ()
 

Public Attributes

QList< KisPaintingAssistantSPassistants
 
qreal audioLevel = 1.0
 
QVector< QFileInfo > audioTracks
 
bool autoSaveActive = true
 
int autoSaveDelay = 300
 
int autoSaveFailureCount = 0
 
QTimer * autoSaveTimer
 
QScopedPointer< KisDocumentbackgroundSaveDocument
 
KritaUtils::ExportFileJob backgroundSaveJob
 
bool batchMode { false }
 
QFuture< KisImportExportErrorCodechildSavingFuture
 
QList< KoColorcolorHistory
 
bool decorationsSyncingDisabled = false
 
bool disregardAutosaveFailure = false
 
KoDocumentInfodocInfo = 0
 
bool documentIsClosing = false
 
QString embeddedResourcesStorageID
 
KisResourceStorageSP embeddedResourceStorage
 
QDateTime firstMod
 
QColor globalAssistantsColor
 
KisGridConfig gridConfig
 
KisGuidesConfig guidesConfig
 
KisImageSP image
 
QScopedPointer< KisSignalAutoConnectionimageIdleConnection
 
KisIdleWatcher imageIdleWatcher
 
bool imageModifiedWithoutUndo = false
 
KisImportExportManagerimportExportManager = 0
 
bool isAutosaving = false
 
bool isRecovered = false
 
KoShapeControllerkoShapeController = 0
 
QString lastErrorMessage
 
QDateTime lastMod
 
QString lastWarningMessage
 
QString linkedResourcesStorageID
 
KisResourceStorageSP linkedResourceStorage
 
bool m_bAutoDetectedMime = false
 
QString m_file
 
QString m_path
 
QVector< StoryboardCommentm_storyboardCommentList
 
StoryboardItemList m_storyboardItemList
 
QByteArray mimeType
 
KisMirrorAxisConfig mirrorAxisConfig
 
bool modified = false
 
bool modifiedAfterAutosave = false
 
bool modifiedWhileSaving = false
 
KisNameServernserver
 
QByteArray outputMimeType
 
KisNodeWSP preActivatedNode
 
KisDocumentq = 0
 
bool readwrite = false
 
KisSignalAutoConnectionsStore referenceLayerConnections
 
KisImageSP savingImage
 
QMutex savingMutex
 
QPointer< KoUpdatersavingUpdater
 
KisShapeControllershapeController = 0
 
KUndo2StackundoStack = 0
 
KoUnit unit
 
bool wasStorageAdded = false
 

Protected Member Functions

 KisDocument (bool addStorage=true)
 
 KisDocument (const KisDocument &rhs, bool addStorage)
 KisDocument makes a deep copy of the document rhs. The caller must ensure that the image is properly locked and is in consistent state before asking for cloning.
 

Private Types

enum  CopyPolicy { CONSTRUCT = 0 , REPLACE }
 

Private Slots

void finishExportInBackground ()
 
void setImageModified ()
 
void setImageModifiedWithoutUndo ()
 
void slotAutoSave ()
 
void slotChildCompletedSavingInBackground (KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
 
void slotCompleteAutoSaving (const KritaUtils::ExportFileJob &job, KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
 
void slotCompleteSavingDocument (const KritaUtils::ExportFileJob &job, KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
 
void slotConfigChanged ()
 
void slotDocumentCloningCancelled ()
 
void slotImageRootChanged ()
 
void slotInitiateAsyncAutosaving (KisDocument *clonedDocument)
 
void slotPerformIdleRoutines ()
 
void slotUndoStackCleanChanged (bool value)
 

Private Member Functions

void copyFromDocumentImpl (const KisDocument &rhs, CopyPolicy policy)
 
bool exportDocumentImpl (const KritaUtils::ExportFileJob &job, KisPropertiesConfigurationSP exportConfiguration, bool isAdvancedExporting=false)
 
QString exportErrorToUserMessage (KisImportExportErrorCode status, const QString &errorMessage)
 
QString generateAutoSaveFileName (const QString &path) const
 
KritaUtils::BackgroudSavingStartResult initiateSavingInBackground (const QString actionName, const QObject *receiverObject, const char *receiverMethod, const KritaUtils::ExportFileJob &job, KisPropertiesConfigurationSP exportConfiguration, bool isAdvancedExporting=false)
 
KritaUtils::BackgroudSavingStartResult initiateSavingInBackground (const QString actionName, const QObject *receiverObject, const char *receiverMethod, const KritaUtils::ExportFileJob &job, KisPropertiesConfigurationSP exportConfiguration, std::unique_ptr< KisDocument > &&optionalClonedDocument, bool isAdvancedExporting=false)
 
QString newObjectName ()
 
bool openFile ()
 
bool openPathInternal (const QString &path)
 
QString prettyPath () const
 
bool resourceSavingFilter (const QString &path, const QByteArray &mimeType, KisPropertiesConfigurationSP exportConfiguration)
 
void setAutoSaveDelay (int delay)
 
void slotAutoSaveImpl (std::unique_ptr< KisDocument > &&optionalClonedDocument)
 
bool startExportInBackground (const QString &actionName, const QString &location, const QString &realLocation, const QByteArray &mimeType, bool showWarnings, KisPropertiesConfigurationSP exportConfiguration, bool isAdvancedExporting=false)
 
- Private Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Private Attributes

Private *const d
 
- Private Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Friends

class KisPart
 
class SafeSavingLocker
 

Detailed Description

KisDocument contains the image and keeps track of loading, modification, undo stack and saving.

Definition at line 294 of file KisDocument.cpp.

Member Enumeration Documentation

◆ CopyPolicy

Enumerator
CONSTRUCT 

we are copy-constructing a new KisDocument

REPLACE 

we are replacing the current KisDocument with another

Definition at line 722 of file KisDocument.h.

722 {
723 CONSTRUCT = 0,
724 REPLACE
725 };
@ CONSTRUCT
we are copy-constructing a new KisDocument
@ REPLACE
we are replacing the current KisDocument with another

◆ OpenFlag

Enumerator
None 
DontAddToRecent 
RecoveryFile 

Definition at line 79 of file KisDocument.h.

79 {
80 None = 0,
81 DontAddToRecent = 0x1,
82 RecoveryFile = 0x2
83 };

Constructor & Destructor Documentation

◆ ~Private()

KisDocument::~Private ( )
inline

Definition at line 337 of file KisDocument.cpp.

337 {
338 // Don't delete m_d->shapeController because it's in a QObject hierarchy.
339 delete nserver;
340 }
KisNameServer * nserver

◆ KisDocument() [1/2]

KisDocument::KisDocument ( bool addStorage = true)
explicitprotected

Definition at line 602 of file KisDocument.cpp.

603 : d(new Private(this))
604{
605 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
606 connect(d->undoStack, SIGNAL(cleanChanged(bool)), this, SLOT(slotUndoStackCleanChanged(bool)));
607 connect(d->autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
608 setObjectName(newObjectName());
609
610#ifdef Q_OS_MACOS
612 if (bookmarkmngr->isSandboxed()) {
613 connect(this, SIGNAL(sigSavingFinished(const QString&)), bookmarkmngr, SLOT(slotCreateBookmark(const QString&)));
614 }
615#endif
616
617
618 if (addStorage) {
619 d->linkedResourcesStorageID = QUuid::createUuid().toString();
620 d->linkedResourceStorage.reset(new KisResourceStorage(d->linkedResourcesStorageID));
621 KisResourceLocator::instance()->addStorage(d->linkedResourcesStorageID, d->linkedResourceStorage);
622
623 d->embeddedResourcesStorageID = QUuid::createUuid().toString();
624 d->embeddedResourceStorage.reset(new KisResourceStorage(d->embeddedResourcesStorageID));
625 KisResourceLocator::instance()->addStorage(d->embeddedResourcesStorageID, d->embeddedResourceStorage);
626
627 d->wasStorageAdded = true;
628 }
629
630 // preload the krita resources
632
633 d->shapeController = new KisShapeController(d->nserver, d->undoStack, this);
634 d->koShapeController = new KoShapeController(0, d->shapeController);
635
637}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisConfigNotifier * instance()
void slotUndoStackCleanChanged(bool value)
void slotAutoSave()
Private *const d
void sigSavingFinished(const QString &filePath)
QString newObjectName()
void slotConfigChanged()
static KisMacosSecurityBookmarkManager * instance()
bool addStorage(const QString &storageLocation, KisResourceStorageSP storage)
addStorage Adds a new resource storage to the database. The storage is will be marked as not pre-inst...
static KisResourceLocator * instance()
static KisResourceServerProvider * instance()

References KisResourceLocator::addStorage(), connect(), KisConfigNotifier::instance(), KisMacosSecurityBookmarkManager::instance(), KisResourceLocator::instance(), KisResourceServerProvider::instance(), and KisMacosSecurityBookmarkManager::isSandboxed().

◆ KisDocument() [2/2]

KisDocument::KisDocument ( const KisDocument & rhs,
bool addStorage )
explicitprotected

KisDocument makes a deep copy of the document rhs. The caller must ensure that the image is properly locked and is in consistent state before asking for cloning.

Parameters
rhsthe source document to copy from

Definition at line 639 of file KisDocument.cpp.

640 : QObject(),
641 d(new Private(*rhs.d, this))
642{
644
645 if (addStorage) {
646 KisResourceLocator::instance()->addStorage(d->linkedResourcesStorageID, d->linkedResourceStorage);
647 KisResourceLocator::instance()->addStorage(d->embeddedResourcesStorageID, d->embeddedResourceStorage);
648 d->wasStorageAdded = true;
649 }
650}
void copyFromDocumentImpl(const KisDocument &rhs, CopyPolicy policy)

References KisResourceLocator::addStorage(), CONSTRUCT, copyFromDocumentImpl(), d, and KisResourceLocator::instance().

◆ ~KisDocument()

KisDocument::~KisDocument ( )

Destructor.

The destructor does not delete any attached KisView objects and it does not delete the attached widget as returned by widget().

Push a timebomb, which will try to release the memory after the document has been deleted

WARNING: We should wait for all the internal image jobs to finish before entering KisImage's destructor. The problem is, while execution of KisImage::~KisImage, all the weak shared pointers pointing to the image enter an inconsistent state(!). The shared counter is already zero and destruction has started, but the weak reference doesn't know about it, because KisShared::~KisShared hasn't been executed yet. So all the threads running in background and having weak pointers will enter the KisImage's destructor as well.

Definition at line 652 of file KisDocument.cpp.

653{
654 d->documentIsClosing = true;
655
656 // wait until all the pending operations are in progress
658 d->imageIdleWatcher.setTrackedImage(0);
659
665
666 d->autoSaveTimer->disconnect(this);
667 d->autoSaveTimer->stop();
668
669 delete d->importExportManager;
670
671 // Despite being QObject they needs to be deleted before the image
672 delete d->shapeController;
673
674 delete d->koShapeController;
675
676 if (d->image) {
677 d->image->animationInterface()->blockBackgroundFrameGeneration();
678
679 d->image->notifyAboutToBeDeleted();
680
693 d->image->requestStrokeCancellation();
694 d->image->waitForDone();
695
696 // clear undo commands that can still point to the image
697 d->undoStack->clear();
698 d->image->waitForDone();
699
700 KisImageWSP sanityCheckPointer = d->image;
701 Q_UNUSED(sanityCheckPointer);
702
703 // The following line trigger the deletion of the image
704 d->image.clear();
705
706 // check if the image has actually been deleted
707 KIS_SAFE_ASSERT_RECOVER_NOOP(!sanityCheckPointer.isValid());
708 }
709
710 if (d->wasStorageAdded) {
711 if (KisResourceLocator::instance()->hasStorage(d->linkedResourcesStorageID)) {
712 KisResourceLocator::instance()->removeStorage(d->linkedResourcesStorageID);
713 }
714 if (KisResourceLocator::instance()->hasStorage(d->embeddedResourcesStorageID)) {
715 KisResourceLocator::instance()->removeStorage(d->embeddedResourcesStorageID);
716 }
717 }
718
719 delete d;
720}
void waitForSavingToComplete()
static MemoryReleaseObject * createMemoryReleaseObject()
bool removeStorage(const QString &storageLocation)
removeStorage removes the temporary storage from the database
bool isValid() const
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130

References KisPaintDevice::createMemoryReleaseObject(), d, KisResourceLocator::instance(), KisWeakSharedPtr< T >::isValid(), KIS_SAFE_ASSERT_RECOVER_NOOP, KisResourceLocator::removeStorage(), and waitForSavingToComplete().

Member Function Documentation

◆ assistants()

QList< KisPaintingAssistantSP > KisDocument::assistants ( ) const
Returns
the list of assistants associated with this document

◆ assistantsGlobalColor()

QColor KisDocument::assistantsGlobalColor ( )

Definition at line 2872 of file KisDocument.cpp.

2873{
2874 return d->globalAssistantsColor;
2875}

References d.

◆ autoSaveOnPause()

void KisDocument::autoSaveOnPause ( )

Start saving when android activity is pushed to the background.

Definition at line 2035 of file KisDocument.cpp.

2036{
2037 if (!d->modified || !d->modifiedAfterAutosave)
2038 return;
2039
2040 const QString autoSaveFileName = generateAutoSaveFileName(localFilePath());
2041
2042 bool started = exportDocumentSync(autoSaveFileName, nativeFormatMimeType());
2043
2044 if (started)
2045 {
2046 d->modifiedAfterAutosave = false;
2047 dbgAndroid << "autoSaveOnPause successful";
2048 }
2049 else
2050 {
2051 qWarning() << "Could not auto-save when paused";
2052 }
2053}
QString localFilePath() const
static QByteArray nativeFormatMimeType()
QString generateAutoSaveFileName(const QString &path) const
bool exportDocumentSync(const QString &path, const QByteArray &mimeType, KisPropertiesConfigurationSP exportConfiguration=0)
#define dbgAndroid
Definition kis_debug.h:62

References d, dbgAndroid, exportDocumentSync(), generateAutoSaveFileName(), localFilePath(), and nativeFormatMimeType().

◆ canceled

void KisDocument::canceled ( const QString & )
signal

◆ caption()

QString KisDocument::caption ( ) const
Returns
caption of the document

Caption is of the form "[title] - [path]", built out of the document info (title) and pretty-printed document Path. If the title is not present, only the Path it returned.

Definition at line 2150 of file KisDocument.cpp.

2151{
2152 QString c;
2153 const QString _url(QFileInfo(path()).fileName());
2154
2155 // if URL is empty...it is probably an unsaved file
2156 if (_url.isEmpty()) {
2157 c = " [" + i18n("Not Saved") + "] ";
2158 } else {
2159 c = _url; // Fall back to document URL
2160 }
2161
2162 return c;
2163}
QString path() const

References path().

◆ clearStatusBarMessage

void KisDocument::clearStatusBarMessage ( )
signal

Emitted e.g. at the end of a save operation This is emitted by KisDocument and used by KisView to clear the statusbar message

◆ clearUndoHistory()

void KisDocument::clearUndoHistory ( )

Definition at line 2298 of file KisDocument.cpp.

2299{
2300 d->undoStack->clear();
2301}

References d.

◆ clone()

KisDocument * KisDocument::clone ( bool addStorage = false)

creates a clone of the document and returns it. Please make sure that you hold all the necessary locks on the image before asking for a clone!

Definition at line 732 of file KisDocument.cpp.

733{
734 return new KisDocument(*this, addStorage);
735}
KisDocument(bool addStorage=true)

References KisDocument().

◆ closePath()

bool KisDocument::closePath ( bool promptToSave = true)

Definition at line 2496 of file KisDocument.cpp.

2497{
2498 if (promptToSave) {
2499 if ( isReadWrite() && isModified()) {
2500 Q_FOREACH (KisView *view, KisPart::instance()->views()) {
2501 if (view && view->document() == this) {
2502 if (!view->queryClose()) {
2503 return false;
2504 }
2505 }
2506 }
2507 }
2508 }
2509 // Not modified => ok and delete temp file.
2510 d->mimeType = QByteArray();
2511
2512 // It always succeeds for a read-only part,
2513 // but the return value exists for reimplementations
2514 // (e.g. pressing cancel for a modified read-write part)
2515 return true;
2516}
bool isReadWrite() const
bool isModified() const
static KisPart * instance()
Definition KisPart.cpp:131
QPointer< KisDocument > document
Definition KisView.cpp:121
bool queryClose()
Definition KisView.cpp:1159

References d, KisView::document, KisPart::instance(), isModified(), isReadWrite(), and KisView::queryClose().

◆ colorHistory()

QList< KoColor > KisDocument::colorHistory ( )

◆ completed

void KisDocument::completed ( )
signal

◆ copyFrom()

void KisDocument::copyFrom ( const Private & rhs,
KisDocument * q )

◆ copyFromDocument()

void KisDocument::copyFromDocument ( const KisDocument & rhs)

Definition at line 1191 of file KisDocument.cpp.

1192{
1194}

References copyFromDocumentImpl(), and REPLACE.

◆ copyFromDocumentImpl()

void KisDocument::copyFromDocumentImpl ( const KisDocument & rhs,
CopyPolicy policy )
private

Definition at line 1196 of file KisDocument.cpp.

1197{
1198 if (policy == REPLACE) {
1199 d->decorationsSyncingDisabled = true;
1200 d->copyFrom(*(rhs.d), this);
1201 d->decorationsSyncingDisabled = false;
1202
1203 d->undoStack->clear();
1204 } else {
1205 // in CONSTRUCT mode, d should be already initialized
1206 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
1207 connect(d->undoStack, SIGNAL(cleanChanged(bool)), this, SLOT(slotUndoStackCleanChanged(bool)));
1208 connect(d->autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
1209
1210 d->shapeController = new KisShapeController(d->nserver, d->undoStack, this);
1211 d->koShapeController = new KoShapeController(0, d->shapeController);
1212 }
1213
1214 setObjectName(rhs.objectName());
1215
1217
1218 if (rhs.d->image) {
1219 if (policy == REPLACE) {
1220 d->image->barrierLock(/* readOnly = */ false);
1221 rhs.d->image->barrierLock(/* readOnly = */ true);
1222 d->image->copyFromImage(*(rhs.d->image));
1223 d->image->unlock();
1224 rhs.d->image->unlock();
1225
1226 setCurrentImage(d->image, /* forceInitialUpdate = */ true);
1227 } else {
1228 // clone the image with keeping the GUIDs of the layers intact
1229 // NOTE: we expect the image to be locked!
1230 setCurrentImage(rhs.image()->clone(/* exactCopy = */ true), /* forceInitialUpdate = */ false);
1231 }
1232 }
1233
1234 if (policy == REPLACE) {
1235 d->syncDecorationsWrapperLayerState();
1236 }
1237
1238 if (rhs.d->preActivatedNode) {
1239 QQueue<KisNodeSP> linearizedNodes;
1240 KisLayerUtils::recursiveApplyNodes(rhs.d->image->root(),
1241 [&linearizedNodes](KisNodeSP node) {
1242 linearizedNodes.enqueue(node);
1243 });
1245 [&linearizedNodes, &rhs, this](KisNodeSP node) {
1246 KisNodeSP refNode = linearizedNodes.dequeue();
1247 if (rhs.d->preActivatedNode.data() == refNode.data()) {
1248 d->preActivatedNode = node;
1249 }
1250 });
1251 }
1252
1253 // reinitialize references' signal connection
1254 KisReferenceImagesLayerSP referencesLayer = this->referenceImagesLayer();
1255 if (referencesLayer) {
1256 d->referenceLayerConnections.clear();
1257 d->referenceLayerConnections.addConnection(
1258 referencesLayer, SIGNAL(sigUpdateCanvas(QRectF)),
1259 this, SIGNAL(sigReferenceImagesChanged()));
1260
1261 Q_EMIT sigReferenceImagesLayerChanged(referencesLayer);
1263 }
1264
1265 KisDecorationsWrapperLayerSP decorationsLayer =
1266 KisLayerUtils::findNodeByType<KisDecorationsWrapperLayer>(d->image->root());
1267 if (decorationsLayer) {
1268 decorationsLayer->setDocument(this);
1269 }
1270
1271
1272 if (policy == REPLACE) {
1273 setModified(true);
1274 }
1275}
KisSharedPtr< KisReferenceImagesLayer > referenceImagesLayer() const
KisImageSP image
void setModified(bool _mod)
void sigReferenceImagesLayerChanged(KisSharedPtr< KisReferenceImagesLayer > layer)
void setCurrentImage(KisImageSP image, bool forceInitialUpdate=true, KisNodeSP preActivatedNode=nullptr)
void sigReferenceImagesChanged()
KisImage * clone(bool exactCopy=false)
Definition kis_image.cc:405
void recursiveApplyNodes(NodePointer node, Functor func)

References KisImage::clone(), connect(), d, image, KisConfigNotifier::instance(), KisLayerUtils::recursiveApplyNodes(), REPLACE, setCurrentImage(), slotAutoSave(), slotConfigChanged(), and slotUndoStackCleanChanged().

◆ copyFromImpl()

void KisDocument::copyFromImpl ( const Private & rhs,
KisDocument * q,
KisDocument::CopyPolicy policy )

◆ createDocumentInfoDialog()

KoDocumentInfoDlg * KisDocument::createDocumentInfoDialog ( QWidget * parent,
KoDocumentInfo * docInfo ) const

Definition at line 2481 of file KisDocument.cpp.

2482{
2483 return new KoDocumentInfoDlg(parent, docInfo);
2484}
KoDocumentInfo * docInfo
The dialog that shows information about the document.

References docInfo.

◆ createDomDocument() [1/2]

QDomDocument KisDocument::createDomDocument ( const QString & appName,
const QString & tagName,
const QString & version )
static

Return a correctly created QDomDocument for an old (1.3-style) Krita document, including processing instruction, complete DOCTYPE tag (with systemId and publicId), and root element. This static method can be used e.g. by filters.

Parameters
appNamethe app's instance name, e.g. words, kspread, kpresenter etc.
tagNamethe name of the tag for the root element, e.g. DOC for words/kpresenter.
versionthe DTD version (usually the application's version).

Definition at line 2171 of file KisDocument.cpp.

2172{
2173 QDomImplementation impl;
2174 QString url = QString("http://www.calligra.org/DTD/%1-%2.dtd").arg(appName).arg(version);
2175 QDomDocumentType dtype = impl.createDocumentType(tagName,
2176 QString("-//KDE//DTD %1 %2//EN").arg(appName).arg(version),
2177 url);
2178 // The namespace URN doesn't need to include the version number.
2179 QString namespaceURN = QString("http://www.calligra.org/DTD/%1").arg(appName);
2180 QDomDocument doc = impl.createDocument(namespaceURN, tagName, dtype);
2181 doc.insertBefore(doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""), doc.documentElement());
2182 return doc;
2183}

◆ createDomDocument() [2/2]

QDomDocument KisDocument::createDomDocument ( const QString & tagName,
const QString & version ) const

Return a correctly created QDomDocument for this KisDocument, including processing instruction, complete DOCTYPE tag (with systemId and publicId), and root element.

Parameters
tagNamethe name of the tag for the root element
versionthe DTD version (usually the application's version).

Definition at line 2165 of file KisDocument.cpp.

2166{
2167 return createDomDocument("krita", tagName, version);
2168}
QDomDocument createDomDocument(const QString &tagName, const QString &version) const

References createDomDocument().

◆ createUndoStore()

KisUndoStore * KisDocument::createUndoStore ( )

Definition at line 2852 of file KisDocument.cpp.

2853{
2854 return new KisDocumentUndoStore(this);
2855}

◆ documentBounds()

QRectF KisDocument::documentBounds ( ) const

Return the bounding box of the image and associated elements (e.g. reference images)

Definition at line 2882 of file KisDocument.cpp.

2883{
2884 QRectF bounds = d->image->bounds();
2885
2887
2888 if (referenceImagesLayer) {
2890 }
2891
2892 return bounds;
2893}
#define bounds(x, a, b)

References KisReferenceImagesLayer::boundingImageRect(), bounds, d, and referenceImagesLayer().

◆ documentInfo()

KoDocumentInfo * KisDocument::documentInfo ( ) const
Returns
the information concerning this document.
See also
KoDocumentInfo

Definition at line 1775 of file KisDocument.cpp.

1776{
1777 return d->docInfo;
1778}

References d.

◆ embeddedResourcesStorageId()

QString KisDocument::embeddedResourcesStorageId ( ) const

Temporary storage for the resources that are embedded into other resources used by the document. E.g. patterns embedded into layer styles.

Definition at line 722 of file KisDocument.cpp.

723{
724 return d->embeddedResourcesStorageID;
725}

References d.

◆ errorMessage()

QString KisDocument::errorMessage ( ) const

Return the last error message. Usually KisDocument takes care of showing it; this method is mostly provided for non-interactive use.

Definition at line 2197 of file KisDocument.cpp.

2198{
2199 return d->lastErrorMessage;
2200}

References d.

◆ exportDocument()

bool KisDocument::exportDocument ( const QString & path,
const QByteArray & mimeType,
bool isAdvancedExporting = false,
bool showWarnings = false,
KisPropertiesConfigurationSP exportConfiguration = 0 )

Saves the document as path without changing the state of the KisDocument (Path, modified flag etc.). Call this instead of saveAs() to implement KisMainWindow's File --> Export feature. Make sure to provide two separate bool parameters otherwise it will mix them

Definition at line 877 of file KisDocument.cpp.

878{
879 using namespace KritaUtils;
880
881 SaveFlags flags = SaveIsExporting;
882 if (showWarnings) {
883 flags |= SaveShowWarnings;
884 }
885
886 KisUsageLogger::log(QString("Exporting Document: %1 as %2. %3 * %4 pixels, %5 layers, %6 frames, %7 "
887 "framerate. Export configuration: %8")
888 .arg(path, QString::fromLatin1(mimeType), QString::number(d->image->width()),
889 QString::number(d->image->height()), QString::number(d->image->nlayers()),
890 QString::number(d->image->animationInterface()->totalLength()),
891 QString::number(d->image->animationInterface()->framerate()),
892 (exportConfiguration ? exportConfiguration->toXML() : "No configuration")));
893
895 mimeType,
896 flags),
897 exportConfiguration, isAdvancedExporting);
898}
QByteArray mimeType
bool exportDocumentImpl(const KritaUtils::ExportFileJob &job, KisPropertiesConfigurationSP exportConfiguration, bool isAdvancedExporting=false)
static void log(const QString &message)
Logs with date/time.

References d, exportDocumentImpl(), KisUsageLogger::log(), and mimeType.

◆ exportDocumentImpl()

bool KisDocument::exportDocumentImpl ( const KritaUtils::ExportFileJob & job,
KisPropertiesConfigurationSP exportConfiguration,
bool isAdvancedExporting = false )
private

Definition at line 737 of file KisDocument.cpp.

738{
739 QFileInfo filePathInfo(job.filePath);
740
741 if (filePathInfo.exists() && !filePathInfo.isWritable()) {
743 i18n("%1 cannot be written to. Please save under a different name.", job.filePath),
744 "");
745 return false;
746 }
747
748 KisConfig cfg(true);
749 if (cfg.backupFile() && filePathInfo.exists()) {
750
751 QString backupDir;
752
753 switch(cfg.readEntry<int>("backupfilelocation", 0)) {
754 case 1:
755 backupDir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
756 break;
757 case 2:
758 backupDir = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
759 break;
760 default:
761#ifdef Q_OS_ANDROID
762 // We deal with URIs, there may or may not be a "directory"
764 QDir().mkpath(backupDir);
765#endif
766
767#ifdef Q_OS_MACOS
769 if (bookmarkmngr->isSandboxed()) {
770 // If the user does not have directory permission force backup
771 // files to be inside Container tmp
772 QUrl fileUrl = QUrl::fromLocalFile(job.filePath);
773 if( !bookmarkmngr->parentDirHasPermissions(fileUrl.path()) ) {
774 backupDir = QDir::tempPath();
775 }
776 }
777#endif
778
779 // Do nothing: the empty string is user file location
780 break;
781 }
782
783 int numOfBackupsKept = cfg.readEntry<int>("numberofbackupfiles", 1);
784 QString suffix = cfg.readEntry<QString>("backupfilesuffix", "~");
785
786 if (numOfBackupsKept == 1) {
787 if (!KisBackup::simpleBackupFile(job.filePath, backupDir, suffix)) {
788 qWarning() << "Failed to create simple backup file!" << job.filePath << backupDir << suffix;
789 KisUsageLogger::log(QString("Failed to create a simple backup for %1 in %2.")
790 .arg(job.filePath, backupDir.isEmpty()
791 ? "the same location as the file"
792 : backupDir));
793 slotCompleteSavingDocument(job, ImportExportCodes::ErrorWhileWriting, i18nc("Saving error message", "Failed to create a backup file"), "");
794 return false;
795 }
796 else {
797 KisUsageLogger::log(QString("Create a simple backup for %1 in %2.")
798 .arg(job.filePath, backupDir.isEmpty()
799 ? "the same location as the file"
800 : backupDir));
801 }
802 }
803 else if (numOfBackupsKept > 1) {
804 if (!KisBackup::numberedBackupFile(job.filePath, backupDir, suffix, numOfBackupsKept)) {
805 qWarning() << "Failed to create numbered backup file!" << job.filePath << backupDir << suffix;
806 KisUsageLogger::log(QString("Failed to create a numbered backup for %2.")
807 .arg(job.filePath, backupDir.isEmpty()
808 ? "the same location as the file"
809 : backupDir));
810 slotCompleteSavingDocument(job, ImportExportCodes::ErrorWhileWriting, i18nc("Saving error message", "Failed to create a numbered backup file"), "");
811 return false;
812 }
813 else {
814 KisUsageLogger::log(QString("Create a simple backup for %1 in %2.")
815 .arg(job.filePath, backupDir.isEmpty()
816 ? "the same location as the file"
817 : backupDir));
818 }
819 }
820 }
821
822 //KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(!job.mimeType.isEmpty(), false);
823 if (job.mimeType.isEmpty()) {
825 slotCompleteSavingDocument(job, error, error.errorMessage(), "");
826 return false;
827
828 }
829
830 const QString actionName =
832 i18n("Exporting Document...") :
833 i18n("Saving Document...");
834
838 job, exportConfiguration, isAdvancedExporting);
839
841 QString errorShortLog;
842 QString errorMessage;
844
845 switch (result) {
847 errorShortLog = "another save operation is in progress";
848 errorMessage = i18n("Could not start saving %1. Wait until the current save operation has finished.", job.filePath);
849 errorCode = ImportExportCodes::Failure;
850 break;
852 errorShortLog = "failed to lock and clone the image";
853 errorMessage = i18n("Could not start saving %1. Image is busy", job.filePath);
854 errorCode = ImportExportCodes::Busy;
855 break;
857 errorShortLog = "failed to start background saving";
858 errorMessage = i18n("Could not start saving %1. Unknown failure has happened", job.filePath);
859 errorCode = ImportExportCodes::Failure;
860 break;
862 // noop, not possible
863 break;
864 }
865
866 KisUsageLogger::log(QString("Failed to initiate saving %1 in background: %2").arg(job.filePath).arg(errorShortLog));
867
868 slotCompleteSavingDocument(job, errorCode,
870 "");
871 return false;
872 }
873
875}
static bool simpleBackupFile(const QString &filename, const QString &backupDir=QString(), const QString &backupExtension=QStringLiteral("~"))
Definition KisBackup.cpp:24
static bool numberedBackupFile(const QString &filename, const QString &backupDir=QString(), const QString &backupExtension=QStringLiteral("~"), const uint maxBackups=10)
Definition KisBackup.cpp:38
KritaUtils::BackgroudSavingStartResult initiateSavingInBackground(const QString actionName, const QObject *receiverObject, const char *receiverMethod, const KritaUtils::ExportFileJob &job, KisPropertiesConfigurationSP exportConfiguration, std::unique_ptr< KisDocument > &&optionalClonedDocument, bool isAdvancedExporting=false)
QString errorMessage() const
void slotCompleteSavingDocument(const KritaUtils::ExportFileJob &job, KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)

References KritaUtils::AnotherSavingInProgress, KisAutoSaveRecoveryDialog::autoSaveLocation(), KisConfig::backupFile(), ImportExportCodes::Busy, errorMessage(), KisImportExportErrorCode::errorMessage(), ImportExportCodes::ErrorWhileWriting, ImportExportCodes::Failure, KritaUtils::Failure, ImportExportCodes::FileFormatNotSupported, KritaUtils::ExportFileJob::filePath, KritaUtils::ExportFileJob::flags, KritaUtils::ImageLockFailure, initiateSavingInBackground(), KisMacosSecurityBookmarkManager::instance(), KisMacosSecurityBookmarkManager::isSandboxed(), KisUsageLogger::log(), KritaUtils::ExportFileJob::mimeType, ImportExportCodes::NoAccessToWrite, KisBackup::numberedBackupFile(), KisMacosSecurityBookmarkManager::parentDirHasPermissions(), KisConfig::readEntry(), KritaUtils::SaveIsExporting, KisBackup::simpleBackupFile(), slotCompleteSavingDocument(), and KritaUtils::Success.

◆ exportDocumentSync()

bool KisDocument::exportDocumentSync ( const QString & path,
const QByteArray & mimeType,
KisPropertiesConfigurationSP exportConfiguration = 0 )

Exports he document is a synchronous way. The caller must ensure that the image is not accessed by any other actors, because the exporting happens without holding the image lock.

The caller guarantees that no one else uses the document (usually, it is a temporary document created specifically for exporting), so we don't need to copy or lock the document. Instead we should just ensure the barrier lock is synced and then released.

Definition at line 1277 of file KisDocument.cpp.

1278{
1279 {
1286 Private::StrippedSafeSavingLocker locker(&d->savingMutex, d->image);
1287 if (!locker.successfullyLocked()) {
1288 return false;
1289 }
1290 }
1291
1292 d->savingImage = d->image;
1293
1295 d->importExportManager->
1296 exportDocument(path, path, mimeType, false, exportConfiguration);
1297
1298 d->savingImage = 0;
1299
1300 return status.isOk();
1301}
bool exportDocument(const QString &path, const QByteArray &mimeType, bool isAdvancedExporting=false, bool showWarnings=false, KisPropertiesConfigurationSP exportConfiguration=0)

References d, exportDocument(), KisImportExportErrorCode::isOk(), and mimeType.

◆ exportErrorToUserMessage()

QString KisDocument::exportErrorToUserMessage ( KisImportExportErrorCode status,
const QString & errorMessage )
private

Definition at line 2862 of file KisDocument.cpp.

2863{
2864 return errorMessage.isEmpty() ? status.errorMessage() : errorMessage;
2865}

References errorMessage(), and KisImportExportErrorCode::errorMessage().

◆ extraNativeMimeTypes()

static QStringList KisDocument::extraNativeMimeTypes ( )
inlinestatic

Returns a list of the mimeTypes considered "native", i.e. which can be saved by KisDocument without a filter, in addition to the main one

Definition at line 177 of file KisDocument.h.

177{ return QStringList() << KIS_MIME_TYPE; }
#define KIS_MIME_TYPE
Definition KisDocument.h:56
QList< QString > QStringList

References KIS_MIME_TYPE.

◆ fileBatchMode()

bool KisDocument::fileBatchMode ( ) const
Returns
true if file operations should inhibit the option dialog

Definition at line 1086 of file KisDocument.cpp.

1087{
1088 return d->batchMode;
1089}

References d.

◆ finishExportInBackground

void KisDocument::finishExportInBackground ( )
privateslot

Definition at line 1691 of file KisDocument.cpp.

1692{
1693 KIS_SAFE_ASSERT_RECOVER(d->childSavingFuture.isFinished()) {
1695 return;
1696 }
1697
1698 KisImportExportErrorCode status = d->childSavingFuture.result();
1699 QString errorMessage = status.errorMessage();
1700 QString warningMessage = d->lastWarningMessage;
1701
1702 if (!d->lastErrorMessage.isEmpty()) {
1704 errorMessage = d->lastErrorMessage;
1705 } else {
1706 errorMessage += "\n" + d->lastErrorMessage;
1707 }
1708 }
1709
1710 d->savingImage.clear();
1711 d->childSavingFuture = QFuture<KisImportExportErrorCode>();
1712 d->lastErrorMessage.clear();
1713 d->lastWarningMessage.clear();
1714
1715 if (d->savingUpdater) {
1716 d->savingUpdater->setProgress(100);
1717 }
1718
1720}
QString warningMessage() const
void sigBackgroundSavingFinished(KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126

References d, errorMessage(), KisImportExportErrorCode::errorMessage(), ImportExportCodes::Failure, ImportExportCodes::InternalError, KIS_SAFE_ASSERT_RECOVER, sigBackgroundSavingFinished(), and warningMessage().

◆ generateAutoSaveFileName()

QString KisDocument::generateAutoSaveFileName ( const QString & path) const
private

Definition at line 1828 of file KisDocument.cpp.

1829{
1830 QString retval;
1831
1832 // Using the extension allows to avoid relying on the mime magic when opening
1833 const QString extension (".kra");
1834 QString prefix = KisConfig(true).readEntry<bool>("autosavefileshidden") ? QString(".") : QString();
1835 QRegularExpression autosavePattern1("^\\..+-autosave.kra$");
1836 QRegularExpression autosavePattern2("^.+-autosave.kra$");
1837
1838 QFileInfo fi(path);
1839 QString dir = fi.absolutePath();
1840
1841#ifdef Q_OS_ANDROID
1842 // URIs may or may not have a directory backing them, so we save to our default autosave location
1843 if (path.startsWith("content://")) {
1845 QDir().mkpath(dir);
1846 }
1847#endif
1848
1849 QString filename = fi.fileName();
1850
1851 if (path.isEmpty() || autosavePattern1.match(filename).hasMatch() || autosavePattern2.match(filename).hasMatch() || !fi.isWritable()) {
1852 // Never saved?
1853 retval = QString("%1%2%3%4-%5-%6-autosave%7")
1855 .arg('/')
1856 .arg(prefix)
1857 .arg("krita")
1858 .arg(qApp->applicationPid())
1859 .arg(objectName())
1860 .arg(extension);
1861 } else {
1862 // Beware: don't reorder arguments
1863 // otherwise in case of filename = '1-file.kra' it will become '.-file.kra-autosave.kra' instead of '.1-file.kra-autosave.kra'
1864 retval = QString("%1%2%3%4-autosave%5").arg(dir).arg('/').arg(prefix).arg(filename).arg(extension);
1865 }
1866
1867 //qDebug() << "generateAutoSaveFileName() for path" << path << ":" << retval;
1868 return retval;
1869}
T readEntry(const QString &name, const T &defaultValue=T())
Definition kis_config.h:789

References KisAutoSaveRecoveryDialog::autoSaveLocation(), and KisConfig::readEntry().

◆ generatePreview()

QPixmap KisDocument::generatePreview ( const QSize & size)

Generates a preview picture of the document.

Note
The preview is used in the File Dialog and also to create the Thumbnail

Definition at line 1785 of file KisDocument.cpp.

1786{
1787 KisImageSP image = d->image;
1788 if (d->savingImage) image = d->savingImage;
1789
1790 if (image) {
1791 QRect bounds = image->bounds();
1792 QSize originalSize = bounds.size();
1793 // QSize may round down one dimension to zero on extreme aspect rations, so ensure 1px minimum
1794 QSize newSize = originalSize.scaled(size, Qt::KeepAspectRatio).expandedTo({1, 1});
1795
1796 bool pixelArt = false;
1797 // determine if the image is pixel art or not
1798 if (originalSize.width() < size.width() && originalSize.height() < size.height()) {
1799 // the image must be smaller than the requested preview
1800 // the scale must be integer
1801 if (newSize.height()%originalSize.height() == 0 && newSize.width()%originalSize.width() == 0) {
1802 pixelArt = true;
1803 }
1804 }
1805
1806 QPixmap px;
1807 if (pixelArt) {
1808 // do not scale while converting (because it uses Bicubic)
1809 QImage original = image->convertToQImage(originalSize, 0);
1810 // scale using FastTransformation, which is probably Nearest neighbour, suitable for pixel art
1811 QImage scaled = original.scaled(newSize, Qt::KeepAspectRatio, Qt::FastTransformation);
1812 px = QPixmap::fromImage(scaled);
1813 } else {
1814 px = QPixmap::fromImage(image->convertToQImage(newSize, 0));
1815 }
1816 if (px.size() == QSize(0,0)) {
1817 px = QPixmap(newSize);
1818 QPainter gc(&px);
1819 QBrush checkBrush = QBrush(KisCanvasWidgetBase::createCheckersImage(newSize.width() / 5));
1820 gc.fillRect(px.rect(), checkBrush);
1821 gc.end();
1822 }
1823 return px;
1824 }
1825 return QPixmap(size);
1826}
static QImage createCheckersImage(qint32 checkSize=-1)
QImage convertToQImage(qint32 x1, qint32 y1, qint32 width, qint32 height, const KoColorProfile *profile)
QRect bounds() const override
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KisImage::bounds(), bounds, KisImage::convertToQImage(), KisCanvasWidgetBase::createCheckersImage(), d, and image.

◆ getAudioLevel()

qreal KisDocument::getAudioLevel ( )

Definition at line 2435 of file KisDocument.cpp.

2436{
2437 return d->audioLevel;
2438}

References d.

◆ getAudioTracks()

QVector< QFileInfo > KisDocument::getAudioTracks ( ) const

Definition at line 2419 of file KisDocument.cpp.

2419 {
2420 return d->audioTracks;
2421}

References d.

◆ getStoryboardCommentsList()

QVector< StoryboardComment > KisDocument::getStoryboardCommentsList ( )

returns the list of comments for the storyboard docker in the document

Definition at line 2406 of file KisDocument.cpp.

2407{
2408 return d->m_storyboardCommentList;
2409}

References d.

◆ getStoryboardItemList()

StoryboardItemList KisDocument::getStoryboardItemList ( )

returns the list of pointers to storyboard Items for the document

Definition at line 2393 of file KisDocument.cpp.

2394{
2395 return d->m_storyboardItemList;
2396}

References d.

◆ gridConfig()

KisGridConfig KisDocument::gridConfig ( ) const

◆ guidesConfig()

const KisGuidesConfig & KisDocument::guidesConfig ( ) const

returns the guides data for this document.

◆ hackPreliminarySetImage()

void KisDocument::hackPreliminarySetImage ( KisImageSP image)

Set the image of the document preliminary, before the document has completed loading. Some of the document items (shapes) may want to access image properties (bounds and resolution), so we should provide it to them even before the entire image is loaded.

Right now, the only use by KoShapeRegistry::createShapeFromOdf(), remove after it is deprecated.

Definition at line 2829 of file KisDocument.cpp.

2830{
2832
2833 // we set image without connecting idle-watcher, because loading
2834 // hasn't been finished yet
2835 d->image = image;
2836 d->shapeController->setImage(image);
2837}
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References d, image, and KIS_SAFE_ASSERT_RECOVER_RETURN.

◆ image()

KisImageWSP KisDocument::image ( ) const

◆ importDocument()

bool KisDocument::importDocument ( const QString & path)

Opens the document given by path, without storing the Path in the KisDocument. Call this instead of openPath() to implement KisMainWindow's File --> Import feature.

Note
This will call openPath(). To differentiate this from an ordinary Open operation (in any reimplementation of openPath() or openFile()) call isImporting().

Definition at line 1871 of file KisDocument.cpp.

1872{
1873 bool ret;
1874
1875 dbgUI << "path=" << _path;
1876
1877 // open...
1878 ret = openPath(_path);
1879
1880 // reset url & m_file (kindly? set by KisParts::openUrl()) to simulate a
1881 // File --> Import
1882 if (ret) {
1883 dbgUI << "success, resetting url";
1884 resetPath();
1885 }
1886
1887 return ret;
1888}
bool openPath(const QString &path, OpenFlags flags=None)
openPath Open a Path
#define dbgUI
Definition kis_debug.h:52

References dbgUI, openPath(), and resetPath().

◆ importExportManager()

KisImportExportManager * KisDocument::importExportManager ( ) const

importExportManager gives access to the internal import/export manager

Returns
the document's import/export manager

◆ initiateSavingInBackground() [1/2]

KritaUtils::BackgroudSavingStartResult KisDocument::initiateSavingInBackground ( const QString actionName,
const QObject * receiverObject,
const char * receiverMethod,
const KritaUtils::ExportFileJob & job,
KisPropertiesConfigurationSP exportConfiguration,
bool isAdvancedExporting = false )
private

Definition at line 1304 of file KisDocument.cpp.

1308{
1309 return initiateSavingInBackground(actionName, receiverObject, receiverMethod,
1310 job, exportConfiguration, std::unique_ptr<KisDocument>(), isAdvancedExporting);
1311}

References initiateSavingInBackground().

◆ initiateSavingInBackground() [2/2]

KritaUtils::BackgroudSavingStartResult KisDocument::initiateSavingInBackground ( const QString actionName,
const QObject * receiverObject,
const char * receiverMethod,
const KritaUtils::ExportFileJob & job,
KisPropertiesConfigurationSP exportConfiguration,
std::unique_ptr< KisDocument > && optionalClonedDocument,
bool isAdvancedExporting = false )
private

This lock will later release() when we start the background thread, it means that the ownership is transferred to the background thread

From now on no return statements are allowed, even inside asserts, since the ownership over the saving mutex has already been passed to the background thread.

The cancellation process should go through slotChildCompletedSavingInBackground(), which will unlock the mutex itself.

Definition at line 1313 of file KisDocument.cpp.

1318{
1320
1321 QScopedPointer<KisDocument> clonedDocument;
1322
1323 if (!optionalClonedDocument) {
1324 clonedDocument.reset(lockAndCloneForSaving());
1325 } else {
1326 clonedDocument.reset(optionalClonedDocument.release());
1327 }
1328
1329 if (!d->savingMutex.tryLock()){
1331 }
1332
1337 std::unique_lock<QMutex> savingMutexLock(d->savingMutex, std::adopt_lock);
1338
1339 if (!clonedDocument) {
1341 }
1342
1343 auto waitForImage = [] (KisImageSP image) {
1345 if (window) {
1346 if (window->viewManager()) {
1348 }
1349 }
1350 };
1351
1352 {
1353 KisNodeSP newRoot = clonedDocument->image()->root();
1356 waitForImage(clonedDocument->image());
1357 }
1358 }
1359
1360 if (clonedDocument->image()->hasOverlaySelectionMask()) {
1361 clonedDocument->image()->setOverlaySelectionMask(0);
1362 waitForImage(clonedDocument->image());
1363 }
1364
1365 KisConfig cfg(true);
1366 if (cfg.trimKra()) {
1367 clonedDocument->image()->cropImage(clonedDocument->image()->bounds());
1368 clonedDocument->image()->purgeUnusedData(false);
1369 waitForImage(clonedDocument->image());
1370 }
1371
1372 KIS_SAFE_ASSERT_RECOVER(clonedDocument->image()->isIdle()) {
1373 waitForImage(clonedDocument->image());
1374 }
1375
1378
1388 savingMutexLock.release();
1389
1390 d->backgroundSaveDocument.reset(clonedDocument.take());
1391 d->backgroundSaveJob = job;
1392 d->modifiedWhileSaving = false;
1393
1394 if (d->backgroundSaveJob.flags & KritaUtils::SaveInAutosaveMode) {
1395 d->backgroundSaveDocument->d->isAutosaving = true;
1396 }
1397
1398 connect(d->backgroundSaveDocument.data(),
1399 SIGNAL(sigBackgroundSavingFinished(KisImportExportErrorCode, QString, QString)),
1400 this,
1402
1403
1405 receiverObject, receiverMethod, Qt::UniqueConnection);
1406
1407 bool started =
1408 d->backgroundSaveDocument->startExportInBackground(actionName,
1409 job.filePath,
1410 job.filePath,
1411 job.mimeType,
1413 exportConfiguration, isAdvancedExporting);
1414
1415 if (!started) {
1416 // the state should have been deinitialized in slotChildCompletedSavingInBackground()
1417 KIS_SAFE_ASSERT_RECOVER (!d->backgroundSaveDocument && !d->backgroundSaveJob.isValid()) {
1418 d->backgroundSaveDocument.take()->deleteLater();
1419 d->savingMutex.unlock();
1420 d->backgroundSaveJob = KritaUtils::ExportFileJob();
1421 }
1423 }
1424
1426}
KisDocument * lockAndCloneForSaving()
try to clone the image. This method handles all the locking for you. If locking has failed,...
void slotChildCompletedSavingInBackground(KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
void sigCompleteBackgroundSaving(const KritaUtils::ExportFileJob &job, KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
Main window for Krita.
KisViewManager * viewManager
KisMainWindow * currentMainwindow() const
Definition KisPart.cpp:483
void blockUntilOperationsFinishedForced(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85
bool hasDelayedNodeWithUpdates(KisNodeSP root)
void forceAllDelayedNodesUpdate(KisNodeSP root)
KisImageWSP image

References KritaUtils::AnotherSavingInProgress, KisViewManager::blockUntilOperationsFinishedForced(), connect(), KisPart::currentMainwindow(), d, KritaUtils::Failure, KritaUtils::ExportFileJob::filePath, KritaUtils::ExportFileJob::flags, KisLayerUtils::forceAllDelayedNodesUpdate(), KisLayerUtils::hasDelayedNodeWithUpdates(), KisBaseNode::image, image, KritaUtils::ImageLockFailure, KisPart::instance(), KritaUtils::ExportFileJob::isValid(), KIS_ASSERT_RECOVER_RETURN_VALUE, KIS_SAFE_ASSERT_RECOVER, lockAndCloneForSaving(), KritaUtils::ExportFileJob::mimeType, KisNodeFacade::root, KritaUtils::SaveInAutosaveMode, KritaUtils::SaveShowWarnings, sigBackgroundSavingFinished(), sigCompleteBackgroundSaving(), slotChildCompletedSavingInBackground(), KritaUtils::Success, KisConfig::trimKra(), and KisMainWindow::viewManager.

◆ isAutoSaveActive()

bool KisDocument::isAutoSaveActive ( )

Indicate if autosave is active or inactive

the value is independent of auto save delay

Definition at line 1770 of file KisDocument.cpp.

1771{
1772 return d->autoSaveActive;
1773}

References d.

◆ isAutosaving()

bool KisDocument::isAutosaving ( ) const

◆ isInSaving()

bool KisDocument::isInSaving ( ) const

isInSaving shown if the document has any (background) saving process or not

Returns
true if there is some saving in action

◆ isModified()

bool KisDocument::isModified ( ) const

Returns true if this document or any of its internal child documents are modified.

Definition at line 1780 of file KisDocument.cpp.

1781{
1782 return d->modified;
1783}

References d.

◆ isNativeFormat()

bool KisDocument::isNativeFormat ( const QByteArray & mimeType) const

Checks whether a given mimeType can be handled natively.

Definition at line 2185 of file KisDocument.cpp.

2186{
2188 return true;
2189 return extraNativeMimeTypes().contains(mimeType);
2190}
static QStringList extraNativeMimeTypes()

References extraNativeMimeTypes(), mimeType, and nativeFormatMimeType().

◆ isReadWrite()

bool KisDocument::isReadWrite ( ) const

Definition at line 2486 of file KisDocument.cpp.

2487{
2488 return d->readwrite;
2489}

References d.

◆ isRecovered()

bool KisDocument::isRecovered ( ) const

◆ isSaving()

bool KisDocument::isSaving ( ) const

Definition at line 2693 of file KisDocument.cpp.

2694{
2695 const bool result = d->savingMutex.tryLock();
2696 if (result) {
2697 d->savingMutex.unlock();
2698 }
2699 return !result;
2700}

References d.

◆ linkedDocumentResources()

QList< KoResourceLoadResult > KisDocument::linkedDocumentResources ( )

linkedDocumentResources List returns all the resources linked to the document, such as palettes

In some cases (e.g. when the document is temporary), the underlying document storage will not be registered in the resource system, so we cannot get fully initialized resources from it (resourceId(), active(), md5() and storageLocation() fields will be uninitialized). Therefore we just return KoEmbeddedResource which is suitable for saving this data into hard drive.

The returned KoResourceLoadResult object can either be in EmbeddedResource or FailedLink state. The former means the resource has been prepared for embedding, the latter means there was some issue with serializing the resource. In the latter case the called should check result.signature() to find out which resource has failed.

NOTE: the returned result can NOT have ExistingResource state!

Definition at line 2321 of file KisDocument.cpp.

2322{
2324 if (!d->linkedResourceStorage) {
2325 return result;
2326 }
2327
2328 Q_FOREACH(const QString &resourceType, KisResourceLoaderRegistry::instance()->resourceTypes()) {
2329 QSharedPointer<KisResourceStorage::ResourceIterator> iter = d->linkedResourceStorage->resources(resourceType);
2330 while (iter->hasNext()) {
2331 iter->next();
2332
2333 QBuffer buf;
2334 buf.open(QBuffer::WriteOnly);
2335 bool exportSuccessful =
2336 d->linkedResourceStorage->exportResource(iter->url(), &buf);
2337
2338 KoResourceSP resource = d->linkedResourceStorage->resource(iter->url());
2339 exportSuccessful &= bool(resource);
2340
2341 const QString name = resource ? resource->name() : QString();
2342 const QString fileName = QFileInfo(iter->url()).fileName();
2343 const KoResourceSignature signature(resourceType,
2344 KoMD5Generator::generateHash(buf.data()),
2345 fileName, name);
2346
2347 if (exportSuccessful) {
2348 result << KoEmbeddedResource(signature, buf.data());
2349 } else {
2350 result << signature;
2351 }
2352 }
2353 }
2354
2355 return result;
2356}
static KisResourceLoaderRegistry * instance()
static QString generateHash(const QString &filename)
generateHash reads the given file and generates a hex-encoded md5sum for the file.
A simple wrapper object for the main information about the resource.
const char * name(StandardAction id)

References d, KoMD5Generator::generateHash(), and KisResourceLoaderRegistry::instance().

◆ linkedResourcesStorageId()

QString KisDocument::linkedResourcesStorageId ( ) const

Persistent storage for the resources that are linked but the resources embedded in the document. These resources are not embedded into their own container resource, so they should be stored by the document

All these resources are saved into the document itself and loaded alongside the document.

Definition at line 727 of file KisDocument.cpp.

728{
729 return d->linkedResourcesStorageID;
730}

References d.

◆ loadNativeFormat()

bool KisDocument::loadNativeFormat ( const QString & file)

Loads a document in the native format from a given Path. Reimplement if your native format isn't XML.

Parameters
filethe file to load - usually KReadOnlyPart::m_file or the result of a filter

Definition at line 2063 of file KisDocument.cpp.

2064{
2065 return openPath(file_);
2066}

References openPath().

◆ localFilePath()

QString KisDocument::localFilePath ( ) const

Definition at line 2531 of file KisDocument.cpp.

2532{
2533 return d->m_file;
2534}

References d.

◆ lockAndCloneForSaving()

KisDocument * KisDocument::lockAndCloneForSaving ( )

try to clone the image. This method handles all the locking for you. If locking has failed, no cloning happens

Returns
cloned document on success, null otherwise

Definition at line 1181 of file KisDocument.cpp.

1182{
1183 return d->lockAndCloneImpl(true);
1184}

References d.

◆ lockAndCloneImpl()

KisDocument * KisDocument::lockAndCloneImpl ( bool fetchResourcesFromLayers)

◆ lockAndCreateSnapshot()

KisDocument * KisDocument::lockAndCreateSnapshot ( )

Definition at line 1186 of file KisDocument.cpp.

1187{
1188 return d->lockAndCloneImpl(false);
1189}

References d.

◆ mimeType()

QByteArray KisDocument::mimeType ( ) const

Returns the actual mimeType of the document

◆ mirrorAxisConfig()

const KisMirrorAxisConfig & KisDocument::mirrorAxisConfig ( ) const

◆ modified

void KisDocument::modified ( bool )
signal

Emitted when the document is modified

◆ nativeFormatMimeType()

static QByteArray KisDocument::nativeFormatMimeType ( )
inlinestatic

To be preferred when a document exists. It is fast when calling it multiple times since it caches the result that readNativeFormatMimeType() delivers. This comes from the X-KDE-NativeMimeType key in the .desktop file.

Definition at line 170 of file KisDocument.h.

170{ return KIS_MIME_TYPE; }

References KIS_MIME_TYPE.

◆ newImage()

bool KisDocument::newImage ( const QString & name,
qint32 width,
qint32 height,
const KoColorSpace * cs,
const KoColor & bgColor,
KisConfig::BackgroundStyle bgStyle,
int numberOfLayers,
const QString & imageDescription,
const double imageResolution )

Create a new image that has this document as a parent and replace the current image with this image.

Preinitialize color history for new documents when possible

Definition at line 2588 of file KisDocument.cpp.

2594{
2595 Q_ASSERT(cs);
2596
2598
2599 if (!cs) return false;
2600
2601 KisCursorOverrideLock cursorLock(Qt::BusyCursor);
2602
2603 image = new KisImage(createUndoStore(), width, height, cs, name);
2604
2605 Q_CHECK_PTR(image);
2606
2607 connect(image, SIGNAL(sigImageModified()), this, SLOT(setImageModified()), Qt::UniqueConnection);
2608 connect(image, SIGNAL(sigImageModifiedWithoutUndo()), this, SLOT(setImageModifiedWithoutUndo()), Qt::UniqueConnection);
2609 image->setResolution(imageResolution, imageResolution);
2610
2612 image->waitForDone();
2613
2614 documentInfo()->setAboutInfo("title", name);
2615 documentInfo()->setAboutInfo("abstract", description);
2616
2617 KisConfig cfg(false);
2618 cfg.defImageWidth(width);
2619 cfg.defImageHeight(height);
2620 cfg.defImageResolution(imageResolution);
2621 if (!cfg.useDefaultColorSpace())
2622 {
2623 cfg.defColorModel(image->colorSpace()->colorModelId().id());
2624 cfg.setDefaultColorDepth(image->colorSpace()->colorDepthId().id());
2625 cfg.defColorProfile(image->colorSpace()->profile()->name());
2626 }
2627
2628 bool autopin = cfg.autoPinLayersToTimeline();
2629
2630 KisLayerSP bgLayer;
2631 if (bgStyle == KisConfig::RASTER_LAYER || bgStyle == KisConfig::FILL_LAYER) {
2632 KoColor strippedAlpha = bgColor;
2633 strippedAlpha.setOpacity(OPACITY_OPAQUE_U8);
2634
2635 if (bgStyle == KisConfig::RASTER_LAYER) {
2636 bgLayer = new KisPaintLayer(image.data(), i18nc("Name for the bottom-most layer in the layerstack", "Background"), OPACITY_OPAQUE_U8, cs);
2637 bgLayer->paintDevice()->setDefaultPixel(strippedAlpha);
2638 bgLayer->setPinnedToTimeline(autopin);
2639 } else if (bgStyle == KisConfig::FILL_LAYER) {
2641 filter_config->setProperty("color", strippedAlpha.toQColor());
2642 filter_config->createLocalResourcesSnapshot();
2643 bgLayer = new KisGeneratorLayer(image.data(), i18nc("Name of automatically created background color fill layer", "Background Fill"), filter_config, image->globalSelection());
2644 }
2645
2646 bgLayer->setOpacity(bgColor.opacityU8());
2647
2648 if (numberOfLayers > 1) {
2649 //Lock bg layer if others are present.
2650 bgLayer->setUserLocked(true);
2651 }
2652 }
2653 else { // KisConfig::CANVAS_COLOR (needs an unlocked starting layer).
2655 bgLayer = new KisPaintLayer(image.data(), image->nextLayerName(), OPACITY_OPAQUE_U8, cs);
2656 }
2657
2658 Q_CHECK_PTR(bgLayer);
2659 image->addNode(bgLayer.data(), image->rootLayer().data());
2660 bgLayer->setDirty(QRect(0, 0, width, height));
2661
2662 // reset mirror axis to default:
2663 d->mirrorAxisConfig.setAxisPosition(QRectF(image->bounds()).center());
2665
2666 for(int i = 1; i < numberOfLayers; ++i) {
2668 layer->setPinnedToTimeline(autopin);
2669 image->addNode(layer, image->root(), i);
2670 layer->setDirty(QRect(0, 0, width, height));
2671 }
2672
2673 {
2675 if (window) {
2680 }
2681 }
2682
2684 QString("Created image \"%1\", %2 * %3 pixels, %4 dpi. Color model: %6 %5 (%7). Layers: %8")
2685 .arg(name, QString::number(width), QString::number(height),
2686 QString::number(imageResolution * 72.0), image->colorSpace()->colorModelId().name(),
2688 QString::number(numberOfLayers)));
2689
2690 return true;
2691}
const quint8 OPACITY_OPAQUE_U8
KisUndoStore * createUndoStore()
KoDocumentInfo * documentInfo() const
void setImageModified()
void setImageModifiedWithoutUndo()
void setColorHistory(const QList< KoColor > &colors)
static KisGeneratorRegistry * instance()
static KisResourcesInterfaceSP instance()
void waitForDone()
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
QString nextLayerName(const QString &baseName="") const
Definition kis_image.cc:715
bool assignImageProfile(const KoColorProfile *profile, bool blockAllUpdates=false)
void setDefaultProjectionColor(const KoColor &color)
KisSelectionSP globalSelection() const
Definition kis_image.cc:695
void setResolution(double xres, double yres)
void setDefaultPixel(const KoColor &defPixel)
KisCanvasResourceProvider * canvasResourceProvider()
virtual KoID colorModelId() const =0
virtual KoID colorDepthId() const =0
virtual const KoColorProfile * profile() const =0
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
quint8 opacityU8() const
Definition KoColor.cpp:341
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
void setAboutInfo(const QString &info, const QString &data)
T get(const QString &id) const
QString name() const
Definition KoID.cpp:68
QString id() const
Definition KoID.cpp:63
void setPinnedToTimeline(bool pinned)
virtual void setUserLocked(bool l)
void setOpacity(quint8 val)
virtual KisPaintDeviceSP paintDevice() const =0
virtual KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
virtual void setDirty()
Definition kis_node.cpp:577

References KisNodeFacade::addNode(), KisImage::assignImageProfile(), KisConfig::autoPinLayersToTimeline(), KisImage::bounds(), KisViewManager::canvasResourceProvider(), KoColorSpace::colorDepthId(), KisCanvasResourceProvider::colorHistory(), KoColorSpace::colorModelId(), KisImage::colorSpace(), connect(), createUndoStore(), KisPart::currentMainwindow(), d, KisSharedPtr< T >::data(), KisBaseProcessor::defaultConfiguration(), KisConfig::defColorModel(), KisConfig::defColorProfile(), KisConfig::defImageHeight(), KisConfig::defImageResolution(), KisConfig::defImageWidth(), documentInfo(), KisConfig::FILL_LAYER, KoGenericRegistry< T >::get(), KisImage::globalSelection(), KoID::id(), image, KisGeneratorRegistry::instance(), KisGlobalResourcesInterface::instance(), KisPart::instance(), KisUsageLogger::log(), KoID::name(), KoColorProfile::name, KisImage::nextLayerName(), OPACITY_OPAQUE_U8, KoColor::opacityU8(), KisBaseNode::paintDevice(), KoColorSpace::profile(), KisConfig::RASTER_LAYER, KisNodeFacade::root, KisImage::rootLayer(), KoDocumentInfo::setAboutInfo(), setColorHistory(), setCurrentImage(), KisConfig::setDefaultColorDepth(), KisPaintDevice::setDefaultPixel(), KisImage::setDefaultProjectionColor(), KisNode::setDirty(), setImageModified(), setImageModifiedWithoutUndo(), KoColor::setOpacity(), KisBaseNode::setOpacity(), KisBaseNode::setPinnedToTimeline(), KisImage::setResolution(), KisBaseNode::setUserLocked(), KoColor::toQColor(), KisConfig::useDefaultColorSpace(), KisMainWindow::viewManager, and KisImage::waitForDone().

◆ newObjectName()

QString KisDocument::newObjectName ( )
private

Generate a name for the document.

Definition at line 159 of file KisDocument.cpp.

160{
161 static int s_docIFNumber = 0;
162 QString name; name.setNum(s_docIFNumber++); name.prepend("document_");
163 return name;
164}

◆ openFile()

bool KisDocument::openFile ( )
private

Loads a document

Applies a filter if necessary, and calls loadNativeFormat in any case You should not have to reimplement, except for very special cases.

NOTE: this method also creates a new KisView instance!

This method is called from the KReadOnlyPart::openPath method.

Definition at line 1960 of file KisDocument.cpp.

1961{
1962 //dbgUI <<"for" << localFilePath();
1963 if (!QFile::exists(localFilePath()) && !fileBatchMode()) {
1964 QMessageBox::critical(qApp->activeWindow(), i18nc("@title:window", "Krita"), i18n("File %1 does not exist.", localFilePath()));
1965 return false;
1966 }
1967
1968 QString filename = localFilePath();
1969 QString typeName = mimeType();
1970
1971 if (typeName.isEmpty()) {
1972 typeName = KisMimeDatabase::mimeTypeForFile(filename);
1973 }
1974
1975 // Allow to open backup files, don't keep the mimeType application/x-trash.
1976 if (typeName == "application/x-trash") {
1977 QString path = filename;
1978 while (path.length() > 0) {
1979 path.chop(1);
1980 typeName = KisMimeDatabase::mimeTypeForFile(path);
1981 //qDebug() << "\t" << path << typeName;
1982 if (!typeName.isEmpty()) {
1983 break;
1984 }
1985 }
1986 //qDebug() << "chopped" << filename << "to" << path << "Was trash, is" << typeName;
1987 }
1988 dbgUI << localFilePath() << "type:" << typeName;
1989
1991 KoUpdaterPtr updater;
1992 if (window && window->viewManager()) {
1993 updater = window->viewManager()->createUnthreadedUpdater(i18n("Opening document"));
1994 d->importExportManager->setUpdater(updater);
1995 }
1996
1997 KisImportExportErrorCode status = d->importExportManager->importDocument(localFilePath(), typeName);
1998
1999 if (!status.isOk()) {
2000 if (window && window->viewManager()) {
2001 updater->cancel();
2002 }
2003 QString msg = status.errorMessage();
2004 KisUsageLogger::log(QString("Loading %1 failed: %2").arg(prettyPath(), msg));
2005
2006 if (!msg.isEmpty() && !fileBatchMode()) {
2007 DlgLoadMessages dlg(i18nc("@title:window", "Krita"),
2008 i18n("Could not open %1.", prettyPath()),
2009 errorMessage().split("\n", Qt::SkipEmptyParts)
2010 + warningMessage().split("\n", Qt::SkipEmptyParts),
2011 msg);
2012
2013 dlg.exec();
2014 }
2015 return false;
2016 }
2017 else if (!warningMessage().isEmpty() && !fileBatchMode()) {
2018 DlgLoadMessages dlg(i18nc("@title:window", "Krita"),
2019 i18n("There were problems opening %1.", prettyPath()),
2020 warningMessage().split("\n", Qt::SkipEmptyParts));
2021
2022 dlg.exec();
2023 setPath(QString());
2024 }
2025
2026 setMimeTypeAfterLoading(typeName);
2027 d->syncDecorationsWrapperLayerState();
2028 Q_EMIT sigLoadingFinished();
2029
2030 undoStack()->clear();
2031
2032 return true;
2033}
KUndo2Stack * undoStack
void sigLoadingFinished()
void setPath(const QString &path)
bool fileBatchMode() const
void setMimeTypeAfterLoading(const QString &mimeType)
QString prettyPath() const
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
QPointer< KoUpdater > createUnthreadedUpdater(const QString &name)
create a new progress updater
QList< KoSubpath * > split(const KoPathShape &path)

References KUndo2QStack::clear(), KisViewManager::createUnthreadedUpdater(), KisPart::currentMainwindow(), d, dbgUI, errorMessage(), KisImportExportErrorCode::errorMessage(), fileBatchMode(), KisPart::instance(), KisImportExportErrorCode::isOk(), localFilePath(), KisUsageLogger::log(), mimeType, KisMimeDatabase::mimeTypeForFile(), prettyPath(), setMimeTypeAfterLoading(), setPath(), sigLoadingFinished(), undoStack, KisMainWindow::viewManager, and warningMessage().

◆ openPath()

bool KisDocument::openPath ( const QString & path,
OpenFlags flags = None )

openPath Open a Path

Parameters
pathPath to file
flagsControl specific behavior
Returns
success status

Definition at line 1891 of file KisDocument.cpp.

1892{
1893 dbgUI << "path=" << _path;
1894 d->lastErrorMessage.clear();
1895
1896 // Reimplemented, to add a check for autosave files and to improve error reporting
1897 if (_path.isEmpty()) {
1898 d->lastErrorMessage = i18n("Malformed Path\n%1", _path); // ## used anywhere ?
1899 return false;
1900 }
1901
1902 QString path = _path;
1903 QString original = "";
1904 bool autosaveOpened = false;
1905 if (!fileBatchMode()) {
1906 QString file = path;
1907 QString asf = generateAutoSaveFileName(file);
1908 if (QFile::exists(asf)) {
1909 KisApplication *kisApp = static_cast<KisApplication*>(qApp);
1910 kisApp->hideSplashScreen();
1911 //qDebug() <<"asf=" << asf;
1912 // ## TODO compare timestamps ?
1913 KisRecoverNamedAutosaveDialog dlg(0, file, asf);
1914 dlg.exec();
1915 int res = dlg.result();
1916
1917 switch (res) {
1919 original = file;
1920 path = asf;
1921 autosaveOpened = true;
1922 break;
1924 KisUsageLogger::log(QString("Removing autosave file: %1").arg(asf));
1925 QFile::remove(asf);
1926 break;
1927 default: // Cancel
1928 return false;
1929 }
1930 }
1931 }
1932
1933 bool ret = openPathInternal(path);
1934
1935 if (autosaveOpened || flags & RecoveryFile) {
1936 setReadWrite(true); // enable save button
1937 setModified(true);
1938 setRecovered(true);
1939
1940 setPath(original); // since it was an autosave, it will be a local file
1941 setLocalFilePath(original);
1942 }
1943 else {
1944 if (ret) {
1945
1946 if (!(flags & DontAddToRecent)) {
1947 KisPart::instance()->addRecentURLToAllMainWindows(QUrl::fromLocalFile(_path));
1948 }
1949
1950 QFileInfo fi(_path);
1951 setReadWrite(fi.isWritable());
1952 }
1953
1954 setRecovered(false);
1955 }
1956
1957 return ret;
1958}
Base class for the Krita app.
void setLocalFilePath(const QString &localFilePath)
void setRecovered(bool value)
void setReadWrite(bool readwrite=true)
Sets whether the document can be edited or is read only.
bool openPathInternal(const QString &path)
void addRecentURLToAllMainWindows(QUrl url, QUrl oldUrl=QUrl())
Definition KisPart.cpp:598
The KisRecoverNamedAutosaveDialog class is a dialog to recover already existing files from autosave.

References KisPart::addRecentURLToAllMainWindows(), d, dbgUI, DontAddToRecent, fileBatchMode(), generateAutoSaveFileName(), KisApplication::hideSplashScreen(), KisPart::instance(), KisUsageLogger::log(), KisRecoverNamedAutosaveDialog::OpenAutosave, KisRecoverNamedAutosaveDialog::OpenMainFile, openPathInternal(), path(), RecoveryFile, setLocalFilePath(), setModified(), setPath(), setReadWrite(), and setRecovered().

◆ openPathInternal()

bool KisDocument::openPathInternal ( const QString & path)
private

Definition at line 2542 of file KisDocument.cpp.

2543{
2544 if ( path.isEmpty() ) {
2545 return false;
2546 }
2547
2548 if (d->m_bAutoDetectedMime) {
2549 d->mimeType = QByteArray();
2550 d->m_bAutoDetectedMime = false;
2551 }
2552
2553 QByteArray mimeType = d->mimeType;
2554
2555 if ( !closePath() ) {
2556 return false;
2557 }
2558
2559 d->mimeType = mimeType;
2560 setPath(path);
2561
2562 d->m_file.clear();
2563
2564 d->m_file = d->m_path;
2565
2566 bool ret = false;
2567 // set the mimeType only if it was not already set (for example, by the host application)
2568 if (d->mimeType.isEmpty()) {
2569 // get the mimeType of the file
2570 // using findByUrl() to avoid another string -> url conversion
2571 QString mime = KisMimeDatabase::mimeTypeForFile(d->m_path);
2572 d->mimeType = mime.toLocal8Bit();
2573 d->m_bAutoDetectedMime = true;
2574 }
2575
2576 setPath(d->m_path);
2577 ret = openFile();
2578
2579 if (ret) {
2580 Q_EMIT completed();
2581 }
2582 else {
2583 Q_EMIT canceled(QString());
2584 }
2585 return ret;
2586}
void completed()
void canceled(const QString &)
bool closePath(bool promptToSave=true)

References canceled(), closePath(), completed(), d, mimeType, KisMimeDatabase::mimeTypeForFile(), openFile(), and setPath().

◆ path()

QString KisDocument::path ( ) const

Definition at line 2491 of file KisDocument.cpp.

2492{
2493 return d->m_path;
2494}

References d.

◆ preActivatedNode()

KisNodeSP KisDocument::preActivatedNode ( ) const
Returns
the node that was set as active during loading. Used only for saving loading. Never use it for tools or processing.

◆ prettyPath()

QString KisDocument::prettyPath ( ) const
private

Definition at line 2140 of file KisDocument.cpp.

2141{
2142 QString _url(path());
2143#ifdef Q_OS_WIN
2144 _url = QDir::toNativeSeparators(_url);
2145#endif
2146 return _url;
2147}

References path().

◆ Private() [1/2]

KisDocument::Private ( const Private & rhs,
KisDocument * _q )
inline

Definition at line 322 of file KisDocument.cpp.

323 : q(_q)
324 , docInfo(new KoDocumentInfo(*rhs.docInfo, _q))
326 , autoSaveTimer(new QTimer(_q))
327 , undoStack(new UndoStack(_q))
328 , colorHistory(rhs.colorHistory)
329 , nserver(new KisNameServer(*rhs.nserver))
330 , preActivatedNode(0) // the node is from another hierarchy!
331 , imageIdleWatcher(2000 /*ms*/)
332 {
333 copyFromImpl(rhs, _q, CONSTRUCT);
334 connect(&imageIdleWatcher, SIGNAL(startedIdleMode()), q, SLOT(slotPerformIdleRoutines()));
335 }
QList< KoColor > colorHistory
QTimer * autoSaveTimer
void copyFromImpl(const Private &rhs, KisDocument *q, KisDocument::CopyPolicy policy)
KisImportExportManager * importExportManager
KisDocument * q
KisNodeWSP preActivatedNode
KisIdleWatcher imageIdleWatcher
void slotPerformIdleRoutines()
The class managing all the filters.
The class containing all meta information about a document.

References connect().

◆ Private() [2/2]

KisDocument::Private ( KisDocument * _q)
inline

Definition at line 297 of file KisDocument.cpp.

298 : q(_q)
299 , docInfo(new KoDocumentInfo(_q)) // deleted by QObject
300 , importExportManager(new KisImportExportManager(_q)) // deleted manually
301 , autoSaveTimer(new QTimer(_q))
302 , undoStack(new UndoStack(_q)) // deleted by QObject
303 , m_bAutoDetectedMime(false)
304 , modified(false)
305 , readwrite(true)
306 , autoSaveActive(true)
307 , firstMod(QDateTime::currentDateTime())
309 , nserver(new KisNameServer(1))
310 , imageIdleWatcher(2000 /*ms*/)
311 , globalAssistantsColor(KisConfig(true).defaultAssistantsColor())
312 , batchMode(false)
313 {
314 if (QLocale().measurementSystem() == QLocale::ImperialSystem) {
316 } else {
318 }
319 connect(&imageIdleWatcher, SIGNAL(startedIdleMode()), q, SLOT(slotPerformIdleRoutines()));
320 }
bool m_bAutoDetectedMime
QDateTime lastMod
QDateTime firstMod
QColor globalAssistantsColor
@ Centimeter
Definition KoUnit.h:78
@ Inch
Definition KoUnit.h:77

References KoUnit::Centimeter, connect(), and KoUnit::Inch.

◆ referenceImagesLayer()

KisReferenceImagesLayerSP KisDocument::referenceImagesLayer ( ) const

Get existing reference images layer or null if none exists.

Definition at line 2734 of file KisDocument.cpp.

2735{
2736 if (!d->image) return KisReferenceImagesLayerSP();
2737
2738 KisReferenceImagesLayerSP referencesLayer =
2739 KisLayerUtils::findNodeByType<KisReferenceImagesLayer>(d->image->root());
2740
2741 return referencesLayer;
2742}
KisSharedPtr< KisReferenceImagesLayer > KisReferenceImagesLayerSP

References d.

◆ removeAutoSaveFiles()

void KisDocument::removeAutoSaveFiles ( const QString & autosaveBaseName,
bool wasRecovered )

Performs a cleanup of unneeded backup files

Definition at line 2213 of file KisDocument.cpp.

2214{
2215 // Eliminate any auto-save file
2216 QString asf = generateAutoSaveFileName(autosaveBaseName); // the one in the current dir
2217 if (QFile::exists(asf)) {
2218 KisUsageLogger::log(QString("Removing autosave file: %1").arg(asf));
2219 QFile::remove(asf);
2220 }
2221 asf = generateAutoSaveFileName(QString()); // and the one in $HOME
2222
2223 if (QFile::exists(asf)) {
2224 KisUsageLogger::log(QString("Removing autosave file: %1").arg(asf));
2225 QFile::remove(asf);
2226 }
2227
2228 QList<QRegularExpression> expressions;
2229
2230 expressions << QRegularExpression("^\\..+-autosave.kra$")
2231 << QRegularExpression("^.+-autosave.kra$");
2232
2233 Q_FOREACH(const QRegularExpression &rex, expressions) {
2234 if (wasRecovered &&
2235 !autosaveBaseName.isEmpty() &&
2236 rex.match(QFileInfo(autosaveBaseName).fileName()).hasMatch() &&
2237 QFile::exists(autosaveBaseName)) {
2238
2239 KisUsageLogger::log(QString("Removing autosave file: %1").arg(autosaveBaseName));
2240 QFile::remove(autosaveBaseName);
2241 }
2242 }
2243}

References generateAutoSaveFileName(), and KisUsageLogger::log().

◆ resetPath()

void KisDocument::resetPath ( )

Sets the document Path to empty Path After using loadNativeFormat on a template, one wants to set the path to QString()

Definition at line 2476 of file KisDocument.cpp.

2476 {
2477 setPath(QString());
2478 setLocalFilePath(QString());
2479}

References setLocalFilePath(), and setPath().

◆ resourceSavingFilter()

bool KisDocument::resourceSavingFilter ( const QString & path,
const QByteArray & mimeType,
KisPropertiesConfigurationSP exportConfiguration )
private

Checks whether we are saving a resource we've been editing, and if so, uses the resource server to update the resource.

Returns
true if this was a resource, false if the document needs to be saved

Definition at line 1508 of file KisDocument.cpp.

1509{
1510 if (QFileInfo(path).absolutePath().startsWith(KisResourceLocator::instance()->resourceLocationBase())) {
1511
1512 QStringList pathParts = QFileInfo(path).absolutePath().split('/');
1513 if (pathParts.size() > 0) {
1514 QString resourceType = pathParts.last();
1515 if (KisResourceLoaderRegistry::instance()->resourceTypes().contains(resourceType)) {
1516
1517 KisResourceModel model(resourceType);
1518 model.setResourceFilter(KisResourceModel::ShowAllResources);
1519
1520 QString tempFileName = QDir::tempPath() + "/" + QFileInfo(path).fileName();
1521
1522 if (QFileInfo(path).exists()) {
1523
1524 int outResourceId;
1525 KoResourceSP res;
1526 if (KisResourceCacheDb::getResourceIdFromVersionedFilename(QFileInfo(path).fileName(), resourceType, "", outResourceId)) {
1527 res = model.resourceForId(outResourceId);
1528 }
1529
1530 if (res) {
1531 d->modifiedWhileSaving = false;
1532
1533 if (!exportConfiguration) {
1534 QScopedPointer<KisImportExportFilter> filter(
1536 if (filter) {
1537 exportConfiguration = filter->defaultConfiguration(nativeFormatMimeType(), mimeType);
1538 }
1539 }
1540
1541 if (exportConfiguration) {
1542 // make sure the name of the resource doesn't change
1543 exportConfiguration->setProperty("name", res->name());
1544 }
1545
1546 if (exportDocumentSync(tempFileName, mimeType, exportConfiguration)) {
1547 QFile f2(tempFileName);
1548 f2.open(QFile::ReadOnly);
1549
1550 QByteArray ba = f2.readAll();
1551
1552 QBuffer buf(&ba);
1553 buf.open(QBuffer::ReadOnly);
1554
1555
1556
1557 if (res->loadFromDevice(&buf, KisGlobalResourcesInterface::instance())) {
1558 if (model.updateResource(res)) {
1559 const QString filePath =
1561
1562 d->updateDocumentMetadataOnSaving(filePath, mimeType);
1563
1564 return true;
1565 }
1566 }
1567 }
1568 }
1569 }
1570 else {
1571 d->modifiedWhileSaving = false;
1572 if (exportDocumentSync(tempFileName, mimeType, exportConfiguration)) {
1573 KoResourceSP res = model.importResourceFile(tempFileName, false);
1574 if (res) {
1575 const QString filePath =
1577
1578 d->updateDocumentMetadataOnSaving(filePath, mimeType);
1579
1580 return true;
1581 }
1582 }
1583 }
1584 }
1585 }
1586 }
1587 return false;
1588}
static KisImportExportFilter * filterForMimeType(const QString &mimetype, Direction direction)
filterForMimeType loads the relevant import/export plugin and returns it. The caller is responsible f...
static bool getResourceIdFromVersionedFilename(QString filename, QString resourceType, QString storageLocation, int &outResourceId)
Note that here you can put even the original filename - any filename from the versioned_resources - a...
QString filePathForResource(KoResourceSP resource)
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...

References d, KisImportExportManager::Export, exportDocumentSync(), KisResourceLocator::filePathForResource(), KisImportExportManager::filterForMimeType(), KisResourceCacheDb::getResourceIdFromVersionedFilename(), KisResourceModel::importResourceFile(), KisGlobalResourcesInterface::instance(), KisResourceLoaderRegistry::instance(), KisResourceLocator::instance(), mimeType, nativeFormatMimeType(), KisResourceModel::resourceForId(), KisResourceModel::setResourceFilter(), KisAbstractResourceFilterInterface::ShowAllResources, and KisResourceModel::updateResource().

◆ save()

bool KisDocument::save ( bool showWarnings,
KisPropertiesConfigurationSP exportConfiguration )

Definition at line 924 of file KisDocument.cpp.

925{
926 return saveAs(path(), mimeType(), showWarnings, exportConfiguration);
927}
bool saveAs(const QString &path, const QByteArray &mimeType, bool showWarnings, KisPropertiesConfigurationSP exportConfiguration=0)

References mimeType, path(), and saveAs().

◆ saveAs()

bool KisDocument::saveAs ( const QString & path,
const QByteArray & mimeType,
bool showWarnings,
KisPropertiesConfigurationSP exportConfiguration = 0 )

Definition at line 900 of file KisDocument.cpp.

901{
902 using namespace KritaUtils;
903
904 KisUsageLogger::log(QString("Saving Document %9 as %1 (mime: %2). %3 * %4 pixels, %5 layers. %6 frames, "
905 "%7 framerate. Export configuration: %8")
906 .arg(_path, QString::fromLatin1(mimeType), QString::number(d->image->width()),
907 QString::number(d->image->height()), QString::number(d->image->nlayers()),
908 QString::number(d->image->animationInterface()->totalLength()),
909 QString::number(d->image->animationInterface()->framerate()),
910 (exportConfiguration ? exportConfiguration->toXML() : "No configuration"),
911 path()));
912
913 // Check whether it's an existing resource were are saving to
914 if (resourceSavingFilter(_path, mimeType, exportConfiguration)) {
915 return true;
916 }
917
919 mimeType,
920 showWarnings ? SaveShowWarnings : SaveNone),
921 exportConfiguration);
922}
bool resourceSavingFilter(const QString &path, const QByteArray &mimeType, KisPropertiesConfigurationSP exportConfiguration)

References d, exportDocumentImpl(), KisUsageLogger::log(), mimeType, path(), and resourceSavingFilter().

◆ savingImage()

KisImageSP KisDocument::savingImage ( ) const

savingImage provides a detached, shallow copy of the original image that must be used when saving. Any strokes in progress will not be applied to this image, so the result might be missing some data. On the other hand, it won't block.

Returns
a shallow copy of the original image, or 0 is saving is not in progress

◆ serializeToNativeByteArray()

QByteArray KisDocument::serializeToNativeByteArray ( )

serializeToNativeByteArray daves the document into a .kra file written to a memory-based byte-array

Returns
a byte array containing the .kra file

Definition at line 929 of file KisDocument.cpp.

930{
931 QBuffer buffer;
932
934 filter->setBatchMode(true);
935 filter->setMimeType(nativeFormatMimeType());
936
937 Private::StrippedSafeSavingLocker locker(&d->savingMutex, d->image);
938 if (!locker.successfullyLocked()) {
939 return buffer.data();
940 }
941
942 d->savingImage = d->image;
943
944 if (!filter->convert(this, &buffer).isOk()) {
945 qWarning() << "serializeToByteArray():: Could not export to our native format";
946 }
947
948 return buffer.data();
949}

References d, KisImportExportManager::Export, KisImportExportManager::filterForMimeType(), and nativeFormatMimeType().

◆ setAssistants()

void KisDocument::setAssistants ( const QList< KisPaintingAssistantSP > & value)

@replace the current list of assistants with

Parameters
value

Definition at line 2725 of file KisDocument.cpp.

2726{
2727 if (d->assistants != value) {
2728 d->assistants = value;
2729 d->syncDecorationsWrapperLayerState();
2730 Q_EMIT sigAssistantsChanged();
2731 }
2732}
float value(const T *src, size_t ch)
void sigAssistantsChanged()

References d, sigAssistantsChanged(), and value().

◆ setAssistantsGlobalColor()

void KisDocument::setAssistantsGlobalColor ( QColor color)

Definition at line 2867 of file KisDocument.cpp.

2868{
2869 d->globalAssistantsColor = color;
2870}

References d.

◆ setAudioTracks()

void KisDocument::setAudioTracks ( QVector< QFileInfo > f)

Definition at line 2423 of file KisDocument.cpp.

2424{
2425 d->audioTracks = f;
2426 Q_EMIT sigAudioTracksChanged();
2427}
void sigAudioTracksChanged()

References d, and sigAudioTracksChanged().

◆ setAudioVolume()

void KisDocument::setAudioVolume ( qreal level)

Definition at line 2429 of file KisDocument.cpp.

2430{
2431 d->audioLevel = level;
2432 Q_EMIT sigAudioLevelChanged(level);
2433}
void sigAudioLevelChanged(qreal level)

References d, and sigAudioLevelChanged().

◆ setAutoSaveActive()

void KisDocument::setAutoSaveActive ( bool autoSaveIsActive)

Allow to activate or deactivate autosave on document, independently of auto save delay

the value is independent of auto save delay

Definition at line 1733 of file KisDocument.cpp.

1734{
1735 const bool changed = autoSaveActive != d->autoSaveActive;
1736
1737 if (changed) {
1738 d->autoSaveActive = autoSaveActive;
1740 }
1741}
void setNormalAutoSaveInterval()

References autoSaveActive, d, and setNormalAutoSaveInterval().

◆ setAutoSaveDelay()

void KisDocument::setAutoSaveDelay ( int delay)
private

Activate/deactivate/configure the autosave feature.

Parameters
delayin seconds, 0 to disable

Definition at line 1743 of file KisDocument.cpp.

1744{
1745 if (isReadWrite() && delay > 0 && d->autoSaveActive) {
1746 d->autoSaveTimer->start(delay * 1000);
1747 } else {
1748 d->autoSaveTimer->stop();
1749 }
1750}

References d, and isReadWrite().

◆ setColorHistory()

void KisDocument::setColorHistory ( const QList< KoColor > & colors)

Definition at line 2895 of file KisDocument.cpp.

2896{
2897 d->colorHistory = colors;
2898}

References d.

◆ setCurrentImage()

void KisDocument::setCurrentImage ( KisImageSP image,
bool forceInitialUpdate = true,
KisNodeSP preActivatedNode = nullptr )

Set the current image to the specified image and turn undo on.

Definition at line 2799 of file KisDocument.cpp.

2800{
2801 if (d->image) {
2802 // Disconnect existing sig/slot connections
2803 d->image->setUndoStore(new KisDumbUndoStore());
2804 d->image->disconnect(this);
2805 d->shapeController->setImage(0);
2806 d->image = 0;
2807 }
2808
2809 if (!image) return;
2810
2811 if (d->linkedResourceStorage){
2812 d->linkedResourceStorage->setMetaData(KisResourceStorage::s_meta_name, image->objectName());
2813 }
2814
2815 d->setImageAndInitIdleWatcher(image);
2816 d->image->setUndoStore(new KisDocumentUndoStore(this));
2817 d->shapeController->setImage(image, preActivatedNode);
2818 d->image->setMirrorAxesCenter(KisAlgebra2D::absoluteToRelative(d->mirrorAxisConfig.axisPosition(), image->bounds()));
2819 setModified(false);
2820 connect(d->image, SIGNAL(sigImageModified()), this, SLOT(setImageModified()), Qt::UniqueConnection);
2821 connect(d->image, SIGNAL(sigImageModifiedWithoutUndo()), this, SLOT(setImageModifiedWithoutUndo()), Qt::UniqueConnection);
2822 connect(d->image, SIGNAL(sigLayersChangedAsync()), this, SLOT(slotImageRootChanged()));
2823
2824 if (forceInitialUpdate) {
2825 d->image->initialRefreshGraph();
2826 }
2827}
void slotImageRootChanged()
The KisDumbUndoStore class doesn't actually save commands, so you cannot undo or redo!
static const QString s_meta_name
QPointF absoluteToRelative(const QPointF &pt, const QRectF &rc)

References KisAlgebra2D::absoluteToRelative(), KisImage::bounds(), connect(), d, image, preActivatedNode, KisResourceStorage::s_meta_name, setImageModified(), setImageModifiedWithoutUndo(), setModified(), and slotImageRootChanged().

◆ setEmergencyAutoSaveInterval()

void KisDocument::setEmergencyAutoSaveInterval ( )

Set emergency interval that autosave uses when the image is busy, by default it is 10 sec

Definition at line 1758 of file KisDocument.cpp.

1759{
1760 const int emergencyAutoSaveInterval = 10; /* sec */
1761 setAutoSaveDelay(emergencyAutoSaveInterval);
1762 d->autoSaveFailureCount++;
1763}
void setAutoSaveDelay(int delay)

References d, and setAutoSaveDelay().

◆ setEmpty()

void KisDocument::setEmpty ( bool empty = true)

Sets the document to empty.

Used after loading a template (which is not empty, but not the user's input).

See also
isEmpty()

◆ setErrorMessage()

void KisDocument::setErrorMessage ( const QString & errMsg)

Sets the error message to be shown to the user (use i18n()!) when loading or saving fails. If you asked the user about something and they chose "Cancel",

Definition at line 2192 of file KisDocument.cpp.

2193{
2194 d->lastErrorMessage = errMsg;
2195}

References d.

◆ setFileBatchMode()

void KisDocument::setFileBatchMode ( const bool batchMode)
Parameters
batchModeif true, do not show the option dialog for file operations.

Definition at line 1091 of file KisDocument.cpp.

1092{
1093 d->batchMode = batchMode;
1094}

References batchMode, and d.

◆ setGridConfig()

void KisDocument::setGridConfig ( const KisGridConfig & config)

Definition at line 2308 of file KisDocument.cpp.

2309{
2310 if (d->gridConfig != config) {
2311 d->gridConfig = config;
2312 d->syncDecorationsWrapperLayerState();
2313 Q_EMIT sigGridConfigChanged(config);
2314
2315 // Store last assigned value as future default...
2316 KisConfig cfg(false);
2317 cfg.setDefaultGridSpacing(config.spacing());
2318 }
2319}
void sigGridConfigChanged(const KisGridConfig &config)
QPoint spacing() const

References d, KisConfig::setDefaultGridSpacing(), sigGridConfigChanged(), and KisGridConfig::spacing().

◆ setGuidesConfig()

void KisDocument::setGuidesConfig ( const KisGuidesConfig & data)

Definition at line 2445 of file KisDocument.cpp.

2446{
2447 if (d->guidesConfig == data) return;
2448
2449 d->guidesConfig = data;
2450 d->syncDecorationsWrapperLayerState();
2451 Q_EMIT sigGuidesConfigChanged(d->guidesConfig);
2452}
void sigGuidesConfigChanged(const KisGuidesConfig &config)

References d, and sigGuidesConfigChanged().

◆ setImageAndInitIdleWatcher()

void KisDocument::setImageAndInitIdleWatcher ( KisImageSP _image)
inline

Definition at line 429 of file KisDocument.cpp.

429 {
430 image = _image;
431
433 }
void setTrackedImage(KisImageSP image)

References KisIdleWatcher::setTrackedImage().

◆ setImageModified

void KisDocument::setImageModified ( )
privateslot

Definition at line 2839 of file KisDocument.cpp.

2840{
2841 // we only set as modified if undo stack is not at clean state
2842 setModified(d->imageModifiedWithoutUndo || !d->undoStack->isClean());
2843}

References d, and setModified().

◆ setImageModifiedWithoutUndo

void KisDocument::setImageModifiedWithoutUndo ( )
privateslot

Definition at line 2845 of file KisDocument.cpp.

2846{
2847 d->imageModifiedWithoutUndo = true;
2849}

References d, and setImageModified().

◆ setInfiniteAutoSaveInterval()

void KisDocument::setInfiniteAutoSaveInterval ( )

Disable autosave

Definition at line 1765 of file KisDocument.cpp.

1766{
1767 setAutoSaveDelay(-1);
1768}

References setAutoSaveDelay().

◆ setLocalFilePath()

void KisDocument::setLocalFilePath ( const QString & localFilePath)

Definition at line 2537 of file KisDocument.cpp.

2538{
2539 d->m_file = localFilePath;
2540}

References d, and localFilePath().

◆ setMimeType()

void KisDocument::setMimeType ( const QByteArray & mimeType)

Sets the mime type for the document.

When choosing "save as" this is also the mime type selected by default.

Definition at line 1081 of file KisDocument.cpp.

1082{
1083 d->mimeType = mimeType;
1084}

References d, and mimeType.

◆ setMimeTypeAfterLoading()

void KisDocument::setMimeTypeAfterLoading ( const QString & mimeType)

Definition at line 2056 of file KisDocument.cpp.

2057{
2058 d->mimeType = mimeType.toLatin1();
2059 d->outputMimeType = d->mimeType;
2060}

References d, and mimeType.

◆ setMirrorAxisConfig()

void KisDocument::setMirrorAxisConfig ( const KisMirrorAxisConfig & config)

Definition at line 2460 of file KisDocument.cpp.

2461{
2462 if (d->mirrorAxisConfig == config) {
2463 return;
2464 }
2465
2466 d->mirrorAxisConfig = config;
2467 if (d->image) {
2468 d->image->setMirrorAxesCenter(KisAlgebra2D::absoluteToRelative(d->mirrorAxisConfig.axisPosition(),
2469 d->image->bounds()));
2470 }
2471 setModified(true);
2472
2474}
void sigMirrorAxisConfigChanged()

References KisAlgebra2D::absoluteToRelative(), d, setModified(), and sigMirrorAxisConfigChanged().

◆ setModified()

void KisDocument::setModified ( bool _mod)

Sets the modified flag on the document. This means that it has to be saved or not before deleting it.

1) Ignore setModified calls due to autosaving 2) When closing a document, QUndoStack emits a lot of modified signals, when clearing itself, so we should ignore all of them.

Definition at line 2068 of file KisDocument.cpp.

2069{
2070 if (mod) {
2071 updateEditingTime(false);
2072 }
2073
2078 if (d->isAutosaving || d->documentIsClosing)
2079 return;
2080
2081 //dbgUI<<" url:" << url.path();
2082 //dbgUI<<" mod="<<mod<<" MParts mod="<<KisParts::ReadWritePart::isModified()<<" isModified="<<isModified();
2083
2084 if (mod && !d->autoSaveTimer->isActive()) {
2085 // First change since last autosave -> start the autosave timer
2087 }
2088 d->modifiedAfterAutosave = mod;
2089 d->modifiedWhileSaving = mod;
2090
2091 if (!mod) {
2092 d->imageModifiedWithoutUndo = mod;
2093 }
2094
2095 if (mod == isModified())
2096 return;
2097
2098 d->modified = mod;
2099
2100 if (mod) {
2102 }
2103
2104 Q_EMIT modified(mod);
2105}
void updateEditingTime(bool forceStoreElapsed)
KoColorSpaceMathsTraits< T >::compositetype mod(T a, T b)

References d, documentInfo(), isModified(), modified, setNormalAutoSaveInterval(), updateEditingTime(), and KoDocumentInfo::updateParameters().

◆ setNormalAutoSaveInterval()

void KisDocument::setNormalAutoSaveInterval ( )

Set standard autosave interval that is set by a config file

Definition at line 1752 of file KisDocument.cpp.

1753{
1754 setAutoSaveDelay(d->autoSaveDelay);
1755 d->autoSaveFailureCount = 0;
1756}

References d, and setAutoSaveDelay().

◆ setPaletteList()

void KisDocument::setPaletteList ( const QList< KoColorSetSP > & paletteList,
bool emitSignal = false )

setPaletteList replaces the palettes in the document's local resource storage with the list of palettes passed to this function. It will then Q_EMIT sigPaletteListChanged with both the old and the new list, if emitSignal is true.

Definition at line 2358 of file KisDocument.cpp.

2359{
2360 QList<KoColorSetSP> oldPaletteList;
2361 if (d->linkedResourceStorage) {
2362 QSharedPointer<KisResourceStorage::ResourceIterator> iter = d->linkedResourceStorage->resources(ResourceType::Palettes);
2363 while (iter->hasNext()) {
2364 iter->next();
2365 KoResourceSP resource = iter->resource();
2366 if (resource && resource->valid()) {
2367 oldPaletteList << resource.dynamicCast<KoColorSet>();
2368 }
2369 }
2370 if (oldPaletteList != paletteList) {
2372 Q_FOREACH(KoColorSetSP palette, oldPaletteList) {
2373 if (!paletteList.contains(palette)) {
2374 resourceModel.setResourceInactive(resourceModel.indexForResource(palette));
2375 }
2376 }
2377 Q_FOREACH(KoColorSetSP palette, paletteList) {
2378 if (!oldPaletteList.contains(palette)) {
2379 resourceModel.addResource(palette, d->linkedResourcesStorageID);
2380 }
2381 else {
2382 palette->setStorageLocation(d->linkedResourcesStorageID);
2383 resourceModel.updateResource(palette);
2384 }
2385 }
2386 if (emitSignal) {
2387 Q_EMIT sigPaletteListChanged(oldPaletteList, paletteList);
2388 }
2389 }
2390 }
2391}
void sigPaletteListChanged(const QList< KoColorSetSP > &oldPaletteList, const QList< KoColorSetSP > &newPaletteList)
const QString Palettes
rgba palette[MAX_PALETTE]
Definition palette.c:35

References KisResourceModel::addResource(), d, KisResourceModel::indexForResource(), palette, ResourceType::Palettes, KisAbstractResourceModel::setResourceInactive(), sigPaletteListChanged(), and KisResourceModel::updateResource().

◆ setPath()

void KisDocument::setPath ( const QString & path)

Definition at line 2520 of file KisDocument.cpp.

2521{
2522 const bool changed = path != d->m_path;
2523
2524 d->m_path = path;
2525
2526 if (changed) {
2527 Q_EMIT sigPathChanged(path);
2528 }
2529}
void sigPathChanged(const QString &path)

References d, path(), and sigPathChanged().

◆ setPreActivatedNode()

void KisDocument::setPreActivatedNode ( KisNodeSP activatedNode)

Set the list of nodes that was marked as currently active. Used only for saving loading. Never use it for tools or processing.

Definition at line 2778 of file KisDocument.cpp.

2779{
2780 d->preActivatedNode = activatedNode;
2781}

References d.

◆ setReadWrite()

void KisDocument::setReadWrite ( bool readwrite = true)

Sets whether the document can be edited or is read only.

This recursively applied to all child documents and KisView::updateReadWrite is called for every attached view.

Definition at line 1722 of file KisDocument.cpp.

1723{
1724 const bool changed = readwrite != d->readwrite;
1725
1726 d->readwrite = readwrite;
1727
1728 if (changed) {
1730 }
1731}
void sigReadWriteChanged(bool value)

References d, readwrite, and sigReadWriteChanged().

◆ setRecovered()

void KisDocument::setRecovered ( bool value)

Definition at line 2107 of file KisDocument.cpp.

2108{
2109 const bool changed = value != d->isRecovered;
2110
2111 d->isRecovered = value;
2112
2113 if (changed) {
2114 Q_EMIT sigRecoveredChanged(value);
2115 }
2116}
void sigRecoveredChanged(bool value)

References d, sigRecoveredChanged(), and value().

◆ setReferenceImagesLayer()

void KisDocument::setReferenceImagesLayer ( KisSharedPtr< KisReferenceImagesLayer > layer,
bool updateImage )

Definition at line 2744 of file KisDocument.cpp.

2745{
2746 KisReferenceImagesLayerSP currentReferenceLayer = referenceImagesLayer();
2747
2748 // updateImage=false inherently means we are not changing the
2749 // reference images layer, but just would like to update its signals.
2750 if (currentReferenceLayer == layer && updateImage) {
2751 return;
2752 }
2753
2754 d->referenceLayerConnections.clear();
2755
2756 if (updateImage) {
2757 if (currentReferenceLayer) {
2758 d->image->removeNode(currentReferenceLayer);
2759 }
2760
2761 if (layer) {
2762 d->image->addNode(layer);
2763 }
2764 }
2765
2766 currentReferenceLayer = layer;
2767
2768 if (currentReferenceLayer) {
2769 d->referenceLayerConnections.addConnection(
2770 currentReferenceLayer, SIGNAL(sigUpdateCanvas(QRectF)),
2771 this, SIGNAL(sigReferenceImagesChanged()));
2772 }
2773
2774 Q_EMIT sigReferenceImagesLayerChanged(layer);
2776}

References d, referenceImagesLayer(), sigReferenceImagesChanged(), and sigReferenceImagesLayerChanged().

◆ setStoryboardCommentList()

void KisDocument::setStoryboardCommentList ( const QVector< StoryboardComment > & storyboardCommentList,
bool emitSignal = false )

sets the list of comments for the storyboard docker in the document, emits empty signal if emitSignal is true.

Definition at line 2411 of file KisDocument.cpp.

2412{
2413 d->m_storyboardCommentList = storyboardCommentList;
2414 if (emitSignal) {
2416 }
2417}
void sigStoryboardCommentListChanged()

References d, and sigStoryboardCommentListChanged().

◆ setStoryboardItemList()

void KisDocument::setStoryboardItemList ( const StoryboardItemList & storyboardItemList,
bool emitSignal = false )

sets the storyboardItemList in the document, emits empty signal if emitSignal is true.

Definition at line 2398 of file KisDocument.cpp.

2399{
2400 d->m_storyboardItemList = storyboardItemList;
2401 if (emitSignal) {
2403 }
2404}
void sigStoryboardItemListChanged()

References d, and sigStoryboardItemListChanged().

◆ setUnit()

void KisDocument::setUnit ( const KoUnit & unit)

Sets the unit used to display all measures/distances.

Definition at line 2250 of file KisDocument.cpp.

2251{
2252 if (d->unit != unit) {
2253 d->unit = unit;
2254 Q_EMIT unitChanged(unit);
2255 }
2256}
void unitChanged(const KoUnit &unit)

References d, unit, and unitChanged().

◆ setWarningMessage()

void KisDocument::setWarningMessage ( const QString & warningMsg)

Sets the warning message to be shown to the user (use i18n()!) when loading or saving fails.

Definition at line 2202 of file KisDocument.cpp.

2203{
2204 d->lastWarningMessage = warningMsg;
2205}

References d.

◆ shapeController()

KoShapeControllerBase * KisDocument::shapeController ( ) const

The shape controller matches internal krita image layers with the flake shape hierarchy.

◆ shapeForNode()

KoShapeLayer * KisDocument::shapeForNode ( KisNodeSP layer) const

Definition at line 2715 of file KisDocument.cpp.

2716{
2717 return d->shapeController->shapeForNode(layer);
2718}

References d.

◆ sigAssistantsChanged

void KisDocument::sigAssistantsChanged ( )
signal

◆ sigAudioLevelChanged

void KisDocument::sigAudioLevelChanged ( qreal level)
signal

◆ sigAudioTracksChanged

void KisDocument::sigAudioTracksChanged ( )
signal

◆ sigBackgroundSavingFinished

void KisDocument::sigBackgroundSavingFinished ( KisImportExportErrorCode status,
const QString & errorMessage,
const QString & warningMessage )
signal

◆ sigCompleteBackgroundSaving

void KisDocument::sigCompleteBackgroundSaving ( const KritaUtils::ExportFileJob & job,
KisImportExportErrorCode status,
const QString & errorMessage,
const QString & warningMessage )
signal

◆ sigGridConfigChanged

void KisDocument::sigGridConfigChanged ( const KisGridConfig & config)
signal

◆ sigGuidesConfigChanged

void KisDocument::sigGuidesConfigChanged ( const KisGuidesConfig & config)
signal

◆ sigLoadingFinished

void KisDocument::sigLoadingFinished ( )
signal

◆ sigMirrorAxisConfigChanged

void KisDocument::sigMirrorAxisConfigChanged ( )
signal

◆ sigPaletteListChanged

void KisDocument::sigPaletteListChanged ( const QList< KoColorSetSP > & oldPaletteList,
const QList< KoColorSetSP > & newPaletteList )
signal

Emitted when the palette list has changed. The pointers in oldPaletteList are to be deleted by the resource server.

◆ sigPathChanged

void KisDocument::sigPathChanged ( const QString & path)
signal

◆ sigReadWriteChanged

void KisDocument::sigReadWriteChanged ( bool value)
signal

◆ sigRecoveredChanged

void KisDocument::sigRecoveredChanged ( bool value)
signal

◆ sigReferenceImagesChanged

void KisDocument::sigReferenceImagesChanged ( )
signal

◆ sigReferenceImagesLayerChanged

void KisDocument::sigReferenceImagesLayerChanged ( KisSharedPtr< KisReferenceImagesLayer > layer)
signal

◆ sigSavingFinished

void KisDocument::sigSavingFinished ( const QString & filePath)
signal

◆ sigStoryboardCommentListChanged

void KisDocument::sigStoryboardCommentListChanged ( )
signal

◆ sigStoryboardItemListChanged

void KisDocument::sigStoryboardItemListChanged ( )
signal

◆ slotAutoSave

void KisDocument::slotAutoSave ( )
privateslot

Definition at line 1590 of file KisDocument.cpp.

1591{
1592 slotAutoSaveImpl(std::unique_ptr<KisDocument>());
1593}
void slotAutoSaveImpl(std::unique_ptr< KisDocument > &&optionalClonedDocument)

References slotAutoSaveImpl().

◆ slotAutoSaveImpl()

void KisDocument::slotAutoSaveImpl ( std::unique_ptr< KisDocument > && optionalClonedDocument)
private

Definition at line 1465 of file KisDocument.cpp.

1466{
1467 if (!d->modified || !d->modifiedAfterAutosave) return;
1468 const QString autoSaveFileName = generateAutoSaveFileName(localFilePath());
1469
1470 Q_EMIT statusBarMessage(i18n("Autosaving... %1", autoSaveFileName), successMessageTimeout);
1471
1472 KisUsageLogger::log(QString("Autosaving: %1").arg(autoSaveFileName));
1473
1474 const bool hadClonedDocument = bool(optionalClonedDocument);
1476
1477 if (d->image->isIdle() || hadClonedDocument) {
1478 result = initiateSavingInBackground(i18n("Autosaving..."),
1481 0,
1482 std::move(optionalClonedDocument));
1483 } else {
1484 Q_EMIT statusBarMessage(i18n("Autosaving postponed: document is busy..."), errorMessageTimeout);
1485 }
1486
1487 if (result != KritaUtils::BackgroudSavingStartResult::Success && !hadClonedDocument && d->autoSaveFailureCount >= 3) {
1489 connect(stroke, SIGNAL(sigDocumentCloned(KisDocument*)),
1491 Qt::BlockingQueuedConnection);
1492 connect(stroke, SIGNAL(sigCloningCancelled()),
1493 this, SLOT(slotDocumentCloningCancelled()),
1494 Qt::BlockingQueuedConnection);
1495
1496 KisStrokeId strokeId = d->image->startStroke(stroke);
1497 d->image->endStroke(strokeId);
1498
1500
1503 } else {
1504 d->modifiedAfterAutosave = false;
1505 }
1506}
void slotInitiateAsyncAutosaving(KisDocument *clonedDocument)
void setEmergencyAutoSaveInterval()
void statusBarMessage(const QString &text, int timeout=0)
void slotDocumentCloningCancelled()
void slotCompleteAutoSaving(const KritaUtils::ExportFileJob &job, KisImportExportErrorCode status, const QString &errorMessage, const QString &warningMessage)
void setInfiniteAutoSaveInterval()

References connect(), d, KritaUtils::Failure, generateAutoSaveFileName(), initiateSavingInBackground(), localFilePath(), KisUsageLogger::log(), nativeFormatMimeType(), KritaUtils::SaveInAutosaveMode, KritaUtils::SaveIsExporting, setEmergencyAutoSaveInterval(), setInfiniteAutoSaveInterval(), slotCompleteAutoSaving(), slotDocumentCloningCancelled(), slotInitiateAsyncAutosaving(), statusBarMessage(), and KritaUtils::Success.

◆ slotChildCompletedSavingInBackground

void KisDocument::slotChildCompletedSavingInBackground ( KisImportExportErrorCode status,
const QString & errorMessage,
const QString & warningMessage )
privateslot

Take back the ownership of the saving mutex and make sure it well be released whatever the result of executing this function will be, even if it asserts.

Definition at line 1429 of file KisDocument.cpp.

1430{
1432
1438 std::unique_lock<QMutex> savingMutexLock(d->savingMutex, std::adopt_lock);
1439
1440 KIS_ASSERT_RECOVER_RETURN(d->backgroundSaveDocument);
1441
1442 if (d->backgroundSaveJob.flags & KritaUtils::SaveInAutosaveMode) {
1443 d->backgroundSaveDocument->d->isAutosaving = false;
1444 }
1445
1446 d->backgroundSaveDocument.take()->deleteLater();
1447
1448 KIS_ASSERT_RECOVER_RETURN(d->backgroundSaveJob.isValid());
1449
1450 const KritaUtils::ExportFileJob job = d->backgroundSaveJob;
1451 d->backgroundSaveJob = KritaUtils::ExportFileJob();
1452
1453 // unlock at the very end
1454 savingMutexLock.unlock();
1455
1456 QFileInfo fi(job.filePath);
1457 KisUsageLogger::log(QString("Completed saving %1 (mime: %2). Result: %3. Warning: %4. Size: %5")
1458 .arg(job.filePath, QString::fromLatin1(job.mimeType),
1459 (!status.isOk() ? errorMessage : "OK"), warningMessage,
1460 QString::number(fi.size())));
1461
1463}
bool isSaving() const
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75

References d, errorMessage(), KritaUtils::ExportFileJob::filePath, KisImportExportErrorCode::isOk(), isSaving(), KIS_ASSERT_RECOVER_RETURN, KisUsageLogger::log(), KritaUtils::ExportFileJob::mimeType, KritaUtils::SaveInAutosaveMode, sigCompleteBackgroundSaving(), and warningMessage().

◆ slotCompleteAutoSaving

void KisDocument::slotCompleteAutoSaving ( const KritaUtils::ExportFileJob & job,
KisImportExportErrorCode status,
const QString & errorMessage,
const QString & warningMessage )
privateslot

Definition at line 1617 of file KisDocument.cpp.

1618{
1619 Q_UNUSED(job);
1620 Q_UNUSED(warningMessage);
1621
1622 const QString fileName = QFileInfo(job.filePath).fileName();
1623
1624 if (!status.isOk()) {
1626 Q_EMIT statusBarMessage(i18nc("%1 --- failing file name, %2 --- error message",
1627 "Error during autosaving %1: %2",
1628 fileName,
1629 exportErrorToUserMessage(status, errorMessage)), errorMessageTimeout);
1630 } else {
1631 KisConfig cfg(true);
1632 d->autoSaveDelay = cfg.autoSaveInterval();
1633
1634 if (!d->modifiedWhileSaving) {
1635 d->autoSaveTimer->stop(); // until the next change
1636 d->autoSaveFailureCount = 0;
1637 } else {
1639 }
1640
1641 Q_EMIT statusBarMessage(i18n("Finished autosaving %1", fileName), successMessageTimeout);
1642 }
1643}
QString exportErrorToUserMessage(KisImportExportErrorCode status, const QString &errorMessage)

References KisConfig::autoSaveInterval(), d, errorMessage(), exportErrorToUserMessage(), KritaUtils::ExportFileJob::filePath, KisImportExportErrorCode::isOk(), setEmergencyAutoSaveInterval(), setNormalAutoSaveInterval(), statusBarMessage(), and warningMessage().

◆ slotCompleteSavingDocument

void KisDocument::slotCompleteSavingDocument ( const KritaUtils::ExportFileJob & job,
KisImportExportErrorCode status,
const QString & errorMessage,
const QString & warningMessage )
privateslot

Definition at line 989 of file KisDocument.cpp.

990{
991 if (status.isCancelled())
992 return;
993
994 const QString fileName = QFileInfo(job.filePath).fileName();
995
996 if (!status.isOk()) {
997 Q_EMIT statusBarMessage(i18nc("%1 --- failing file name, %2 --- error message",
998 "Error during saving %1: %2",
999 fileName,
1000 errorMessage), errorMessageTimeout);
1001
1002
1003 if (!fileBatchMode()) {
1004 DlgLoadMessages dlg(i18nc("@title:window", "Krita"),
1005 i18n("Could not save %1.", job.filePath),
1006 errorMessage.split("\n", Qt::SkipEmptyParts)
1007 + warningMessage.split("\n", Qt::SkipEmptyParts),
1008 status.errorMessage());
1009
1010 dlg.exec();
1011 }
1012 }
1013 else {
1014 if (!fileBatchMode() && !warningMessage.isEmpty()) {
1015
1016 QStringList reasons = warningMessage.split("\n", Qt::SkipEmptyParts);
1017
1018 DlgLoadMessages dlg(
1019 i18nc("@title:window", "Krita"),
1020 i18nc("dialog box shown to the user if there were warnings while saving the document, "
1021 "%1 is the file path",
1022 "%1 has been saved but is incomplete.",
1023 job.filePath),
1024 reasons,
1025 reasons.isEmpty()
1026 ? ""
1027 : i18nc("dialog box shown to the user if there were warnings while saving the document",
1028 "Some problems were encountered when saving."));
1029 dlg.exec();
1030 }
1031
1032
1033 if (!(job.flags & KritaUtils::SaveIsExporting)) {
1034 const QString existingAutoSaveBaseName = localFilePath();
1035 const bool wasRecovered = isRecovered();
1036
1037 d->updateDocumentMetadataOnSaving(job.filePath, job.mimeType);
1038
1039 removeAutoSaveFiles(existingAutoSaveBaseName, wasRecovered);
1040 }
1041
1042 Q_EMIT completed();
1043 Q_EMIT sigSavingFinished(job.filePath);
1044
1045 Q_EMIT statusBarMessage(i18n("Finished saving %1", fileName), successMessageTimeout);
1046 }
1047}
void removeAutoSaveFiles(const QString &autosaveBaseName, bool wasRecovered)

References completed(), d, errorMessage(), KisImportExportErrorCode::errorMessage(), fileBatchMode(), KritaUtils::ExportFileJob::filePath, KritaUtils::ExportFileJob::flags, KisImportExportErrorCode::isCancelled(), KisImportExportErrorCode::isOk(), isRecovered, localFilePath(), KritaUtils::ExportFileJob::mimeType, removeAutoSaveFiles(), KritaUtils::SaveIsExporting, sigSavingFinished(), statusBarMessage(), and warningMessage().

◆ slotConfigChanged

void KisDocument::slotConfigChanged ( )
privateslot

Definition at line 2273 of file KisDocument.cpp.

2274{
2275 KisConfig cfg(true);
2276
2277 if (d->undoStack->undoLimit() != cfg.undoStackLimit()) {
2278 if (!d->undoStack->isClean()) {
2279 d->undoStack->clear();
2280 // we set this because the document *has* changed, even though the
2281 // undo history was purged.
2283 }
2284 d->undoStack->setUndoLimit(cfg.undoStackLimit());
2285 }
2286 d->undoStack->setUseCumulativeUndoRedo(cfg.useCumulativeUndoRedo());
2287 d->undoStack->setCumulativeUndoData(cfg.cumulativeUndoData());
2288
2289 d->autoSaveDelay = cfg.autoSaveInterval();
2291}

References KisConfig::autoSaveInterval(), KisConfig::cumulativeUndoData(), d, setImageModifiedWithoutUndo(), setNormalAutoSaveInterval(), KisConfig::undoStackLimit(), and KisConfig::useCumulativeUndoRedo().

◆ slotDocumentCloningCancelled

void KisDocument::slotDocumentCloningCancelled ( )
privateslot

Definition at line 1600 of file KisDocument.cpp.

1601{
1603}

References setEmergencyAutoSaveInterval().

◆ slotImageRootChanged

void KisDocument::slotImageRootChanged ( )
privateslot

Definition at line 2293 of file KisDocument.cpp.

2294{
2295 d->syncDecorationsWrapperLayerState();
2296}

References d.

◆ slotInitiateAsyncAutosaving

void KisDocument::slotInitiateAsyncAutosaving ( KisDocument * clonedDocument)
privateslot

Definition at line 1595 of file KisDocument.cpp.

1596{
1597 slotAutoSaveImpl(std::unique_ptr<KisDocument>(clonedDocument));
1598}

References slotAutoSaveImpl().

◆ slotPerformIdleRoutines

void KisDocument::slotPerformIdleRoutines ( )
privateslot

TODO: automatic purging is disabled for now: it modifies data managers without creating a transaction, which breaks undo.

Definition at line 1605 of file KisDocument.cpp.

1606{
1607 d->image->explicitRegenerateLevelOfDetail();
1608
1609
1613
1614 // d->image->purgeUnusedData(true);
1615}

References d.

◆ slotUndoStackCleanChanged

void KisDocument::slotUndoStackCleanChanged ( bool value)
privateslot

Definition at line 2268 of file KisDocument.cpp.

2269{
2270 setModified(!value || d->imageModifiedWithoutUndo);
2271}

References d, setModified(), and value().

◆ startExportInBackground()

bool KisDocument::startExportInBackground ( const QString & actionName,
const QString & location,
const QString & realLocation,
const QByteArray & mimeType,
bool showWarnings,
KisPropertiesConfigurationSP exportConfiguration,
bool isAdvancedExporting = false )
private

Definition at line 1645 of file KisDocument.cpp.

1651{
1652 d->savingImage = d->image;
1653
1655 if (window) {
1656 if (window->viewManager()) {
1657 d->savingUpdater = window->viewManager()->createThreadedUpdater(actionName);
1658 d->importExportManager->setUpdater(d->savingUpdater);
1659 }
1660 }
1661
1662 KisImportExportErrorCode initializationStatus(ImportExportCodes::OK);
1663 d->childSavingFuture =
1664 d->importExportManager->exportDocumentAsync(location,
1665 realLocation,
1666 mimeType,
1667 initializationStatus,
1668 showWarnings,
1669 exportConfiguration,
1670 isAdvancedExporting);
1671
1672 if (!initializationStatus.isOk()) {
1673 if (d->savingUpdater) {
1674 d->savingUpdater->cancel();
1675 }
1676 d->savingImage.clear();
1677 Q_EMIT sigBackgroundSavingFinished(initializationStatus, initializationStatus.errorMessage(), "");
1678 return false;
1679 }
1680
1681 typedef QFutureWatcher<KisImportExportErrorCode> StatusWatcher;
1682 StatusWatcher *watcher = new StatusWatcher();
1683 watcher->setFuture(d->childSavingFuture);
1684
1685 connect(watcher, SIGNAL(finished()), SLOT(finishExportInBackground()));
1686 connect(watcher, SIGNAL(finished()), watcher, SLOT(deleteLater()));
1687
1688 return true;
1689}
void finishExportInBackground()
QPointer< KoUpdater > createThreadedUpdater(const QString &name)

References connect(), KisViewManager::createThreadedUpdater(), KisPart::currentMainwindow(), d, KisImportExportErrorCode::errorMessage(), finishExportInBackground(), KisPart::instance(), KisImportExportErrorCode::isOk(), mimeType, ImportExportCodes::OK, sigBackgroundSavingFinished(), and KisMainWindow::viewManager.

◆ statusBarMessage

void KisDocument::statusBarMessage ( const QString & text,
int timeout = 0 )
signal

Emitted e.g. at the beginning of a save operation This is emitted by KisDocument and used by KisView to display a statusbar message

◆ syncDecorationsWrapperLayerState()

void KisDocument::syncDecorationsWrapperLayerState ( )

◆ undoStack()

KUndo2Stack * KisDocument::undoStack ( )

Returns the global undo stack

◆ unit()

KoUnit KisDocument::unit ( ) const

Returns the unit used to display all measures/distances.

◆ unitChanged

void KisDocument::unitChanged ( const KoUnit & unit)
signal

This signal is emitted when the unit is changed by setUnit(). It is common to connect views to it, in order to change the displayed units (e.g. in the rulers)

◆ updateDocumentMetadataOnSaving()

void KisDocument::updateDocumentMetadataOnSaving ( const QString & filePath,
const QByteArray & mimeType )

◆ updateEditingTime()

void KisDocument::updateEditingTime ( bool forceStoreElapsed)

Definition at line 2123 of file KisDocument.cpp.

2124{
2125 QDateTime now = QDateTime::currentDateTime();
2126 int firstModDelta = d->firstMod.secsTo(now);
2127 int lastModDelta = d->lastMod.secsTo(now);
2128
2129 if (lastModDelta > 30) {
2130 d->docInfo->setAboutInfo("editing-time", QString::number(d->docInfo->aboutInfo("editing-time").toInt() + d->firstMod.secsTo(d->lastMod)));
2131 d->firstMod = now;
2132 } else if (firstModDelta > 60 || forceStoreElapsed) {
2133 d->docInfo->setAboutInfo("editing-time", QString::number(d->docInfo->aboutInfo("editing-time").toInt() + firstModDelta));
2134 d->firstMod = now;
2135 }
2136
2137 d->lastMod = now;
2138}

References d.

◆ uploadLinkedResourcesFromLayersToStorage()

void KisDocument::uploadLinkedResourcesFromLayersToStorage ( )

◆ waitForSavingToComplete()

void KisDocument::waitForSavingToComplete ( )

Definition at line 2702 of file KisDocument.cpp.

2703{
2704 if (isSaving()) {
2705 KisAsyncActionFeedback f(i18nc("progress dialog message when the user closes the document that is being saved", "Waiting for saving to complete..."), 0);
2706 f.waitForMutex(d->savingMutex);
2707 }
2708}

References d, and isSaving().

◆ warningMessage()

QString KisDocument::warningMessage ( ) const

Return the last warning message set by loading or saving. Warnings mean that the document could not be completely loaded, but the errors were not absolutely fatal.

Definition at line 2207 of file KisDocument.cpp.

2208{
2209 return d->lastWarningMessage;
2210}

References d.

Friends And Related Symbol Documentation

◆ KisPart

friend class KisPart
friend

Definition at line 531 of file KisDocument.h.

◆ SafeSavingLocker

friend class SafeSavingLocker
friend

Definition at line 532 of file KisDocument.h.

Member Data Documentation

◆ assistants

QList< KisPaintingAssistantSP > KisDocument::assistants

Definition at line 391 of file KisDocument.cpp.

◆ audioLevel

qreal KisDocument::audioLevel = 1.0

Definition at line 397 of file KisDocument.cpp.

◆ audioTracks

QVector<QFileInfo> KisDocument::audioTracks

Definition at line 396 of file KisDocument.cpp.

◆ autoSaveActive

bool KisDocument::autoSaveActive = true

Definition at line 375 of file KisDocument.cpp.

◆ autoSaveDelay

int KisDocument::autoSaveDelay = 300

Definition at line 356 of file KisDocument.cpp.

◆ autoSaveFailureCount

int KisDocument::autoSaveFailureCount = 0

Definition at line 360 of file KisDocument.cpp.

◆ autoSaveTimer

QTimer* KisDocument::autoSaveTimer

Definition at line 352 of file KisDocument.cpp.

◆ backgroundSaveDocument

QScopedPointer<KisDocument> KisDocument::backgroundSaveDocument

Definition at line 406 of file KisDocument.cpp.

◆ backgroundSaveJob

KritaUtils::ExportFileJob KisDocument::backgroundSaveJob

Definition at line 409 of file KisDocument.cpp.

◆ batchMode

bool KisDocument::batchMode { false }

Definition at line 414 of file KisDocument.cpp.

414{ false };

◆ childSavingFuture

QFuture<KisImportExportErrorCode> KisDocument::childSavingFuture

Definition at line 408 of file KisDocument.cpp.

◆ colorHistory

QList< KoColor > KisDocument::colorHistory

Definition at line 400 of file KisDocument.cpp.

◆ d

Private* const KisDocument::d
private

Definition at line 743 of file KisDocument.h.

◆ decorationsSyncingDisabled

bool KisDocument::decorationsSyncingDisabled = false

Definition at line 415 of file KisDocument.cpp.

◆ disregardAutosaveFailure

bool KisDocument::disregardAutosaveFailure = false

Definition at line 359 of file KisDocument.cpp.

◆ docInfo

KoDocumentInfo* KisDocument::docInfo = 0

Definition at line 343 of file KisDocument.cpp.

◆ documentIsClosing

bool KisDocument::documentIsClosing = false

Definition at line 417 of file KisDocument.cpp.

◆ embeddedResourcesStorageID

QString KisDocument::embeddedResourcesStorageID

Definition at line 424 of file KisDocument.cpp.

◆ embeddedResourceStorage

KisResourceStorageSP KisDocument::embeddedResourceStorage

Definition at line 425 of file KisDocument.cpp.

◆ firstMod

QDateTime KisDocument::firstMod

Definition at line 377 of file KisDocument.cpp.

◆ globalAssistantsColor

QColor KisDocument::globalAssistantsColor

Definition at line 399 of file KisDocument.cpp.

◆ gridConfig

KisGridConfig KisDocument::gridConfig

Definition at line 402 of file KisDocument.cpp.

◆ guidesConfig

const KisGuidesConfig & KisDocument::guidesConfig

Definition at line 364 of file KisDocument.cpp.

◆ image

KisImageWSP KisDocument::image

Definition at line 382 of file KisDocument.cpp.

◆ imageIdleConnection

QScopedPointer<KisSignalAutoConnection> KisDocument::imageIdleConnection

Definition at line 389 of file KisDocument.cpp.

◆ imageIdleWatcher

KisIdleWatcher KisDocument::imageIdleWatcher

Definition at line 388 of file KisDocument.cpp.

◆ imageModifiedWithoutUndo

bool KisDocument::imageModifiedWithoutUndo = false

Definition at line 404 of file KisDocument.cpp.

◆ importExportManager

KisImportExportManager * KisDocument::importExportManager = 0

Definition at line 347 of file KisDocument.cpp.

◆ isAutosaving

bool KisDocument::isAutosaving = false

Definition at line 358 of file KisDocument.cpp.

◆ isRecovered

bool KisDocument::isRecovered = false

Definition at line 412 of file KisDocument.cpp.

◆ koShapeController

KoShapeController* KisDocument::koShapeController = 0

Definition at line 387 of file KisDocument.cpp.

◆ lastErrorMessage

QString KisDocument::lastErrorMessage

Definition at line 353 of file KisDocument.cpp.

◆ lastMod

QDateTime KisDocument::lastMod

Definition at line 378 of file KisDocument.cpp.

◆ lastWarningMessage

QString KisDocument::lastWarningMessage

Definition at line 354 of file KisDocument.cpp.

◆ linkedResourcesStorageID

QString KisDocument::linkedResourcesStorageID

Definition at line 420 of file KisDocument.cpp.

◆ linkedResourceStorage

KisResourceStorageSP KisDocument::linkedResourceStorage

Definition at line 421 of file KisDocument.cpp.

◆ m_bAutoDetectedMime

bool KisDocument::m_bAutoDetectedMime = false

Definition at line 367 of file KisDocument.cpp.

◆ m_file

QString KisDocument::m_file

Definition at line 369 of file KisDocument.cpp.

◆ m_path

QString KisDocument::m_path

Definition at line 368 of file KisDocument.cpp.

◆ m_storyboardCommentList

QVector<StoryboardComment> KisDocument::m_storyboardCommentList

Definition at line 394 of file KisDocument.cpp.

◆ m_storyboardItemList

StoryboardItemList KisDocument::m_storyboardItemList

Definition at line 393 of file KisDocument.cpp.

◆ mimeType

QByteArray KisDocument::mimeType

Definition at line 349 of file KisDocument.cpp.

◆ mirrorAxisConfig

const KisMirrorAxisConfig & KisDocument::mirrorAxisConfig

Definition at line 365 of file KisDocument.cpp.

◆ modified

bool KisDocument::modified = false

Definition at line 373 of file KisDocument.cpp.

◆ modifiedAfterAutosave

bool KisDocument::modifiedAfterAutosave = false

Definition at line 357 of file KisDocument.cpp.

◆ modifiedWhileSaving

bool KisDocument::modifiedWhileSaving = false

Definition at line 405 of file KisDocument.cpp.

◆ nserver

KisNameServer* KisDocument::nserver

Definition at line 380 of file KisDocument.cpp.

◆ outputMimeType

QByteArray KisDocument::outputMimeType

Definition at line 350 of file KisDocument.cpp.

◆ preActivatedNode

KisNodeSP KisDocument::preActivatedNode

Definition at line 385 of file KisDocument.cpp.

◆ q

KisDocument* KisDocument::q = 0

Definition at line 342 of file KisDocument.cpp.

◆ readwrite

bool KisDocument::readwrite = false

Definition at line 374 of file KisDocument.cpp.

◆ referenceLayerConnections

KisSignalAutoConnectionsStore KisDocument::referenceLayerConnections

Definition at line 410 of file KisDocument.cpp.

◆ savingImage

KisImageSP KisDocument::savingImage

Definition at line 383 of file KisDocument.cpp.

◆ savingMutex

QMutex KisDocument::savingMutex

Definition at line 371 of file KisDocument.cpp.

◆ savingUpdater

QPointer<KoUpdater> KisDocument::savingUpdater

Definition at line 407 of file KisDocument.cpp.

◆ shapeController

KoShapeControllerBase * KisDocument::shapeController = 0

Definition at line 386 of file KisDocument.cpp.

◆ undoStack

KUndo2Stack * KisDocument::undoStack = 0

Definition at line 362 of file KisDocument.cpp.

◆ unit

KoUnit KisDocument::unit

Definition at line 345 of file KisDocument.cpp.

◆ wasStorageAdded

bool KisDocument::wasStorageAdded = false

Definition at line 416 of file KisDocument.cpp.


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