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))
85 int lastSlashIndex = wildcardPath.lastIndexOf(QChar(
'/'));
87 dirPath = wildcardPath.mid(0, lastSlashIndex);
88 fileWildcard = wildcardPath.mid(lastSlashIndex + 1);
93 dirPath = fileInfo.absolutePath();
94 fileWildcard = fileInfo.fileName();
110 QStringList preexistingFileNames = dir.entryList({ fileWildcard });
111 if (!preexistingFileNames.isEmpty() && !
batchMode()) {
114 while (truncatedList.size() > 3) {
115 truncatedList.takeLast();
118 QString exampleFiles = truncatedList.join(
", ");
119 if (truncatedList.size() != preexistingFileNames.size()) {
120 exampleFiles += QString(
", ...");
123 QMessageBox::StandardButton result =
124 QMessageBox::warning(qApp->activeWindow(),
125 i18n(
"Delete old frames?"),
126 i18n(
"Frames with the same naming "
127 "scheme exist in the destination "
128 "directory. They are going to be "
129 "deleted, continue?\n\n"
132 dirPath, exampleFiles),
133 QMessageBox::Yes | QMessageBox::No,
136 if (result == QMessageBox::No) {
142 Q_FOREACH (
const QString &file, preexistingFileNames) {
143 if (!dir.remove(file)) {
145 QMessageBox::critical(qApp->activeWindow(),
146 i18n(
"Failed to delete"),
147 i18n(
"Failed to delete an old frame file:\n\n"
149 "Rendering cancelled.", dir.absoluteFilePath(file)));
152 qWarning() <<
"WARNING: KisAsyncAnimFramesSaveDialog: Failed to delete old frame file(s):" << dir.absoluteFilePath(file);
165 Q_FOREACH (
const QString &file, preexistingFileNames) {
166 if (dir.exists(file)) {
167 (
void)dir.remove(file);
172 return renderingResult;
178 for (
int frame =
m_d->range.start(); frame <=
m_d->range.end(); frame++) {
181 if (!
m_d->onlyNeedsUniqueFrames) {
183 heldFrameTimeRange &=
m_d->range;
188 result.append(heldFrameTimeRange.
start());
193 frame = heldFrameTimeRange.
end();
206 m_d->sequenceNumberingOffset,
207 m_d->onlyNeedsUniqueFrames,
208 m_d->exportConfiguration);
220 return m_d->filenamePrefix +
"%04d" +
m_d->filenameSuffix;
225 return m_d->filenamePrefix +
"????" +
m_d->filenameSuffix;
232 for (
int i =
m_d->range.start(); i <=
m_d->range.end(); i++) {
233 const int num =
m_d->sequenceNumberingOffset + i;
234 QString name = QString(
"%1").arg(num, 4, 10, QChar(
'0'));
235 name =
m_d->filenamePrefix + name +
m_d->filenameSuffix;
236 files.append(QFileInfo(name).fileName());
248 Q_FOREACH (
int frame, frames) {
249 const int num =
m_d->sequenceNumberingOffset + frame;
250 QString name = QString(
"%1").arg(num, 4, 10, QChar(
'0'));
251 name =
m_d->filenamePrefix + name +
m_d->filenameSuffix;
252 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)