int32 SFlipbookTimeline::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const { LayerId = SCompoundWidget::OnPaint(Args, AllottedGeometry, MyClippingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled); const float CurrentTimeSecs = PlayTime.Get(); UPaperFlipbook* Flipbook = FlipbookBeingEdited.Get(); const float TotalTimeSecs = (Flipbook != nullptr) ? Flipbook->GetTotalDuration() : 0.0f; const int32 TotalNumFrames = (Flipbook != nullptr) ? Flipbook->GetNumFrames() : 0; const float SlateTotalDistance = SlateUnitsPerFrame * TotalNumFrames; const float CurrentTimeXPos = (CurrentTimeSecs / TotalTimeSecs) * SlateTotalDistance; // Draw a line for the current scrub cursor ++LayerId; TArray<FVector2D> LinePoints; LinePoints.Add(FVector2D(CurrentTimeXPos, 0.f)); LinePoints.Add(FVector2D(CurrentTimeXPos, AllottedGeometry.Size.Y)); FSlateDrawElement::MakeLines( OutDrawElements, LayerId, AllottedGeometry.ToPaintGeometry(), LinePoints, MyClippingRect, ESlateDrawEffect::None, FLinearColor::Red ); return LayerId; }
void SFlipbookTimeline::CheckForRebuild(bool bRebuildAll) { UPaperFlipbook* Flipbook = FlipbookBeingEdited.Get(); const int32 NewNumKeyframes = (Flipbook != nullptr) ? Flipbook->GetNumKeyFrames() : 0; if ((NewNumKeyframes != NumKeyFramesFromLastRebuild) || bRebuildAll) { NumKeyFramesFromLastRebuild = NewNumKeyframes; TimelineTrack->Rebuild(); } const int32 NewNumFrames = (Flipbook != nullptr) ? Flipbook->GetNumFrames() : 0; if ((NewNumFrames != NumFramesFromLastRebuild) || bRebuildAll) { NumFramesFromLastRebuild = NewNumFrames; TimelineHeader->Rebuild(); RebuildPerFrameBG(); } }
EVisibility SFlipbookTimeline::NoFramesWarningVisibility() const { UPaperFlipbook* Flipbook = FlipbookBeingEdited.Get(); const int32 TotalNumFrames = (Flipbook != nullptr) ? Flipbook->GetNumFrames() : 0; return (TotalNumFrames == 0) ? EVisibility::Visible : EVisibility::Collapsed; }
void SFlipbookTimeline::Construct(const FArguments& InArgs, TSharedPtr<FUICommandList> InCommandList) { FlipbookBeingEdited = InArgs._FlipbookBeingEdited; PlayTime = InArgs._PlayTime; OnSelectionChanged = InArgs._OnSelectionChanged; CommandList = InCommandList; SlateUnitsPerFrame = 120.0f; BackgroundPerFrameSlices = SNew(SHorizontalBox); TimelineHeader = SNew(STimelineHeader) .SlateUnitsPerFrame(this, &SFlipbookTimeline::GetSlateUnitsPerFrame) .FlipbookBeingEdited(FlipbookBeingEdited) .PlayTime(PlayTime); TimelineTrack = SNew(SFlipbookTimelineTrack, CommandList) .SlateUnitsPerFrame(this, &SFlipbookTimeline::GetSlateUnitsPerFrame) .FlipbookBeingEdited(FlipbookBeingEdited) .OnSelectionChanged(OnSelectionChanged); ChildSlot [ SNew(SBorder) .BorderImage( FEditorStyle::GetBrush("ToolPanel.GroupBorder") ) [ SNew(SScrollBox) .Orientation(Orient_Horizontal) .ScrollBarAlwaysVisible(true) +SScrollBox::Slot() [ SNew(SOverlay) // Per-frame background +SOverlay::Slot() .VAlign(VAlign_Fill) [ BackgroundPerFrameSlices.ToSharedRef() ] // Flipbook header and track +SOverlay::Slot() [ SNew(SVerticalBox) +SVerticalBox::Slot() .AutoHeight() .Padding(0,0,0,2) [ TimelineHeader.ToSharedRef() ] +SVerticalBox::Slot() .AutoHeight() [ SNew(SBox) .HeightOverride(FFlipbookUIConstants::FrameHeight) [ TimelineTrack.ToSharedRef() ] ] ] // Empty flipbook instructions + SOverlay::Slot() .VAlign(VAlign_Center) .HAlign(HAlign_Center) [ SNew(STextBlock) .Visibility(this, &SFlipbookTimeline::NoFramesWarningVisibility) .Text(LOCTEXT("EmptyTimelineInstruction", "Right-click here or drop in sprites to add key frames")) ] ] ] ]; UPaperFlipbook* Flipbook = FlipbookBeingEdited.Get(); NumKeyFramesFromLastRebuild = (Flipbook != nullptr) ? Flipbook->GetNumKeyFrames() : 0; NumFramesFromLastRebuild = (Flipbook != nullptr) ? Flipbook->GetNumFrames() : 0; RebuildPerFrameBG(); }