]> git.sesse.net Git - kdenlive/commitdiff
* Set document as modified when changing project metadata: http://kdenlive.org/mantis...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 27 Feb 2013 19:51:10 +0000 (20:51 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 27 Feb 2013 19:51:10 +0000 (20:51 +0100)
* Automatic recovery of corrupted files produced by Kdenlive 0.9.4

src/kdenlivedoc.cpp
src/mainwindow.cpp
src/projectsettings.cpp

index c1804867a187e675a136e5b5a78466f39bb1805c..31ee5dfb05ad178529258e0ef3c9c249f54c77c6 100644 (file)
@@ -50,6 +50,7 @@
 #include <QFile>
 #include <QInputDialog>
 #include <QDomImplementation>
+#include <QTextBoundaryFinder>
 
 #include <mlt++/Mlt.h>
 
@@ -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 <QString, QString> KdenliveDoc::metadata() const
 
 void KdenliveDoc::setMetadata(const QMap <QString, QString> meta)
 {
+    setModified(true);
     m_documentMetadata = meta;
 }
 
index a48d8fb730deb8414d96344639fafe4261884cae..517f31c2102d37dd8601ff5cc0142458216ecaac 100644 (file)
@@ -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;
 }
index 27977425ecce1f44d500268c304c6bf94207a3d4..8a5dec0458e2f53a82a024d397d81851cfacc3d9 100644 (file)
@@ -615,7 +615,7 @@ const QMap <QString, QString> 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;