Commits

Jean-Baptiste Mardelle  committed b4633f1

* 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

  • Participants
  • Parent commits fe5586e

Comments (0)

Files changed (3)

File src/kdenlivedoc.cpp

 #include <QFile>
 #include <QInputDialog>
 #include <QDomImplementation>
+#include <QTextBoundaryFinder>
 
 #include <mlt++/Mlt.h>
 
 	    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);
                     }
                 }
             }
+            KIO::NetAccess::removeTempFile(tmpFile);
         }
     }
     
 
 void KdenliveDoc::setMetadata(const QMap <QString, QString> meta)
 {
+    setModified(true);
     m_documentMetadata = meta;
 }
 

File src/mainwindow.cpp

             m_activeDocument->setModified();
             slotUpdateProxySettings();
         }
-        m_activeDocument->setMetadata(w->metadata());
+        if (w->metadata() != m_activeDocument->metadata()) m_activeDocument->setMetadata(w->metadata());
     }
     delete w;
 }

File src/projectsettings.cpp

             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;