[vlmc-devel] Timeline: Move clips in a manner that clips won't overlap each other.

Yikai Lu git at videolan.org
Wed Jun 28 18:45:21 CEST 2017


vlmc | branch: master | Yikai Lu <luyikei.qmltu at gmail.com> | Thu Jun 29 01:45:08 2017 +0900| [0667503bacf3057d3cdd46665d3e7c4624914faa] | committer: Yikai Lu

Timeline: Move clips in a manner that clips won't overlap each other.

> https://code.videolan.org/videolan/vlmc/commit/0667503bacf3057d3cdd46665d3e7c4624914faa
---

 src/Gui/timeline/Clip.qml         |  3 ++-
 src/Gui/timeline/Track.qml        |  1 +
 src/Gui/timeline/main.qml         | 35 ++++++++++++++++++++++++++++++-----
 src/Workflow/SequenceWorkflow.cpp |  3 +--
 4 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/src/Gui/timeline/Clip.qml b/src/Gui/timeline/Clip.qml
index c6837a09..30069a84 100644
--- a/src/Gui/timeline/Clip.qml
+++ b/src/Gui/timeline/Clip.qml
@@ -27,6 +27,7 @@ Rectangle {
     // Usualy it is trackId, the clip will be moved to the new track immediately.
     property int newTrackId
     property int position
+    property int lastPosition
     property int begin
     property int end
     property string libraryUuid // Library UUID: For thumbnails
@@ -52,7 +53,7 @@ Rectangle {
     }
 
     function move() {
-        moveClipTo( track.type, uuid, newTrackId, position );
+        moveClipTo( uuid, newTrackId, position );
     }
 
     function resize() {
diff --git a/src/Gui/timeline/Track.qml b/src/Gui/timeline/Track.qml
index 407c458c..22c8469b 100644
--- a/src/Gui/timeline/Track.qml
+++ b/src/Gui/timeline/Track.qml
@@ -340,6 +340,7 @@ Item {
                 uuid: model.uuid
                 libraryUuid: model.libraryUuid
                 position: model.position
+                lastPosition: model.lastPosition
                 begin: model.begin
                 end: model.end
                 linkedClip: model.linkedClip
diff --git a/src/Gui/timeline/main.qml b/src/Gui/timeline/main.qml
index 4a3ed7fe..8ec9aa8e 100644
--- a/src/Gui/timeline/main.qml
+++ b/src/Gui/timeline/main.qml
@@ -90,6 +90,7 @@ Rectangle {
         newDict["begin"] = clipDict["begin"];
         newDict["end"] = clipDict["end"];
         newDict["position"] = clipDict["position"];
+        newDict["lastPosition"] = clipDict["position"];
         newDict["length"] = clipDict["length"];
         newDict["libraryUuid"] = clipDict["libraryUuid"];
         newDict["uuid"] = clipDict["uuid"];
@@ -172,7 +173,7 @@ Rectangle {
         return null;
     }
 
-    function moveClipTo( trackType, uuid, trackId, position )
+    function moveClipTo( uuid, trackId, position )
     {
         var clip = findClipItem( uuid );
         if ( !clip )
@@ -293,7 +294,32 @@ Rectangle {
     }
 
     function dragFinished() {
-        selectedClips[0].move();
+        var toMove = [];
+        for ( var i = 0; i < selectedClips.length; ++i )
+            toMove.push( selectedClips[i] );
+
+        // Move clips in a manner that clips won't overlap each other.
+        toMove.sort(
+                    function( clipA, clipB )
+                    {
+                        if ( clipA.newTrackId !== clipB.newTrackId )
+                        {
+                            return clipA.newTrackId - clipB.newTrackId;
+                        }
+                        else if ( clipA.position > clipA.lastPosition )
+                        {
+                            return - ( clipA.position - clipB.position );
+                        }
+                        else if ( clipA.position < clipA.position )
+                        {
+                            return clipA.position - clipB.position;
+                        }
+                    }
+                    );
+
+        for ( i = 0; i < toMove.length; ++i )
+            moveClipTo( toMove[i].uuid, toMove[i].newTrackId, toMove[i].position );
+
         adjustTracks( "Audio" );
         adjustTracks( "Video" );
     }
@@ -592,9 +618,8 @@ Rectangle {
                 addClip( type, clipInfo["trackId"], clipInfo );
                 removeClipFromTrack( type, oldClip["trackId"], uuid );
             }
-            else if ( oldClip["position"] !== clipInfo["position"] ) {
-                findClipItem( uuid ).position = clipInfo["position"];
-            }
+            findClipItem( uuid ).position = clipInfo["position"];
+            findClipItem( uuid ).lastPosition = clipInfo["position"];
             adjustTracks( type );
         }
 
diff --git a/src/Workflow/SequenceWorkflow.cpp b/src/Workflow/SequenceWorkflow.cpp
index 5c80dd1b..0461abb5 100644
--- a/src/Workflow/SequenceWorkflow.cpp
+++ b/src/Workflow/SequenceWorkflow.cpp
@@ -115,8 +115,7 @@ SequenceWorkflow::moveClip( const QUuid& uuid, quint32 trackId, qint64 pos )
         c->pos = pos;
     }
     emit clipMoved( uuid.toString() );
-    // TODO: If we detect collision too strictly, there will be a problem if we want to move multiple
-    //       clips at the same time.
+    // CAUTION: You must not move a clip to a place where it would overlap another clip!
     return true;
 }
 



More information about the Vlmc-devel mailing list