]> git.sesse.net Git - kdenlive/blobdiff - src/documentvalidator.cpp
Fix crash on clip deletion, fix issues with placeholder clips
[kdenlive] / src / documentvalidator.cpp
index 614fa1cab5095de4aa21fb4f3d0c8d4eca2733b9..1ebcb6f0556008780f7f3010d770163fb0c51fb8 100644 (file)
@@ -82,8 +82,40 @@ bool DocumentValidator::validate(const double currentVersion)
         if (playlists.count() - 1 < tracksMax ||
                 tracks.count() - 1 < tracksMax ||
                 tracksinfo.count() < tracksMax) {
+            kDebug() << "//// WARNING, PROJECT IS CORRUPTED, MISSING TRACK";
             m_modified = true;
             int difference;
+            // use the MLT tracks as reference
+            if (tracks.count() - 1 < tracksMax) {
+                // Looks like one MLT track is missing, remove the extra Kdenlive track if there is one.
+                if (tracksinfo.count() != tracks.count() - 1) {
+                    // The Kdenlive tracks are not ok, clear and rebuild them
+                    QDomNode tinfo = m_doc.elementsByTagName("tracksinfo").at(0);
+                    QDomNode tnode = tinfo.firstChild();
+                    while (!tnode.isNull()) {
+                        tinfo.removeChild(tnode);
+                        tnode = tinfo.firstChild();
+                    }
+
+                    for (int i = 1; i < tracks.count(); i++) {
+                        QString hide = tracks.at(i).toElement().attribute("hide");
+                        QDomElement newTrack = m_doc.createElement("trackinfo");
+                        if (hide == "video") {
+                            // audio track;
+                            newTrack.setAttribute("type", "audio");
+                            newTrack.setAttribute("blind", 1);
+                            newTrack.setAttribute("mute", 0);
+                            newTrack.setAttribute("lock", 0);
+                        } else {
+                            newTrack.setAttribute("blind", 0);
+                            newTrack.setAttribute("mute", 0);
+                            newTrack.setAttribute("lock", 0);
+                        }
+                        tinfo.appendChild(newTrack);
+                    }
+                }
+            }
+
             if (playlists.count() - 1 < tracksMax) {
                 difference = tracksMax - (playlists.count() - 1);
                 for (int i = 0; i < difference; ++i) {
@@ -134,7 +166,7 @@ bool DocumentValidator::upgrade(double version, const double currentVersion)
     // The document is too new
     if (version > currentVersion) {
         kDebug() << "Unable to open document with version " << version;
-        KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.\nPlease consider upgrading you Kdenlive version.", version), i18n("Unable to open project"));
+        KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.\nPlease consider upgrading your Kdenlive version.", version), i18n("Unable to open project"));
         return false;
     }
 
@@ -144,9 +176,11 @@ bool DocumentValidator::upgrade(double version, const double currentVersion)
         KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.", version), i18n("Unable to open project"));
         return false;
     }
+
     // <kdenlivedoc />
     QDomNode infoXmlNode = m_doc.elementsByTagName("kdenlivedoc").at(0);
     QDomElement infoXml = infoXmlNode.toElement();
+    infoXml.setAttribute("upgraded", "1");
 
     if (version <= 0.6) {
         QDomElement infoXml_old = infoXmlNode.cloneNode(true).toElement(); // Needed for folders
@@ -721,67 +755,65 @@ bool DocumentValidator::upgrade(double version, const double currentVersion)
     }
 
     if (version <= 0.84) {
-            // update the title clips to use the new MLT kdenlivetitle producer
-            QDomNodeList kproducerNodes = m_doc.elementsByTagName("kdenlive_producer");
-            for (int i = 0; i < kproducerNodes.count(); ++i) {
-                QDomElement kproducer = kproducerNodes.at(i).toElement();
-                if (kproducer.attribute("type").toInt() == TEXT) {
-                    QString data = kproducer.attribute("xmldata");
-                    QString datafile = kproducer.attribute("resource");
-                    if (!datafile.endsWith(".kdenlivetitle")) {
-                        datafile = QString();
-                        kproducer.setAttribute("resource", QString());
-                    }
-                    QString id = kproducer.attribute("id");
-                    QDomNodeList mltproducers = m_doc.elementsByTagName("producer");
-                    bool foundData = false;
-                    bool foundResource = false;
-                    bool foundService = false;
-                    for (int j = 0; j < mltproducers.count(); j++) {
-                        QDomElement wproducer = mltproducers.at(j).toElement();
-                        if (wproducer.attribute("id") == id) {
-                            QDomNodeList props = wproducer.childNodes();
-                            for (int k = 0; k < props.count(); k++) {
-                                if (props.at(k).toElement().attribute("name") == "xmldata") {
-                                    props.at(k).firstChild().setNodeValue(data);
-                                    foundData = true;
-                                }
-                                else if (props.at(k).toElement().attribute("name") == "mlt_service") {
-                                    props.at(k).firstChild().setNodeValue("kdenlivetitle");
-                                    foundService = true;
-                                }
-                                else if (props.at(k).toElement().attribute("name") == "resource") {
-                                    props.at(k).firstChild().setNodeValue(datafile);
-                                    foundResource = true;
-                                }
-                            }
-                            if (!foundData) {
-                                QDomElement e = m_doc.createElement("property");
-                                e.setAttribute("name", "xmldata");
-                                QDomText value = m_doc.createTextNode(data);
-                                e.appendChild(value);
-                                wproducer.appendChild(e);
-                            }
-                            if (!foundService) {
-                                QDomElement e = m_doc.createElement("property");
-                                e.setAttribute("name", "mlt_service");
-                                QDomText value = m_doc.createTextNode("kdenlivetitle");
-                                e.appendChild(value);
-                                wproducer.appendChild(e);
-                            }                            
-                            if (!foundResource) {
-                                QDomElement e = m_doc.createElement("property");
-                                e.setAttribute("name", "resource");
-                                QDomText value = m_doc.createTextNode(datafile);
-                                e.appendChild(value);
-                                wproducer.appendChild(e);
+        // update the title clips to use the new MLT kdenlivetitle producer
+        QDomNodeList kproducerNodes = m_doc.elementsByTagName("kdenlive_producer");
+        for (int i = 0; i < kproducerNodes.count(); ++i) {
+            QDomElement kproducer = kproducerNodes.at(i).toElement();
+            if (kproducer.attribute("type").toInt() == TEXT) {
+                QString data = kproducer.attribute("xmldata");
+                QString datafile = kproducer.attribute("resource");
+                if (!datafile.endsWith(".kdenlivetitle")) {
+                    datafile = QString();
+                    kproducer.setAttribute("resource", QString());
+                }
+                QString id = kproducer.attribute("id");
+                QDomNodeList mltproducers = m_doc.elementsByTagName("producer");
+                bool foundData = false;
+                bool foundResource = false;
+                bool foundService = false;
+                for (int j = 0; j < mltproducers.count(); j++) {
+                    QDomElement wproducer = mltproducers.at(j).toElement();
+                    if (wproducer.attribute("id") == id) {
+                        QDomNodeList props = wproducer.childNodes();
+                        for (int k = 0; k < props.count(); k++) {
+                            if (props.at(k).toElement().attribute("name") == "xmldata") {
+                                props.at(k).firstChild().setNodeValue(data);
+                                foundData = true;
+                            } else if (props.at(k).toElement().attribute("name") == "mlt_service") {
+                                props.at(k).firstChild().setNodeValue("kdenlivetitle");
+                                foundService = true;
+                            } else if (props.at(k).toElement().attribute("name") == "resource") {
+                                props.at(k).firstChild().setNodeValue(datafile);
+                                foundResource = true;
                             }
-                            break;
                         }
+                        if (!foundData) {
+                            QDomElement e = m_doc.createElement("property");
+                            e.setAttribute("name", "xmldata");
+                            QDomText value = m_doc.createTextNode(data);
+                            e.appendChild(value);
+                            wproducer.appendChild(e);
+                        }
+                        if (!foundService) {
+                            QDomElement e = m_doc.createElement("property");
+                            e.setAttribute("name", "mlt_service");
+                            QDomText value = m_doc.createTextNode("kdenlivetitle");
+                            e.appendChild(value);
+                            wproducer.appendChild(e);
+                        }
+                        if (!foundResource) {
+                            QDomElement e = m_doc.createElement("property");
+                            e.setAttribute("name", "resource");
+                            QDomText value = m_doc.createTextNode(datafile);
+                            e.appendChild(value);
+                            wproducer.appendChild(e);
+                        }
+                        break;
                     }
                 }
             }
         }
+    }
 
 
     // The document has been converted: mark it as modified