[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