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

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Jul 13 10:01:53 CEST 2017



On Wed, Jun 28, 2017, at 06:45 PM, Yikai Lu wrote:
> 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!

This seems like a risky requirement, especially if we are to add more
UIs

>      return true;
>  }
>  


-- 
  Hugo Beauzée-Luyssen
  hugo at beauzee.fr


More information about the Vlmc-devel mailing list