From a9284e6be36283932764a23efd8e5df6cc9f99c8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Wed, 27 Feb 2013 20:51:10 +0100 Subject: [PATCH] * Set document as modified when changing project metadata: http://kdenlive.org/mantis/view.php?id=2996 * Automatic recovery of corrupted files produced by Kdenlive 0.9.4 --- src/kdenlivedoc.cpp | 48 +++++++++++++++++++++++++++++++++++------ src/mainwindow.cpp | 2 +- src/projectsettings.cpp | 2 +- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index c1804867..31ee5dfb 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include @@ -147,17 +148,48 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup int col; QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars); success = m_document.setContent(&file, false, &errorMsg, &line, &col); - file.close(); - KIO::NetAccess::removeTempFile(tmpFile); + file.close(); if (!success) { // It is corrupted - if (KMessageBox::warningContinueCancel(parent, i18n("Cannot open the project file, error is:\n%1 (line %2, col %3)\nDo you want to open a backup file?", errorMsg, line, col), i18n("Error opening file"), KGuiItem(i18n("Open Backup"))) == KMessageBox::Continue) { - *openBackup = true; - } - //KMessageBox::error(parent, errorMsg); + int answer = KMessageBox::warningYesNoCancel (parent, i18n("Cannot open the project file, error is:\n%1 (line %2, col %3)\nDo you want to open a backup file?", errorMsg, line, col), i18n("Error opening file"), KGuiItem(i18n("Open Backup")), KGuiItem(i18n("Recover"))); + if (answer == KMessageBox::Yes) { + *openBackup = true; + } + else if (answer == KMessageBox::No) { + // Try to recover broken file produced by Kdenlive 0.9.4 + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + int correction = 0; + QString playlist = file.readAll(); + while (!success && correction < 2) { + int errorPos = 0; + line--; + col = col - 2; + for (int j = 0; j < line && errorPos < playlist.length(); j++) { + errorPos = playlist.indexOf("\n", errorPos); + errorPos++; + } + errorPos += col; + if (errorPos >= playlist.length()) break; + playlist.remove(errorPos, 1); + line = 0; + col = 0; + success = m_document.setContent(playlist, false, &errorMsg, &line, &col); + correction++; + } + if (!success) { + KMessageBox::sorry(parent, i18n("Cannot recover this project file")); + } + else { + // Document was modified, ask for backup + QDomElement mlt = m_document.documentElement(); + QDomElement info = mlt.firstChildElement("kdenlivedoc"); + if (!info.isNull()) info.setAttribute("modified", 1); + } + } + } } - else { + if (success) { parent->slotGotProgressInfo(i18n("Validating"), 0); qApp->processEvents(); DocumentValidator validator(m_document, url); @@ -311,6 +343,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup } } } + KIO::NetAccess::removeTempFile(tmpFile); } } @@ -1820,6 +1853,7 @@ const QMap KdenliveDoc::metadata() const void KdenliveDoc::setMetadata(const QMap meta) { + setModified(true); m_documentMetadata = meta; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a48d8fb7..517f31c2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2408,7 +2408,7 @@ void MainWindow::slotEditProjectSettings() m_activeDocument->setModified(); slotUpdateProxySettings(); } - m_activeDocument->setMetadata(w->metadata()); + if (w->metadata() != m_activeDocument->metadata()) m_activeDocument->setMetadata(w->metadata()); } delete w; } diff --git a/src/projectsettings.cpp b/src/projectsettings.cpp index 27977425..8a5dec04 100644 --- a/src/projectsettings.cpp +++ b/src/projectsettings.cpp @@ -615,7 +615,7 @@ const QMap ProjectSettings::metadata() const QString key = item->data(0, Qt::UserRole).toString(); if (key.isEmpty()) key = "meta.attr." + item->text(0).simplified() + ".markup"; QString value = item->text(1); - if (!key.contains(' ')) metadata.insert(key, value); + metadata.insert(key, value); } } return metadata; -- 2.39.5