int32 SBar::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const { // Initialize our brush here const FSlateBrush* BrushResource = new FSlateBrush(); // Draw background box FSlateDrawElement::MakeBox( OutDrawElements, LayerId, AllottedGeometry.ToPaintGeometry(), BrushResource, ESlateDrawEffect::None, FLinearColor::Gray * 0.35f ); // Calculate Current / Max ratio and turn it into screen width FVector2D WidgetSize = AllottedGeometry.Size; float HealthWidth = (Current * WidgetSize.X) / Max; // Draw current health FSlateDrawElement::MakeBox( OutDrawElements, LayerId, AllottedGeometry.ToPaintGeometry(FVector2D::ZeroVector, FVector2D(HealthWidth, WidgetSize.Y)), BrushResource, ESlateDrawEffect::None, Color ); // Draw text on health bar FSlateFontInfo MyFont(FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Regular.ttf"), 15); const FText TextNew = FText::FromString(FString::Printf(TEXT("%s: %.0f / %.0f"), Text.ToString().GetCharArray().GetData(), Current, Max)); const TSharedRef< FSlateFontMeasure > FontMeasureService = FSlateApplication::Get().GetRenderer()->GetFontMeasureService(); FVector2D DrawSize = FontMeasureService->Measure(TextNew, MyFont); FVector2D Pos = WidgetSize / 2.0f - DrawSize / 2.0f; FSlateDrawElement::MakeText( OutDrawElements, LayerId, AllottedGeometry.ToPaintGeometry(Pos, DrawSize), TextNew, MyFont, ESlateDrawEffect::None, FLinearColor::White ); return SCompoundWidget::OnPaint(Args, AllottedGeometry, MyClippingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled); }
int32 STimeline::OnPaint( const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyClippingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled ) const { // Used to track the layer ID we will return. int32 RetLayerId = LayerId; const TSharedRef< FSlateFontMeasure > FontMeasureService = FSlateApplication::Get().GetRenderer()->GetFontMeasureService(); bool bEnabled = ShouldBeEnabled( bParentEnabled ); const ESlateDrawEffect::Type DrawEffects = bEnabled ? ESlateDrawEffect::None : ESlateDrawEffect::DisabledEffect; const FLinearColor ColorAndOpacitySRGB = InWidgetStyle.GetColorAndOpacityTint(); static const FLinearColor SelectedBarColor(FLinearColor::White); // Paint inside the border only. const FVector2D BorderPadding = FTaskGraphStyle::Get()->GetVector("TaskGraph.ProgressBar.BorderPadding"); const FSlateRect ForegroundClippingRect = AllottedGeometry.GetClippingRect().InsetBy(FMargin(BorderPadding.X, BorderPadding.Y)).IntersectionWith(MyClippingRect); const float OffsetX = DrawingOffsetX; // BorderPadding.X const float Width = DrawingGeometry.Size.X; // AllottedGeometry.Size.X - - 2.0f * BorderPadding.X FSlateFontInfo MyFont( FPaths::EngineContentDir() / TEXT("Slate/Fonts/Roboto-Regular.ttf"), 10 ); //FSlateDrawElement::MakeBox( // OutDrawElements, // RetLayerId++, // AllottedGeometry.ToPaintGeometry(), // BackgroundImage, // MyClippingRect, // DrawEffects, // ColorAndOpacitySRGB //); // Create line points const float RoundedMax = FMath::CeilToInt( MaxValue ); const float RoundedMin = FMath::FloorToInt( MinValue ); const float TimeScale = MaxValue - MinValue; const int32 NumValues = FMath::FloorToInt( AllottedGeometry.Size.X * Zoom / FixedLabelSpacing ); TArray< FVector2D > LinePoints; LinePoints.AddUninitialized( 2 ); { LinePoints[0] = FVector2D( OffsetX, BorderPadding.Y + 1.0f ); LinePoints[1] = FVector2D( OffsetX + Width, BorderPadding.Y + 1.0f ); // Draw lines FSlateDrawElement::MakeLines( OutDrawElements, RetLayerId++, AllottedGeometry.ToPaintGeometry(), LinePoints, MyClippingRect, ESlateDrawEffect::None, FLinearColor::White ); } const FVector2D TextDrawSize = FontMeasureService->Measure(TEXT("0.00"), MyFont); const float LineHeight = AllottedGeometry.Size.Y - BorderPadding.Y - TextDrawSize.Y - 2.0f; for( int32 LineIndex = 0; LineIndex <= NumValues; LineIndex++ ) { const float NormalizedX = (float)LineIndex / NumValues; const float LineX = Offset + NormalizedX * Zoom; if( LineX < 0.0f || LineX > 1.0f ) { continue; } const float LineXPos = OffsetX + Width * LineX; LinePoints[0] = FVector2D( LineXPos, BorderPadding.Y ); LinePoints[1] = FVector2D( LineXPos, LineHeight ); // Draw lines FSlateDrawElement::MakeLines( OutDrawElements, RetLayerId++, AllottedGeometry.ToPaintGeometry(), LinePoints, MyClippingRect, ESlateDrawEffect::None, FLinearColor::White ); FString ValueText( FString::Printf( TEXT("%.2f"), MinValue + NormalizedX * TimeScale ) ); FVector2D DrawSize = FontMeasureService->Measure(ValueText, MyFont); FVector2D TextPos( LineXPos - DrawSize.X * 0.5f, LineHeight ); if( TextPos.X < 0.0f ) { TextPos.X = 0.0f; } else if( (TextPos.X + DrawSize.X) > AllottedGeometry.Size.X ) { TextPos.X = OffsetX + Width - DrawSize.X; } FSlateDrawElement::MakeText( OutDrawElements, RetLayerId, AllottedGeometry.ToOffsetPaintGeometry( TextPos ), ValueText, MyFont, MyClippingRect, ESlateDrawEffect::None, FLinearColor::White ); } // Always draw lines at the start and at the end of the timeline { LinePoints[0] = FVector2D( OffsetX, BorderPadding.Y ); LinePoints[1] = FVector2D( OffsetX, LineHeight ); // Draw lines FSlateDrawElement::MakeLines( OutDrawElements, RetLayerId++, AllottedGeometry.ToPaintGeometry(), LinePoints, MyClippingRect, ESlateDrawEffect::None, FLinearColor::White ); } { LinePoints[0] = FVector2D( OffsetX + Width, BorderPadding.Y ); LinePoints[1] = FVector2D( OffsetX + Width, LineHeight ); // Draw lines FSlateDrawElement::MakeLines( OutDrawElements, RetLayerId++, AllottedGeometry.ToPaintGeometry(), LinePoints, MyClippingRect, ESlateDrawEffect::None, FLinearColor::White ); } return RetLayerId - 1; }