// 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 SBuildActivity::GenerateBuildActivityRow(FBuildActivityPtr InItem, const TSharedRef& InOwningTable) { return SNew(SBuildActivityTableRow, InOwningTable, InItem, BuildServiceInstance.Get()); } TSharedRef SBuildActivity::GetGridPanel() { using namespace UE::BuildActivity::Internal; TSharedRef 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) .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& InOwnerTableView, const FBuildActivityPtr InBuildActivity, TSharedPtr InBuildServiceInstance) { BuildActivity = InBuildActivity; BuildServiceInstance = InBuildServiceInstance; SMultiColumnTableRow::Construct(FSuperRowType::FArguments(), InOwnerTableView); } TSharedRef 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::GetBorder(); } FReply SBuildActivityTableRow::OnBrowseClicked() { return FReply::Unhandled(); } #undef LOCTEXT_NAMESPACE