Files
UnrealEngine/Engine/Source/Editor/StorageServerWidgets/Private/SBuildActivity.cpp
2025-05-18 13:04:45 +08:00

203 lines
6.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "SBuildActivity.h"
#include "Internationalization/FastDecimalFormat.h"
#include "Math/BasicMathExpressionEvaluator.h"
#include "Math/UnitConversion.h"
#include "Misc/ExpressionParser.h"
#include "Styling/StyleColors.h"
#include "Widgets/Images/SImage.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Input/SHyperlink.h"
#include "Widgets/Layout/SGridPanel.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Views/SListView.h"
#include "ZenServiceInstanceManager.h"
#define LOCTEXT_NAMESPACE "StorageServerBuild"
namespace UE::BuildActivity::Internal
{
namespace FBuildActivityIds
{
const FName ColStatus = TEXT("Status");
const FName ColName = TEXT("Name");
const FName ColPlatform = TEXT("Platform");
const FName ColDescription = TEXT("Description");
}
}
void SBuildActivity::Construct(const FArguments& InArgs)
{
ZenServiceInstance = InArgs._ZenServiceInstance;
BuildServiceInstance = InArgs._BuildServiceInstance;
this->ChildSlot
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(0, 0, 0, 0)
.Expose(GridSlot)
[
GetGridPanel()
]
];
}
TSharedRef<ITableRow> SBuildActivity::GenerateBuildActivityRow(FBuildActivityPtr InItem, const TSharedRef<STableViewBase>& InOwningTable)
{
return SNew(SBuildActivityTableRow, InOwningTable, InItem, BuildServiceInstance.Get());
}
TSharedRef<SWidget> SBuildActivity::GetGridPanel()
{
using namespace UE::BuildActivity::Internal;
TSharedRef<SVerticalBox> Panel = SNew(SVerticalBox)
.Visibility_Lambda([this]()
{
return BuildActivities.IsEmpty() ? EVisibility::Collapsed : EVisibility::Visible;
});
const float RowMargin = 0.0f;
const float ColumnMargin = 10.0f;
const FSlateColor TitleColor = FStyleColors::AccentWhite;
const FSlateFontInfo TitleFont = FCoreStyle::GetDefaultFontStyle("Bold", 10);
Panel->AddSlot()
.AutoHeight()
[
SNew(STextBlock)
.Margin(FMargin(ColumnMargin, RowMargin))
.ColorAndOpacity(TitleColor)
.Font(TitleFont)
.Text(LOCTEXT("BuildActivity_Activity", "Activity"))
];
Panel->AddSlot()
.AutoHeight()
.Padding(FMargin(ColumnMargin, RowMargin))
[
SNew(SListView<FBuildActivityPtr>)
.ListItemsSource(&BuildActivities)
.OnGenerateRow(this, &SBuildActivity::GenerateBuildActivityRow)
.HeaderRow
(
SNew(SHeaderRow)
.Visibility(EVisibility::Collapsed)
+ SHeaderRow::Column(FBuildActivityIds::ColStatus).DefaultLabel(LOCTEXT("BuildActivity_ActivityStatus", "Status"))
.FillWidth(0.1f)
+ SHeaderRow::Column(FBuildActivityIds::ColName).DefaultLabel(LOCTEXT("BuildActivity_ActivityName", "Name"))
.FillWidth(0.2f).HAlignCell(HAlign_Left).HAlignHeader(HAlign_Left).VAlignCell(VAlign_Center)
+ SHeaderRow::Column(FBuildActivityIds::ColPlatform).DefaultLabel(LOCTEXT("BuildActivity_ActivityPlatform", "Platform"))
.FillWidth(0.1f).HAlignCell(HAlign_Left).HAlignHeader(HAlign_Left).VAlignCell(VAlign_Center)
+ SHeaderRow::Column(FBuildActivityIds::ColDescription).DefaultLabel(LOCTEXT("BuildActivity_ActivityDescription", "Description"))
.FillWidth(0.6f).HAlignCell(HAlign_Left).HAlignHeader(HAlign_Center).VAlignCell(VAlign_Center)
)
];
return Panel;
}
void
SBuildActivityTableRow::Construct(const FArguments& InArgs,
const TSharedRef<STableViewBase>& InOwnerTableView,
const FBuildActivityPtr InBuildActivity,
TSharedPtr<UE::Zen::Build::FBuildServiceInstance> InBuildServiceInstance)
{
BuildActivity = InBuildActivity;
BuildServiceInstance = InBuildServiceInstance;
SMultiColumnTableRow<FBuildActivityPtr>::Construct(FSuperRowType::FArguments(), InOwnerTableView);
}
TSharedRef<SWidget>
SBuildActivityTableRow::GenerateWidgetForColumn(const FName& ColumnName)
{
using namespace UE::Zen::Build;
using namespace UE::BuildActivity::Internal;
if (ColumnName == FBuildActivityIds::ColStatus)
{
return SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
[
SNew(STextBlock).Text_Lambda([this]()
{
FString Status;
if (BuildServiceInstance)
{
switch(BuildActivity->Transfer.GetStatus())
{
case FBuildServiceInstance::EBuildTransferStatus::Invalid:
return LOCTEXT("BuildActivity_TransferStatusInvalid", "Invalid");
case FBuildServiceInstance::EBuildTransferStatus::Queued:
return LOCTEXT("BuildActivity_TransferStatusQueued", "Queued");
case FBuildServiceInstance::EBuildTransferStatus::Active:
return LOCTEXT("BuildActivity_TransferStatusActive", "Active");
case FBuildServiceInstance::EBuildTransferStatus::Failed:
return LOCTEXT("BuildActivity_TransferStatusFailed", "Failed");
case FBuildServiceInstance::EBuildTransferStatus::Canceled:
return LOCTEXT("BuildActivity_TransferStatusCanceled", "Canceled");
case FBuildServiceInstance::EBuildTransferStatus::Succeeded:
return LOCTEXT("BuildActivity_TransferStatusSucceeded", "Succeeded");
}
}
return LOCTEXT("BuildActivity_TransferStatusUnknown", "Unknown");
})
];
}
else if (ColumnName == FBuildActivityIds::ColName)
{
return SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
[
SNew(STextBlock).Text(FText::FromString(BuildActivity->Name))
];
}
else if (ColumnName == FBuildActivityIds::ColPlatform)
{
return SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
[
SNew(STextBlock).Text(FText::FromString(BuildActivity->Platform))
];
}
else if (ColumnName == FBuildActivityIds::ColDescription)
{
return SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
[
SNew(STextBlock).Text_Lambda([this]()
{
FString Description;
if (BuildServiceInstance)
{
Description = BuildActivity->Transfer.GetDescription();
}
return FText::FromString(Description);
})
];
}
return SNullWidget::NullWidget;
}
const FSlateBrush*
SBuildActivityTableRow::GetBorder() const
{
return STableRow<FBuildActivityPtr>::GetBorder();
}
FReply
SBuildActivityTableRow::OnBrowseClicked()
{
return FReply::Unhandled();
}
#undef LOCTEXT_NAMESPACE