UMovieSceneSection* UMovieSceneSection::SplitSection(float SplitTime) { if (!IsTimeWithinSection(SplitTime)) { return nullptr; } SetFlags(RF_Transactional); if (TryModify()) { float SectionEndTime = GetEndTime(); // Trim off the right SetEndTime(SplitTime); // Create a new section UMovieSceneTrack* Track = CastChecked<UMovieSceneTrack>(GetOuter()); Track->Modify(); UMovieSceneSection* NewSection = DuplicateObject<UMovieSceneSection>(this, Track); check(NewSection); NewSection->SetStartTime(SplitTime); NewSection->SetEndTime(SectionEndTime); Track->AddSection(*NewSection); return NewSection; } return nullptr; }
void FNameCurveKeyArea::PasteKeys(const FMovieSceneClipboardKeyTrack& KeyTrack, const FMovieSceneClipboardEnvironment& SrcEnvironment, const FSequencerPasteEnvironment& DstEnvironment) { float PasteAt = DstEnvironment.CardinalTime; KeyTrack.IterateKeys([&](const FMovieSceneClipboardKey& Key){ UMovieSceneSection* Section = GetOwningSection(); if (!Section) { return true; } if (Section->TryModify()) { float Time = PasteAt + Key.GetTime(); if (Section->GetStartTime() > Time) { Section->SetStartTime(Time); } if (Section->GetEndTime() < Time) { Section->SetEndTime(Time); } FKeyHandle KeyHandle = Curve.UpdateOrAddKey(Time, Key.GetValue<FName>()); DstEnvironment.ReportPastedKey(KeyHandle, *this); } return true; }); }
UMovieSceneSection* UMovieScenePropertyTrack::FindOrAddSection( float Time ) { // Find a spot for the section so that they are sorted by start time for( int32 SectionIndex = 0; SectionIndex < Sections.Num(); ++SectionIndex ) { UMovieSceneSection* Section = Sections[SectionIndex]; if( Section->IsTimeWithinSection( Time ) ) { return Section; } // Check if there are no more sections that would overlap the time if( !Sections.IsValidIndex( SectionIndex+1 ) || Sections[SectionIndex+1]->GetStartTime() > Time ) { // No sections overlap the time if( SectionIndex > 0 ) { // Append and grow the previous section UMovieSceneSection* PreviousSection = Sections[ SectionIndex ? SectionIndex-1 : 0 ]; PreviousSection->SetEndTime( Time ); return PreviousSection; } else if( Sections.IsValidIndex( SectionIndex+1 ) ) { // Prepend and grow the next section because there are no sections before this one UMovieSceneSection* NextSection = Sections[SectionIndex+1]; NextSection->SetStartTime( Time ); return NextSection; } else { // SectionIndex == 0 UMovieSceneSection* PreviousSection = Sections[0]; if( PreviousSection->GetEndTime() < Time ) { // Append and grow the section PreviousSection->SetEndTime( Time ); } else { // Prepend and grow the section PreviousSection->SetStartTime( Time ); } return PreviousSection; } } } check( Sections.Num() == 0 ); // Add a new section that starts and ends at the same time UMovieSceneSection* NewSection = CreateNewSection(); NewSection->SetStartTime( Time ); NewSection->SetEndTime( Time ); Sections.Add( NewSection ); return NewSection; }
void FMoveKeys::OnDrag( const FPointerEvent& MouseEvent, const FVector2D& LocalMousePos, const FTimeToPixel& TimeToPixelConverter, TSharedPtr<FTrackNode> SequencerNode ) { // Convert the delta position to a delta time amount that was moved float MouseTime = TimeToPixelConverter.PixelToTime(LocalMousePos.X); float SelectedKeyTime = DraggedKey.KeyArea->GetKeyTime(DraggedKey.KeyHandle.GetValue()); float DistanceMoved = MouseTime - SelectedKeyTime; if( DistanceMoved != 0.0f ) { float TimeDelta = DistanceMoved; // Snapping if ( Settings->GetIsSnapEnabled() ) { bool bSnappedToKeyTime = false; if ( Settings->GetSnapKeyTimesToKeys() ) { TArray<float> OutSnapTimes; GetKeySnapTimes(OutSnapTimes, SequencerNode); TArray<float> InitialTimes; for ( FSelectedKey SelectedKey : SelectedKeys ) { InitialTimes.Add(SelectedKey.KeyArea->GetKeyTime(SelectedKey.KeyHandle.GetValue()) + DistanceMoved); } float OutInitialTime = 0.f; float OutSnapTime = 0.f; if ( SnapToTimes( InitialTimes, OutSnapTimes, TimeToPixelConverter, OutInitialTime, OutSnapTime ) ) { bSnappedToKeyTime = true; TimeDelta = OutSnapTime - (OutInitialTime - DistanceMoved); } } if ( bSnappedToKeyTime == false && Settings->GetSnapKeyTimesToInterval() ) { TimeDelta = Settings->SnapTimeToInterval( MouseTime ) - SelectedKeyTime; } } for( FSelectedKey SelectedKey : SelectedKeys ) { UMovieSceneSection* Section = SelectedKey.Section; TSharedPtr<IKeyArea>& KeyArea = SelectedKey.KeyArea; // Tell the key area to move the key. We reset the key index as a result of the move because moving a key can change it's internal index KeyArea->MoveKey( SelectedKey.KeyHandle.GetValue(), TimeDelta ); // Update the key that moved float NewKeyTime = KeyArea->GetKeyTime( SelectedKey.KeyHandle.GetValue() ); // If the key moves outside of the section resize the section to fit the key // @todo Sequencer - Doesn't account for hitting other sections if( NewKeyTime > Section->GetEndTime() ) { Section->SetEndTime( NewKeyTime ); } else if( NewKeyTime < Section->GetStartTime() ) { Section->SetStartTime( NewKeyTime ); } } } }