]> git.sesse.net Git - kdenlive/commitdiff
Cleaner detection of overlapping transitions
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 11 Jun 2011 12:57:11 +0000 (12:57 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 11 Jun 2011 12:57:11 +0000 (12:57 +0000)
svn path=/trunk/kdenlive/; revision=5699

src/customtrackview.h
src/documentvalidator.cpp
src/trackview.cpp

index 0c47b3efd25789c41fbe8d5bbf9d83e7b06d8f33..f862dee7f58aec501fd6b028e68c4605961d8e29 100644 (file)
@@ -156,6 +156,8 @@ public:
     int selectedTrack() const;
     QStringList selectedClips() const;
     QList<ClipItem *> selectedClipItems() const;
+    /** @brief Checks wheter an item can be inserted (make sure it does not overlap another item) */
+    bool canBePastedTo(ItemInfo info, int type) const;
 
     /** @brief Selects a clip.
     * @param add Whether to select or deselect
@@ -360,7 +362,6 @@ private:
     int getPreviousVideoTrack(int track);
     void updatePositionEffects(ClipItem * item, ItemInfo info, bool standalone = true);
     bool insertDropClips(const QMimeData *data, const QPoint pos);
-    bool canBePastedTo(ItemInfo info, int type) const;
     bool canBePastedTo(QList <ItemInfo> infoList, int type) const;
     bool canBePasted(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
     bool canBeMoved(QList<AbstractClipItem *> items, GenTime offset, int trackOffset) const;
index 55d5b14911d1c6eaf8840821d9d17caa45b447b3..f7cbd056c1ec1817e88519599c7a168e08207f35 100644 (file)
@@ -143,41 +143,7 @@ bool DocumentValidator::validate(const double currentVersion)
                     tracksinfoElm.appendChild(trackinfo);
                 }
             }
-        }
-        
-        // Make sure transitions do not overlap
-        QDomNodeList transitions = m_doc.elementsByTagName("transition");
-        QPolygon scenelist;
-        QStringList overlappingTransitions;
-        for (int i = 0; i < transitions.count(); i++) {
-            QDomElement t = transitions.at(i).toElement();
-            QDomNodeList props = t.elementsByTagName("property");
-            bool testTransition = true;
-            int track = -1;
-            for (int k = 0; k < props.count(); k++) {
-                QDomElement p = props.at(k).toElement();
-                QString name = p.attribute("name");
-                if (name == "mlt_service" && p.firstChild().nodeValue() == "mix") testTransition = false;
-                else if (name == "b_track") track = p.firstChild().nodeValue().toInt();
-            }
-            if (testTransition) {
-                QRect r(t.attribute("in").toInt(), 3 * track, t.attribute("out").toInt() - t.attribute("in").toInt(), 1);
-                QPolygon p(r);
-                if (scenelist.intersected(p).isEmpty()) {
-                    scenelist = scenelist.united(p);
-                }
-                else {
-                    // Transition is overlapping, should be removed
-                    overlappingTransitions << t.attribute("id");
-                    tractor.removeChild(t);
-                    i--;
-                }
-            }
-        }
-        if (!overlappingTransitions.isEmpty()) {
-            KMessageBox::informationList(kapp->activeWindow(), i18n("The following transitions were corrupted (overlapping)\n and removed from project."), overlappingTransitions, i18n("Invalid Transitions"));
-            m_modified = true;
-        }
+        }        
 
         // TODO: check the tracks references
         // TODO: check internal mix transitions
index 604f16948d6fd68b566012774d3663c079ca03d4..badcd4dc7283220a8114ab5f3c586d87625d6e62 100644 (file)
@@ -413,7 +413,7 @@ void TrackView::parseDocument(QDomDocument doc)
                 kDebug() << "///// REMOVED INVALID TRANSITION: " << e.attribute("id");
                 tractor.removeChild(transitions.item(i));
                 i--;
-            } else {
+            } else if (m_trackview->canBePastedTo(transitionInfo, TRANSITIONWIDGET)) {
                 Transition *tr = new Transition(transitionInfo, a_track, m_doc->fps(), base, isAutomatic);
                 if (forceTrack) tr->setForcedTrack(true, a_track);
                 m_scene->addItem(tr);
@@ -421,6 +421,11 @@ void TrackView::parseDocument(QDomDocument doc)
                     tr->setItemLocked(true);
                 }
             }
+            else {
+                m_documentErrors.append(i18n("Removed overlapping transition: (%1, %2, %3)", e.attribute("id"), mlt_service, transitionId) + '\n');
+                tractor.removeChild(transitions.item(i));
+                i--;
+            }
         }
     }