]> git.sesse.net Git - kdenlive/blobdiff - src/kdenlivedoc.cpp
Try to fix font GUI issue: http://www.kdenlive.org/mantis/view.php?id=3049
[kdenlive] / src / kdenlivedoc.cpp
index e74fbfaf1883a0c1bf835a6972c598889b4a844e..cc327d44b1db1f43a084119b42043bfda0320c56 100644 (file)
@@ -143,19 +143,52 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
         else {
             QFile file(tmpFile);
             QString errorMsg;
+           int line;
+           int col;
             QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars);
-            success = m_document.setContent(&file, false, &errorMsg);
-            file.close();
-            KIO::NetAccess::removeTempFile(tmpFile);
+            success = m_document.setContent(&file, false, &errorMsg, &line, &col);
+           file.close();
 
             if (!success) {
                 // It is corrupted
-                if (KMessageBox::warningContinueCancel(parent, i18n("Cannot open the project file, error is:\n%1\nDo you want to open a backup file?", errorMsg), 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);
@@ -309,6 +342,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                     }
                 }
             }
+            KIO::NetAccess::removeTempFile(tmpFile);
         }
     }
     
@@ -1192,9 +1226,9 @@ bool KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId
         QDomNamedNodeMap attributes = elem.attributes();
         for (int i = 0; i < attributes.count(); i++) {
             QString attrname = attributes.item(i).nodeName();
-            if (attrname != "resource")
+           if (attrname != "resource")
                 properties.insert(attrname, attributes.item(i).nodeValue());
-            kDebug() << attrname << " = " << attributes.item(i).nodeValue();
+            //kDebug() << attrname << " = " << attributes.item(i).nodeValue();
         }
         clip->setProperties(properties);
         emit addProjectClip(clip, false);
@@ -1203,8 +1237,10 @@ bool KdenliveDoc::addClipInfo(QDomElement elem, QDomElement orig, QString clipId
         QMap<QString, QString> meta;
         for (QDomNode m = orig.firstChild(); !m.isNull(); m = m.nextSibling()) {
             QString name = m.toElement().attribute("name");
-            if (name.startsWith("meta.attr"))
-                meta.insert(name.section('.', 2, 3), m.firstChild().nodeValue());
+            if (name.startsWith("meta.attr")) {
+               if (name.endsWith(".markup")) name = name.section('.', 0, -2);
+                meta.insert(name.section('.', 2, -1), m.firstChild().nodeValue());
+           }
         }
         if (!meta.isEmpty()) {
             if (clip == NULL)
@@ -1816,6 +1852,7 @@ const QMap <QString, QString> KdenliveDoc::metadata() const
 
 void KdenliveDoc::setMetadata(const QMap <QString, QString> meta)
 {
+    setModified(true);
     m_documentMetadata = meta;
 }