20#include <QApplication>
25 const QString &baseFilename,
26 int _sequenceNumberingOffset,
27 bool _onlyNeedsUniqueFrames,
35 int baseLength = baseFilename.lastIndexOf(
".");
36 if (baseLength > -1) {
38 filenameSuffix = baseFilename.right(baseFilename.length() - baseLength);
60 const QString &baseFilename,
62 bool onlyNeedsUniqueFrames,
65 m_d(new
Private(originalImage, range, baseFilename, qMax(startNumberingAt - range.start(), range.start() * -1), onlyNeedsUniqueFrames, exportConfiguration))
78 QDir dir(fileInfo.absolutePath());
81 dir.mkpath(fileInfo.absolutePath());
86 QStringList preexistingFileNames = dir.entryList({ fileInfo.fileName() });
87 if (!preexistingFileNames.isEmpty() && !
batchMode()) {
90 while (truncatedList.size() > 3) {
91 truncatedList.takeLast();
94 QString exampleFiles = truncatedList.join(
", ");
95 if (truncatedList.size() != preexistingFileNames.size()) {
96 exampleFiles += QString(
", ...");
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"
108 fileInfo.absolutePath(), exampleFiles),
109 QMessageBox::Yes | QMessageBox::No,
112 if (result == QMessageBox::No) {
118 Q_FOREACH (
const QString &file, preexistingFileNames) {
119 if (!dir.remove(file)) {
121 QMessageBox::critical(qApp->activeWindow(),
122 i18n(
"Failed to delete"),
123 i18n(
"Failed to delete an old frame file:\n\n"
125 "Rendering cancelled.", dir.absoluteFilePath(file)));
128 qWarning() <<
"WARNING: KisAsyncAnimFramesSaveDialog: Failed to delete old frame file(s):" << dir.absoluteFilePath(file);
141 Q_FOREACH (
const QString &file, preexistingFileNames) {
142 if (dir.exists(file)) {
143 (
void)dir.remove(file);
148 return renderingResult;
154 for (
int frame =
m_d->range.start(); frame <=
m_d->range.end(); frame++) {
157 if (!
m_d->onlyNeedsUniqueFrames) {
159 heldFrameTimeRange &=
m_d->range;
164 result.append(heldFrameTimeRange.
start());
169 frame = heldFrameTimeRange.
end();
182 m_d->sequenceNumberingOffset,
183 m_d->onlyNeedsUniqueFrames,
184 m_d->exportConfiguration);
196 return m_d->filenamePrefix +
"%04d" +
m_d->filenameSuffix;
201 return m_d->filenamePrefix +
"????" +
m_d->filenameSuffix;
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());
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());
QList< int > calcDirtyFrames() const override
returns a list of frames that should be regenerated by the dialog
const QScopedPointer< Private > m_d
QString savedFilesMaskWildcard() const
KisAsyncAnimationRendererBase * createRenderer(KisImageSP image) override
create a renderer object linked to image
~KisAsyncAnimationFramesSaveDialog()
QStringList savedFiles() const
void initializeRendererForFrame(KisAsyncAnimationRendererBase *renderer, KisImageSP image, int frame) override
QString savedFilesMask() const
Result regenerateRange(KisViewManager *viewManager) override
start generation of frames and (if not in batch mode) show the dialog
QStringList savedUniqueFiles() const
KisAsyncAnimationFramesSaveDialog(KisImageSP image, const KisTimeSpan &range, const QString &baseFilename, int startNumberingAt, bool onlyNeedsUniqueFrames, KisPropertiesConfigurationSP exportConfiguration)
QList< int > getUniqueFrames() const
KisAsyncAnimationRenderDialogBase is a special class for rendering multiple frames of the image and p...
virtual Result regenerateRange(KisViewManager *viewManager)
start generation of frames and (if not in batch mode) show the dialog
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
static KisTimeSpan calculateIdenticalFramesRecursive(const KisNode *node, int time)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
int sequenceNumberingOffset
QByteArray outputMimeType
KisPropertiesConfigurationSP exportConfiguration
bool onlyNeedsUniqueFrames
Private(KisImageSP _image, const KisTimeSpan &_range, const QString &baseFilename, int _sequenceNumberingOffset, bool _onlyNeedsUniqueFrames, KisPropertiesConfigurationSP _exportConfiguration)