Sequencer: Hopeful fix for Sequencer delegate not getting cleared, make sure it's cleared if we get a new Sequencer, also changed from a Lambda to a Raw which are supposed to be safer.

#jira UE-224770
#rb Max.Chen

[CL 36416053 by mike zyracki in 5.5 branch]
This commit is contained in:
mike zyracki
2024-09-18 19:37:57 -04:00
parent a0119ffe86
commit d7b1c2bd68
2 changed files with 14 additions and 12 deletions
@@ -504,15 +504,20 @@ bool SControlRigDetails::IsReadOnlyPropertyOnDetailCustomization(const FProperty
FSequencerTracker::~FSequencerTracker()
{
TSharedPtr<ISequencer> Sequencer = WeakSequencer.Pin();
if (Sequencer)
RemoveDelegates();
}
void FSequencerTracker::RemoveDelegates()
{
if (TSharedPtr<ISequencer> Sequencer = WeakSequencer.Pin())
{
Sequencer->GetSelectionChangedObjectGuids().Remove(OnSelectionChangedHandle);
Sequencer->GetSelectionChangedObjectGuids().RemoveAll(this);
}
}
void FSequencerTracker::SetSequencerAndDetails(TWeakPtr<ISequencer> InWeakSequencer, SControlRigDetails* InControlRigDetails)
{
RemoveDelegates();
WeakSequencer = InWeakSequencer;
ControlRigDetails = InControlRigDetails;
if (WeakSequencer.IsValid() == false || InControlRigDetails == nullptr)
@@ -525,15 +530,11 @@ void FSequencerTracker::SetSequencerAndDetails(TWeakPtr<ISequencer> InWeakSequen
Sequencer->GetSelectedObjects(SequencerSelectedObjects);
UpdateSequencerBindings(SequencerSelectedObjects);
OnSelectionChangedHandle = Sequencer->GetSelectionChangedObjectGuids().AddLambda([this](TArray<FGuid> NewSelection)
{
UpdateSequencerBindings(NewSelection);
});
Sequencer->GetSelectionChangedObjectGuids().AddRaw(this, &FSequencerTracker::UpdateSequencerBindings);
}
void FSequencerTracker::UpdateSequencerBindings(const TArray<FGuid>& SequencerBindings)
void FSequencerTracker::UpdateSequencerBindings(TArray<FGuid> SequencerBindings)
{
const FDateTime StartTime = FDateTime::Now();
@@ -38,8 +38,9 @@ public:
void SetSequencerAndDetails(TWeakPtr<ISequencer> InWeakSequencer, SControlRigDetails* InControlRigDetails);
TMap<UObject*, FArrayOfPropertyTracks>& GetObjectsTracked() { return ObjectsTracked; }
private:
void UpdateSequencerBindings(const TArray<FGuid>& SequencerBindings);
FDelegateHandle OnSelectionChangedHandle;
void RemoveDelegates();
void UpdateSequencerBindings(TArray<FGuid> SequencerBindings);
TWeakPtr<ISequencer> WeakSequencer;
TMap<UObject*, FArrayOfPropertyTracks> ObjectsTracked;
SControlRigDetails* ControlRigDetails = nullptr;