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

#include <KisAsyncAnimationFramesSaveDialog.h>

+ Inheritance diagram for KisAsyncAnimationFramesSaveDialog:

Classes

struct  Private
 

Public Member Functions

QList< int > getUniqueFrames () const
 
 KisAsyncAnimationFramesSaveDialog (KisImageSP image, const KisTimeSpan &range, const QString &baseFilename, int startNumberingAt, bool onlyNeedsUniqueFrames, KisPropertiesConfigurationSP exportConfiguration)
 
Result regenerateRange (KisViewManager *viewManager) override
 start generation of frames and (if not in batch mode) show the dialog
 
QStringList savedFiles () const
 
QString savedFilesMask () const
 
QString savedFilesMaskWildcard () const
 
QStringList savedUniqueFiles () const
 
 ~KisAsyncAnimationFramesSaveDialog ()
 
- Public Member Functions inherited from KisAsyncAnimationRenderDialogBase
bool batchMode () const
 
 KisAsyncAnimationRenderDialogBase (const QString &actionTitle, KisImageSP image, int busyWait=200)
 construct and initialize the dialog
 
KisRegion regionOfInterest () const
 
void setBatchMode (bool value)
 setting batch mode to true will prevent any dialogs or message boxes from showing on screen. Please take it into account that using batch mode prevents some potentially dangerous recovery execution paths (e.g. delete the existing frames in the destination folder). In such case the rendering will be stopped with RenderFailed result.
 
void setRegionOfInterest (const KisRegion &roi)
 
virtual ~KisAsyncAnimationRenderDialogBase ()
 

Protected Member Functions

QList< int > calcDirtyFrames () const override
 returns a list of frames that should be regenerated by the dialog
 
KisAsyncAnimationRendererBasecreateRenderer (KisImageSP image) override
 create a renderer object linked to image
 
void initializeRendererForFrame (KisAsyncAnimationRendererBase *renderer, KisImageSP image, int frame) override
 

Private Attributes

const QScopedPointer< Privatem_d
 

Additional Inherited Members

- Public Types inherited from KisAsyncAnimationRenderDialogBase
enum  Result { RenderComplete , RenderCancelled , RenderFailed , RenderTimedOut }
 

Detailed Description

Definition at line 14 of file KisAsyncAnimationFramesSaveDialog.h.

Constructor & Destructor Documentation

◆ KisAsyncAnimationFramesSaveDialog()

KisAsyncAnimationFramesSaveDialog::KisAsyncAnimationFramesSaveDialog ( KisImageSP image,
const KisTimeSpan & range,
const QString & baseFilename,
int startNumberingAt,
bool onlyNeedsUniqueFrames,
KisPropertiesConfigurationSP exportConfiguration )

Definition at line 58 of file KisAsyncAnimationFramesSaveDialog.cpp.

64 : KisAsyncAnimationRenderDialogBase(i18n("Saving frames..."), originalImage, 0),
65 m_d(new Private(originalImage, range, baseFilename, qMax(startNumberingAt - range.start(), range.start() * -1), onlyNeedsUniqueFrames, exportConfiguration))
66{
67
68
69}
KisAsyncAnimationRenderDialogBase(const QString &actionTitle, KisImageSP image, int busyWait=200)
construct and initialize the dialog
int start() const

◆ ~KisAsyncAnimationFramesSaveDialog()

KisAsyncAnimationFramesSaveDialog::~KisAsyncAnimationFramesSaveDialog ( )

Definition at line 71 of file KisAsyncAnimationFramesSaveDialog.cpp.

72{
73}

Member Function Documentation

◆ calcDirtyFrames()

QList< int > KisAsyncAnimationFramesSaveDialog::calcDirtyFrames ( ) const
overrideprotectedvirtual

returns a list of frames that should be regenerated by the dialog

Called by the dialog in the very beginning of regenerateRange()

Implements KisAsyncAnimationRenderDialogBase.

Definition at line 151 of file KisAsyncAnimationFramesSaveDialog.cpp.

152{
153 QList<int> result;
154 for (int frame = m_d->range.start(); frame <= m_d->range.end(); frame++) {
155 KisTimeSpan heldFrameTimeRange = KisTimeSpan::calculateIdenticalFramesRecursive(m_d->originalImage->root(), frame);
156
157 if (!m_d->onlyNeedsUniqueFrames) {
158 // Clamp holds that begin before the rendered range onto it
159 heldFrameTimeRange &= m_d->range;
160 }
161
162 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(heldFrameTimeRange.isValid(), result);
163
164 result.append(heldFrameTimeRange.start());
165
166 if (heldFrameTimeRange.isInfinite()) {
167 break;
168 } else {
169 frame = heldFrameTimeRange.end();
170 }
171 }
172 return result;
173}
bool isInfinite() const
static KisTimeSpan calculateIdenticalFramesRecursive(const KisNode *node, int time)
int end() const
bool isValid() const
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129

References KisTimeSpan::calculateIdenticalFramesRecursive(), KisTimeSpan::end(), KisTimeSpan::isInfinite(), KisTimeSpan::isValid(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, m_d, and KisTimeSpan::start().

◆ createRenderer()

KisAsyncAnimationRendererBase * KisAsyncAnimationFramesSaveDialog::createRenderer ( KisImageSP image)
overrideprotectedvirtual

create a renderer object linked to image

Renderer are special objects that connect to the individual image signals, react on them and fetch the final frames data

See also
KisAsyncAnimationRendererBase

Implements KisAsyncAnimationRenderDialogBase.

Definition at line 175 of file KisAsyncAnimationFramesSaveDialog.cpp.

176{
178 m_d->filenamePrefix,
179 m_d->filenameSuffix,
180 m_d->outputMimeType,
181 m_d->range,
182 m_d->sequenceNumberingOffset,
183 m_d->onlyNeedsUniqueFrames,
184 m_d->exportConfiguration);
185}

References m_d.

◆ getUniqueFrames()

QList< int > KisAsyncAnimationFramesSaveDialog::getUniqueFrames ( ) const

Definition at line 234 of file KisAsyncAnimationFramesSaveDialog.cpp.

235{
236 return this->calcDirtyFrames();
237}
QList< int > calcDirtyFrames() const override
returns a list of frames that should be regenerated by the dialog

References calcDirtyFrames().

◆ initializeRendererForFrame()

void KisAsyncAnimationFramesSaveDialog::initializeRendererForFrame ( KisAsyncAnimationRendererBase * renderer,
KisImageSP image,
int frame )
overrideprotectedvirtual

Implements KisAsyncAnimationRenderDialogBase.

Definition at line 187 of file KisAsyncAnimationFramesSaveDialog.cpp.

188{
189 Q_UNUSED(renderer);
190 Q_UNUSED(image);
191 Q_UNUSED(frame);
192}

◆ regenerateRange()

KisAsyncAnimationRenderDialogBase::Result KisAsyncAnimationFramesSaveDialog::regenerateRange ( KisViewManager * viewManager)
overridevirtual

start generation of frames and (if not in batch mode) show the dialog

The link to view manager is used to barrier lock with visual feedback in the end of the operation

Since this method can be called from the places where no view manager is available, we need this manually crafted ugly construction to "try-lock-cancel" the image.

Reimplemented from KisAsyncAnimationRenderDialogBase.

Definition at line 75 of file KisAsyncAnimationFramesSaveDialog.cpp.

76{
77 QFileInfo fileInfo(savedFilesMaskWildcard());
78 QDir dir(fileInfo.absolutePath());
79
80 if (!dir.exists()) {
81 dir.mkpath(fileInfo.absolutePath());
82 }
83 KIS_SAFE_ASSERT_RECOVER_NOOP(dir.exists());
84
85 // Check for overwrite. (Batch mode always overwrites.)
86 QStringList preexistingFileNames = dir.entryList({ fileInfo.fileName() });
87 if (!preexistingFileNames.isEmpty() && !batchMode()) {
88 QStringList truncatedList = preexistingFileNames;
89
90 while (truncatedList.size() > 3) {
91 truncatedList.takeLast();
92 }
93
94 QString exampleFiles = truncatedList.join(", ");
95 if (truncatedList.size() != preexistingFileNames.size()) {
96 exampleFiles += QString(", ...");
97 }
98
99 QMessageBox::StandardButton result =
100 QMessageBox::warning(qApp->activeWindow(),
101 i18n("Delete old frames?"),
102 i18n("Frames with the same naming "
103 "scheme exist in the destination "
104 "directory. They are going to be "
105 "deleted, continue?\n\n"
106 "Directory: %1\n"
107 "Files: %2",
108 fileInfo.absolutePath(), exampleFiles),
109 QMessageBox::Yes | QMessageBox::No,
110 QMessageBox::No);
111
112 if (result == QMessageBox::No) {
113 return RenderCancelled;
114 }
115 }
116
117 // Remove any preexisting files.
118 Q_FOREACH (const QString &file, preexistingFileNames) {
119 if (!dir.remove(file)) {
120 if (!batchMode()) {
121 QMessageBox::critical(qApp->activeWindow(),
122 i18n("Failed to delete"),
123 i18n("Failed to delete an old frame file:\n\n"
124 "%1\n\n"
125 "Rendering cancelled.", dir.absoluteFilePath(file)));
126 }
127
128 qWarning() << "WARNING: KisAsyncAnimFramesSaveDialog: Failed to delete old frame file(s):" << dir.absoluteFilePath(file);
129 return RenderFailed;
130 }
131 }
132
133 // Save new frame files.
135
136 // If we cancel rendering or fail rendering process,
137 // lets clean up any files that may have been created
138 // to keep the next render from having artifacts.
139 preexistingFileNames = savedFiles();
140 if (renderingResult != RenderComplete) {
141 Q_FOREACH (const QString &file, preexistingFileNames) {
142 if (dir.exists(file)) {
143 (void)dir.remove(file);
144 }
145 }
146 }
147
148 return renderingResult;
149}
virtual Result regenerateRange(KisViewManager *viewManager)
start generation of frames and (if not in batch mode) show the dialog
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)

References KisAsyncAnimationRenderDialogBase::batchMode(), KIS_SAFE_ASSERT_RECOVER_NOOP, KisAsyncAnimationRenderDialogBase::regenerateRange(), KisAsyncAnimationRenderDialogBase::RenderCancelled, KisAsyncAnimationRenderDialogBase::RenderComplete, KisAsyncAnimationRenderDialogBase::RenderFailed, savedFiles(), savedFilesMaskWildcard(), and void().

◆ savedFiles()

QStringList KisAsyncAnimationFramesSaveDialog::savedFiles ( ) const

Definition at line 204 of file KisAsyncAnimationFramesSaveDialog.cpp.

205{
206 QStringList files;
207
208 for (int i = m_d->range.start(); i <= m_d->range.end(); i++) {
209 const int num = m_d->sequenceNumberingOffset + i;
210 QString name = QString("%1").arg(num, 4, 10, QChar('0'));
211 name = m_d->filenamePrefix + name + m_d->filenameSuffix;
212 files.append(QFileInfo(name).fileName());
213 }
214
215 return files;
216}
const char * name(StandardAction id)

References m_d.

◆ savedFilesMask()

QString KisAsyncAnimationFramesSaveDialog::savedFilesMask ( ) const

Definition at line 194 of file KisAsyncAnimationFramesSaveDialog.cpp.

195{
196 return m_d->filenamePrefix + "%04d" + m_d->filenameSuffix;
197}

References m_d.

◆ savedFilesMaskWildcard()

QString KisAsyncAnimationFramesSaveDialog::savedFilesMaskWildcard ( ) const

Definition at line 199 of file KisAsyncAnimationFramesSaveDialog.cpp.

200{
201 return m_d->filenamePrefix + "????" + m_d->filenameSuffix;
202}

References m_d.

◆ savedUniqueFiles()

QStringList KisAsyncAnimationFramesSaveDialog::savedUniqueFiles ( ) const

Definition at line 218 of file KisAsyncAnimationFramesSaveDialog.cpp.

219{
220 QStringList files;
221
222 const QList<int> frames = calcDirtyFrames();
223
224 Q_FOREACH (int frame, frames) {
225 const int num = m_d->sequenceNumberingOffset + frame;
226 QString name = QString("%1").arg(num, 4, 10, QChar('0'));
227 name = m_d->filenamePrefix + name + m_d->filenameSuffix;
228 files.append(QFileInfo(name).fileName());
229 }
230
231 return files;
232}

References calcDirtyFrames(), and m_d.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisAsyncAnimationFramesSaveDialog::m_d
private

Definition at line 43 of file KisAsyncAnimationFramesSaveDialog.h.


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