]> git.sesse.net Git - kdenlive/commitdiff
Fix corruption when moving a clip with 2 attached transitions
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 5 Oct 2009 14:38:36 +0000 (14:38 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 5 Oct 2009 14:38:36 +0000 (14:38 +0000)
svn path=/trunk/kdenlive/; revision=4000

src/customtrackview.cpp

index decf2029a0c5cee06a23c3c9fce9b8d0a9827743..132601ca764e8fb337edb6419ded4a5e2734190d 100644 (file)
@@ -2608,23 +2608,27 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                     moveCommand->setText(i18n("Move clip"));
                     new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand);
                     // Also move automatic transitions (on lower track)
-                    Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
-                    if (tr && tr->isAutomatic()) {
-                        ItemInfo trInfo = tr->info();
-                        ItemInfo newTrInfo = trInfo;
-                        newTrInfo.track = info.track;
-                        newTrInfo.startPos = m_dragItem->startPos();
-                        if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())) {
+                    Transition *startTransition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
+                    ItemInfo startTrInfo;
+                    ItemInfo newStartTrInfo;
+                    bool moveStartTrans = false;
+                    bool moveEndTrans = false;
+                    if (startTransition && startTransition->isAutomatic()) {
+                        startTrInfo = startTransition->info();
+                        newStartTrInfo = startTrInfo;
+                        newStartTrInfo.track = info.track;
+                        newStartTrInfo.startPos = info.startPos;
+                        if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtEnd(newStartTrInfo.endPos, m_document->tracksCount() - startTransition->transitionEndTrack())) {
                             // transition end should stay the same
                         } else {
                             // transition end should be adjusted to clip
-                            newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos);
+                            newStartTrInfo.endPos = newStartTrInfo.endPos + (newStartTrInfo.startPos - startTrInfo.startPos);
                         }
-                        if (newTrInfo.startPos < newTrInfo.endPos) new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
+                        if (newStartTrInfo.startPos < newStartTrInfo.endPos) moveStartTrans = true;
                     }
-                    if (tr == NULL || tr->endPos() < m_dragItemInfo.endPos) {
+                    if (startTransition == NULL || startTransition->endPos() < m_dragItemInfo.endPos) {
                         // Check if there is a transition at clip end
-                        tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track);
+                        Transition *tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track);
                         if (tr && tr->isAutomatic()) {
                             ItemInfo trInfo = tr->info();
                             ItemInfo newTrInfo = trInfo;
@@ -2636,12 +2640,29 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                                 // transition start should be moved
                                 newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
                             }
-                            if (newTrInfo.startPos < newTrInfo.endPos)
+                            if (newTrInfo.startPos < newTrInfo.endPos) {
+                                moveEndTrans = true;
+                                if (moveStartTrans) {
+                                    // we have to move both transitions, remove the start one so that there is no collision
+                                    new AddTransitionCommand(this, startTrInfo, startTransition->transitionEndTrack(), startTransition->toXML(), true, true, moveCommand);
+                                }
                                 new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
+                                if (moveStartTrans) {
+                                    // re-add transition in correct place
+                                    int transTrack = startTransition->transitionEndTrack();
+                                    if (m_dragItemInfo.track != info.track && !startTransition->forcedTrack()) {
+                                        transTrack = getPreviousVideoTrack(info.track);
+                                    }
+                                    new AddTransitionCommand(this, newStartTrInfo, transTrack, startTransition->toXML(), false, true, moveCommand);
+                                }
+                            }
                         }
                     }
+
+                    if (moveStartTrans && !moveEndTrans) new MoveTransitionCommand(this, startTrInfo, newStartTrInfo, true, moveCommand);
+
                     // Also move automatic transitions (on upper track)
-                    tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+                    Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
                     if (m_dragItemInfo.track == info.track && tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
                         ItemInfo trInfo = tr->info();
                         ItemInfo newTrInfo = trInfo;