From dc634132842e40ee3e4d738e267d2b9300e830fb Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 11 Jun 2011 12:57:11 +0000 Subject: [PATCH] Cleaner detection of overlapping transitions svn path=/trunk/kdenlive/; revision=5699 --- src/customtrackview.h | 3 ++- src/documentvalidator.cpp | 36 +----------------------------------- src/trackview.cpp | 7 ++++++- 3 files changed, 9 insertions(+), 37 deletions(-) diff --git a/src/customtrackview.h b/src/customtrackview.h index 0c47b3ef..f862dee7 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -156,6 +156,8 @@ public: int selectedTrack() const; QStringList selectedClips() const; QList 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 infoList, int type) const; bool canBePasted(QList items, GenTime offset, int trackOffset) const; bool canBeMoved(QList items, GenTime offset, int trackOffset) const; diff --git a/src/documentvalidator.cpp b/src/documentvalidator.cpp index 55d5b149..f7cbd056 100644 --- a/src/documentvalidator.cpp +++ b/src/documentvalidator.cpp @@ -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 diff --git a/src/trackview.cpp b/src/trackview.cpp index 604f1694..badcd4dc 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -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--; + } } } -- 2.39.2