142 lines
4.6 KiB
C++
142 lines
4.6 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "UI/PHYAttributeResourceBarWidget.h"
|
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(PHYAttributeResourceBarWidget)
|
|
|
|
#include "Blueprint/WidgetTree.h"
|
|
#include "Components/Border.h"
|
|
#include "Components/HorizontalBox.h"
|
|
#include "Components/HorizontalBoxSlot.h"
|
|
#include "Components/ProgressBar.h"
|
|
#include "Components/SizeBox.h"
|
|
#include "Components/TextBlock.h"
|
|
#include "Components/VerticalBox.h"
|
|
#include "Components/VerticalBoxSlot.h"
|
|
#include "Engine/Texture2D.h"
|
|
#include "Fonts/SlateFontInfo.h"
|
|
#include "Styling/CoreStyle.h"
|
|
#include "Styling/SlateBrush.h"
|
|
#include "Widgets/SWidget.h"
|
|
|
|
namespace
|
|
{
|
|
const TCHAR* const AttributeResourceRowTexturePath = TEXT("/Game/AGame/UI/Attributes/Textures/T_PHY_UI_RowStrip.T_PHY_UI_RowStrip");
|
|
|
|
float MakePercent(const float CurrentValue, const float MaxValue)
|
|
{
|
|
return MaxValue > UE_SMALL_NUMBER ? FMath::Clamp(CurrentValue / MaxValue, 0.0f, 1.0f) : 0.0f;
|
|
}
|
|
|
|
FSlateBrush MakeAttributeResourceBrush()
|
|
{
|
|
FSlateBrush Brush;
|
|
Brush.DrawAs = ESlateBrushDrawType::Box;
|
|
Brush.Margin = FMargin(0.08f);
|
|
Brush.ImageSize = FVector2D(512.0f, 64.0f);
|
|
Brush.TintColor = FSlateColor(FLinearColor(1.0f, 1.0f, 1.0f, 0.88f));
|
|
if (UTexture2D* Texture = LoadObject<UTexture2D>(nullptr, AttributeResourceRowTexturePath))
|
|
{
|
|
Brush.SetResourceObject(Texture);
|
|
}
|
|
return Brush;
|
|
}
|
|
}
|
|
|
|
UPHYAttributeResourceBarWidget::UPHYAttributeResourceBarWidget(const FObjectInitializer& ObjectInitializer)
|
|
: Super(ObjectInitializer)
|
|
{
|
|
}
|
|
|
|
TSharedRef<SWidget> UPHYAttributeResourceBarWidget::RebuildWidget()
|
|
{
|
|
BuildNativeWidgetTree();
|
|
return Super::RebuildWidget();
|
|
}
|
|
|
|
void UPHYAttributeResourceBarWidget::SynchronizeProperties()
|
|
{
|
|
Super::SynchronizeProperties();
|
|
UpdateResourceWidgets();
|
|
}
|
|
|
|
void UPHYAttributeResourceBarWidget::SetResource(FText InLabel, const float InCurrentValue, const float InMaxValue, const FLinearColor InBarTint)
|
|
{
|
|
Label = MoveTemp(InLabel);
|
|
CurrentValue = InCurrentValue;
|
|
MaxValue = FMath::Max(1.0f, InMaxValue);
|
|
BarTint = InBarTint;
|
|
UpdateResourceWidgets();
|
|
}
|
|
|
|
void UPHYAttributeResourceBarWidget::BuildNativeWidgetTree()
|
|
{
|
|
if (!WidgetTree)
|
|
{
|
|
WidgetTree = NewObject<UWidgetTree>(this, TEXT("WidgetTree"), RF_Transient);
|
|
}
|
|
|
|
if (WidgetTree->RootWidget && LabelText && ValueText && ResourceBar)
|
|
{
|
|
return;
|
|
}
|
|
|
|
UBorder* RootBorder = WidgetTree->ConstructWidget<UBorder>(UBorder::StaticClass(), TEXT("RootBorder"));
|
|
RootBorder->SetBrush(MakeAttributeResourceBrush());
|
|
RootBorder->SetPadding(FMargin(10.0f, 5.0f));
|
|
WidgetTree->RootWidget = RootBorder;
|
|
|
|
UHorizontalBox* HeaderBox = WidgetTree->ConstructWidget<UHorizontalBox>(UHorizontalBox::StaticClass(), TEXT("HeaderBox"));
|
|
RootBorder->SetContent(HeaderBox);
|
|
|
|
LabelText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("LabelText"));
|
|
LabelText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 16));
|
|
LabelText->SetColorAndOpacity(FSlateColor(FLinearColor(0.34f, 0.27f, 0.17f, 1.0f)));
|
|
if (UHorizontalBoxSlot* LabelSlot = HeaderBox->AddChildToHorizontalBox(LabelText))
|
|
{
|
|
LabelSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
|
LabelSlot->SetPadding(FMargin(0.0f, 0.0f, 18.0f, 0.0f));
|
|
LabelSlot->SetVerticalAlignment(VAlign_Center);
|
|
}
|
|
|
|
USizeBox* BarSizeBox = WidgetTree->ConstructWidget<USizeBox>(USizeBox::StaticClass(), TEXT("BarSizeBox"));
|
|
BarSizeBox->SetHeightOverride(13.0f);
|
|
if (UHorizontalBoxSlot* BarOuterSlot = HeaderBox->AddChildToHorizontalBox(BarSizeBox))
|
|
{
|
|
BarOuterSlot->SetSize(FSlateChildSize(ESlateSizeRule::Fill));
|
|
BarOuterSlot->SetPadding(FMargin(0.0f, 2.0f, 18.0f, 0.0f));
|
|
BarOuterSlot->SetVerticalAlignment(VAlign_Center);
|
|
}
|
|
|
|
ResourceBar = WidgetTree->ConstructWidget<UProgressBar>(UProgressBar::StaticClass(), TEXT("ResourceBar"));
|
|
BarSizeBox->AddChild(ResourceBar);
|
|
|
|
ValueText = WidgetTree->ConstructWidget<UTextBlock>(UTextBlock::StaticClass(), TEXT("ValueText"));
|
|
ValueText->SetFont(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 14));
|
|
ValueText->SetColorAndOpacity(FSlateColor(FLinearColor(0.23f, 0.20f, 0.16f, 1.0f)));
|
|
if (UHorizontalBoxSlot* ValueSlot = HeaderBox->AddChildToHorizontalBox(ValueText))
|
|
{
|
|
ValueSlot->SetSize(FSlateChildSize(ESlateSizeRule::Automatic));
|
|
ValueSlot->SetVerticalAlignment(VAlign_Center);
|
|
}
|
|
|
|
UpdateResourceWidgets();
|
|
}
|
|
|
|
void UPHYAttributeResourceBarWidget::UpdateResourceWidgets()
|
|
{
|
|
if (LabelText)
|
|
{
|
|
LabelText->SetText(Label);
|
|
}
|
|
if (ValueText)
|
|
{
|
|
ValueText->SetText(FText::FromString(FString::Printf(TEXT("%.0f / %.0f"), FMath::Max(0.0f, CurrentValue), FMath::Max(1.0f, MaxValue))));
|
|
}
|
|
if (ResourceBar)
|
|
{
|
|
ResourceBar->SetPercent(MakePercent(CurrentValue, MaxValue));
|
|
ResourceBar->SetFillColorAndOpacity(BarTint);
|
|
}
|
|
}
|