virtual int32 OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const override { float Alpha = Sequencer.Pin()->GetOverlayFadeCurve(); if (Alpha > 0.f) { FTimeToPixel TimeToPixelConverter = FTimeToPixel(AllottedGeometry, ViewRange.Get()); TRange<float> TimeBounds = TRange<float>(TimeToPixelConverter.PixelToTime(0), TimeToPixelConverter.PixelToTime(AllottedGeometry.Size.X)); TArray< TRange<float> > OverlayRanges = ComputeOverlayRanges(TimeBounds, CachedFilteredRanges); for (int32 i = 0; i < OverlayRanges.Num(); ++i) { float LowerBound = TimeToPixelConverter.TimeToPixel(OverlayRanges[i].GetLowerBoundValue()); float UpperBound = TimeToPixelConverter.TimeToPixel(OverlayRanges[i].GetUpperBoundValue()); FSlateDrawElement::MakeBox( OutDrawElements, LayerId, AllottedGeometry.ToPaintGeometry(FVector2D(LowerBound, 0), FVector2D(UpperBound - LowerBound, AllottedGeometry.Size.Y)), FEditorStyle::GetBrush("Sequencer.ShotFilter"), MyClippingRect, ESlateDrawEffect::None, FLinearColor(1.f, 1.f, 1.f, Alpha) ); } } return LayerId; }
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 ); } } } }
void FResizeSection::OnDrag( const FPointerEvent& MouseEvent, const FVector2D& LocalMousePos, const FTimeToPixel& TimeToPixelConverter, TSharedPtr<FTrackNode> SequencerNode ) { bool bIsDilating = MouseEvent.IsControlDown(); if( Section.IsValid() ) { // Convert the current mouse position to a time float NewTime = TimeToPixelConverter.PixelToTime( LocalMousePos.X ); // Find the borders of where you can drag to TRange<float> SectionBoundaries = GetSectionBoundaries(Section.Get(), SequencerNode); // Snapping if ( Settings->GetIsSnapEnabled() ) { bool bSnappedToSection = false; if ( Settings->GetSnapSectionTimesToSections() ) { TArray<float> TimesToSnapTo; GetSectionSnapTimes(TimesToSnapTo, Section.Get(), SequencerNode, bIsDilating); TOptional<float> NewSnappedTime = SnapToTimes(NewTime, TimesToSnapTo, TimeToPixelConverter); if (NewSnappedTime.IsSet()) { NewTime = NewSnappedTime.GetValue(); bSnappedToSection = true; } } if ( bSnappedToSection == false && Settings->GetSnapSectionTimesToInterval() ) { NewTime = Settings->SnapTimeToInterval(NewTime); } } if( bDraggingByEnd ) { // Dragging the end of a section // Ensure we aren't shrinking past the start time NewTime = FMath::Clamp( NewTime, Section->GetStartTime(), SectionBoundaries.GetUpperBoundValue() ); if (bIsDilating) { float NewSize = NewTime - Section->GetStartTime(); float DilationFactor = NewSize / Section->GetTimeSize(); Section->DilateSection(DilationFactor, Section->GetStartTime(), DraggedKeyHandles); } else { Section->SetEndTime( NewTime ); } } else if( !bDraggingByEnd ) { // Dragging the start of a section // Ensure we arent expanding past the end time NewTime = FMath::Clamp( NewTime, SectionBoundaries.GetLowerBoundValue(), Section->GetEndTime() ); if (bIsDilating) { float NewSize = Section->GetEndTime() - NewTime; float DilationFactor = NewSize / Section->GetTimeSize(); Section->DilateSection(DilationFactor, Section->GetEndTime(), DraggedKeyHandles); } else { Section->SetStartTime( NewTime ); } } } }