Files
UnrealEngineUWP/Engine/Source/Runtime/MovieScene/Private/MovieSceneBinding.cpp
Max Chen 0167d4ea0f Sequencer: MVVM2 branch and Layer Bars
Copying //Tasks/UE5/Dev-SequencerMVVM2 to Main (//UE5/Main) @20364093

#preflight 628866dfb94f739b152c1e29
#preflight 628866e4585e8f793ee80943
#rb ludovic.chabant, andrew.rodham
#fyi ludovic.chabant, andrew.rodham, andrew.porter
#jira UE-105322

[CL 20364493 by Max Chen in ue5-main branch]
2022-05-25 10:39:33 -04:00

100 lines
2.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MovieSceneBinding.h"
#include "MovieSceneTrack.h"
#include "MovieScene.h"
#include "EventHandlers/ISequenceDataEventHandler.h"
/* FMovieSceneBinding interface
*****************************************************************************/
void FMovieSceneBinding::AddTrack(UMovieSceneTrack& NewTrack, UMovieScene* Owner)
{
#if WITH_EDITOR
if (!UMovieScene::IsTrackClassAllowed(NewTrack.GetClass()))
{
return;
}
#endif
Tracks.Add(&NewTrack);
Owner->EventHandlers.Trigger(&UE::MovieScene::ISequenceDataEventHandler::OnTrackAddedToBinding, &NewTrack, ObjectGuid);
}
bool FMovieSceneBinding::RemoveTrack(UMovieSceneTrack& Track, UMovieScene* Owner)
{
if (Tracks.RemoveSingle(&Track) != 0)
{
Owner->EventHandlers.Trigger(&UE::MovieScene::ISequenceDataEventHandler::OnTrackRemovedFromBinding, &Track, ObjectGuid);
return true;
}
return false;
}
void FMovieSceneBinding::RemoveNullTracks()
{
for (int32 TrackIndex = Tracks.Num()-1; TrackIndex >= 0; --TrackIndex)
{
if (Tracks[TrackIndex] == nullptr)
{
Tracks.RemoveAt(TrackIndex);
// Don't trigger events for null tracks
}
}
}
TArray<UMovieSceneTrack*> FMovieSceneBinding::StealTracks(UMovieScene* Owner)
{
if (Owner)
{
for (UMovieSceneTrack* Track : Tracks)
{
Owner->EventHandlers.Trigger(&UE::MovieScene::ISequenceDataEventHandler::OnTrackRemovedFromBinding, Track, ObjectGuid);
}
}
decltype(Tracks) Empty;
Swap(Empty, Tracks);
return Empty;
}
void FMovieSceneBinding::SetTracks(TArray<UMovieSceneTrack*>&& InTracks, UMovieScene* Owner)
{
// Care is taken here to ensure that we trigger the events correctly when
// InTracks contains tracks that already exist in this binding
TSet<UMovieSceneTrack*> NewTracks;
for (UMovieSceneTrack* Track : InTracks)
{
NewTracks.Add(Track);
}
for (int32 Index = Tracks.Num()-1; Index >= 0; --Index)
{
UMovieSceneTrack* Track = Tracks[Index];
if (!NewTracks.Contains(Track))
{
Tracks.RemoveAt(Index, 1, false);
if (Owner)
{
Owner->EventHandlers.Trigger(&UE::MovieScene::ISequenceDataEventHandler::OnTrackRemovedFromBinding, Track, ObjectGuid);
}
}
else
{
NewTracks.Remove(Track);
}
}
for (UMovieSceneTrack* Track : NewTracks)
{
Tracks.Add(Track);
if (Owner)
{
Owner->EventHandlers.Trigger(&UE::MovieScene::ISequenceDataEventHandler::OnTrackAddedToBinding, Track, ObjectGuid);
}
}
Tracks.Shrink();
}