]> git.sesse.net Git - kdenlive/commitdiff
Fix crash when loading document with invalid transition, based on patch from Mariusz...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 12 Oct 2009 23:06:42 +0000 (23:06 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 12 Oct 2009 23:06:42 +0000 (23:06 +0000)
svn path=/trunk/kdenlive/; revision=4033

src/effectslist.cpp
src/effectslist.h
src/trackview.cpp

index a509cfb5a1156679f2d0af8e7bd42ed17cc87811..490f2f39b82ad7ad424fa2f997bdc49dbed645a9 100644 (file)
@@ -188,6 +188,32 @@ QString EffectsList::parameter(QDomElement effect, const QString &name)
     return QString();
 }
 
+// static
+void EffectsList::setProperty(QDomElement effect, const QString &name, const QString &value)
+{
+    QDomNodeList params = effect.elementsByTagName("property");
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        if (e.attribute("name") == name) {
+            e.firstChild().setNodeValue(value);
+            break;
+        }
+    }
+}
+
+// static
+QString EffectsList::property(QDomElement effect, const QString &name)
+{
+    QDomNodeList params = effect.elementsByTagName("property");
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        if (e.attribute("name") == name) {
+            return e.firstChild().nodeValue();
+        }
+    }
+    return QString();
+}
+
 void EffectsList::append(QDomElement e)
 {
     m_baseElement.appendChild(importNode(e, true));
index 6c57f12c9baf0df4d37b7cea821bc6d109af0519..a9de689c8b2ccc4af106b924a81ec84f9d903d18 100644 (file)
@@ -53,6 +53,8 @@ public:
     static bool hasKeyFrames(QDomElement effect);
     static void setParameter(QDomElement effect, const QString &name, const QString &value);
     static QString parameter(QDomElement effect, const QString &name);
+    static void setProperty(QDomElement effect, const QString &name, const QString &value);
+    static QString property(QDomElement effect, const QString &name);
     void clearList();
 
 private:
index 569a356b2faa973674dd01f63379535860924933..cb997d90d60895327f7f9714440fbbdeea0283ae 100644 (file)
@@ -271,8 +271,24 @@ void TrackView::parseDocument(QDomDocument doc)
                     transitionAdd = false;
                     //kDebug() << "//  TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)";
                     //break;
-                } else if (paramName == "a_track") a_track = p.text().toInt();
-                else if (paramName == "b_track") b_track = p.text().toInt();
+                } else if (paramName == "a_track") {
+                   a_track = qMax(0, p.text().toInt());
+                   a_track = qMin(m_projectTracks - 1, a_track);
+                   if (a_track != p.text().toInt()) {
+                       // the transition track was out of bounds
+                       m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), a_track) + '\n');
+                       EffectsList::setProperty(e, "a_track", QString::number(a_track));
+                   }
+               }
+                else if (paramName == "b_track") {
+                   b_track = qMax(0, p.text().toInt());
+                   b_track = qMin(m_projectTracks - 1, b_track);
+                   if (b_track != p.text().toInt()) {
+                       // the transition track was out of bounds
+                       m_documentErrors.append(i18n("Transition %1 had an invalid track: %2 > %3", e.attribute("id"), p.text().toInt(), b_track) + '\n');
+                       EffectsList::setProperty(e, "b_track", QString::number(b_track));
+                   }
+               }
                 else if (paramName == "mlt_service") mlt_service = p.text();
                 else if (paramName == "kdenlive_id") transitionId = p.text();
                 else if (paramName == "geometry") mlt_geometry = p.text();