EM_Task/UnrealEd/Private/Dialogs/SBuildProgress.cpp
Boshuang Zhao 5144a49c9b add
2026-02-13 16:18:33 +08:00

133 lines
4.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Dialogs/SBuildProgress.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/Notifications/SProgressBar.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Input/SButton.h"
#include "EditorStyleSet.h"
#include "UnrealEdMisc.h"
SBuildProgressWidget::SBuildProgressWidget()
{
}
SBuildProgressWidget::~SBuildProgressWidget()
{
}
void SBuildProgressWidget::Construct(const FArguments& InArgs)
{
BorderImage = FInvalidatableBrushAttribute(FEditorStyle::GetBrush("Menu.Background"));
this->ChildSlot
.VAlign(VAlign_Center)
[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().HAlign(HAlign_Fill).Padding(10.0f, 4.0f)[SNew(SBorder)[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().HAlign(HAlign_Fill).Padding(10.0f, 4.0f)[SNew(STextBlock).Text(NSLOCTEXT("BuildProgress", "BuildStatusLabel", "Build Status")).ShadowOffset(FVector2D(1.0f, 1.0f))] + SVerticalBox::Slot().AutoHeight().HAlign(HAlign_Fill).Padding(10.0f, 4.0f)[SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth().Padding(0, 7.0f)[SNew(STextBlock).Text(this, &SBuildProgressWidget::OnGetBuildTimeText).ShadowOffset(FVector2D(1.0f, 1.0f))] + SHorizontalBox::Slot().AutoWidth().Padding(10.0f, 7.0f, 10.0f, 7.0f)[SNew(STextBlock).Text(this, &SBuildProgressWidget::OnGetProgressText).ShadowOffset(FVector2D(1.0f, 1.0f))]]]] + SVerticalBox::Slot().AutoHeight().HAlign(HAlign_Fill).Padding(10.0f, 1.0f)[SNew(SBorder)[SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().HAlign(HAlign_Fill).Padding(10.0f, 4.0f)[SNew(STextBlock).Text(NSLOCTEXT("BuildProgress", "BuildProgressLabel", "Build Progress")).ShadowOffset(FVector2D(1.0f, 1.0f))] + SVerticalBox::Slot().AutoHeight().HAlign(HAlign_Fill).Padding(10.0f, 7.0f, 10.0f, 7.0f)[SNew(SProgressBar).Percent(this, &SBuildProgressWidget::OnGetProgressFraction)]]
] + SVerticalBox::Slot().AutoHeight().Padding(15.0f, 4.0f).HAlign(HAlign_Center)[SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth()[SNew(SButton).Text(NSLOCTEXT("BuildProgress", "StopBuildButtonLabel", "Stop Build")).ContentPadding(5).OnClicked(this, &SBuildProgressWidget::OnStopBuild)]]];
// Reset progress indicators
BuildStartTime = -1;
bStoppingBuild = false;
SetBuildStatusText(FText::GetEmpty());
SetBuildProgressPercent(0, 100);
}
FText SBuildProgressWidget::OnGetProgressText() const
{
return ProgressStatusText;
}
void SBuildProgressWidget::UpdateProgressText()
{
if (ProgressNumerator > 0 && ProgressDenominator > 0)
{
FFormatNamedArguments Args;
Args.Add(TEXT("StatusText"), BuildStatusText);
Args.Add(TEXT("ProgressCompletePercentage"), FText::AsPercent((float)ProgressNumerator / ProgressDenominator));
ProgressStatusText = FText::Format(NSLOCTEXT("BuildProgress", "ProgressStatusFormat", "{StatusText} ({ProgressCompletePercentage})"), Args);
}
else
{
ProgressStatusText = BuildStatusText;
}
}
FText SBuildProgressWidget::OnGetBuildTimeText() const
{
// Only show a percentage if there is something interesting to report
return BuildStatusTime;
}
TOptional<float> SBuildProgressWidget::OnGetProgressFraction() const
{
// Only show a percentage if there is something interesting to report
if (ProgressNumerator > 0 && ProgressDenominator > 0)
{
return (float)ProgressNumerator / ProgressDenominator;
}
else
{
// Return non-value to indicate marquee mode
// for the progress bar.
return TOptional<float>();
}
}
void SBuildProgressWidget::SetBuildType(EBuildType InBuildType)
{
BuildType = InBuildType;
}
FText SBuildProgressWidget::BuildElapsedTimeText() const
{
// Display elapsed build time.
return FText::AsTimespan(FDateTime::Now() - BuildStartTime);
}
void SBuildProgressWidget::UpdateTime()
{
BuildStatusTime = BuildElapsedTimeText();
}
void SBuildProgressWidget::SetBuildStatusText(const FText& StatusText)
{
UpdateTime();
// Only update the text if we haven't canceled the build.
if (!bStoppingBuild)
{
BuildStatusText = StatusText;
UpdateProgressText();
}
}
void SBuildProgressWidget::SetBuildProgressPercent(int32 InProgressNumerator, int32 InProgressDenominator)
{
UpdateTime();
// Only update the progress bar if we haven't canceled the build.
if (!bStoppingBuild)
{
ProgressNumerator = InProgressNumerator;
ProgressDenominator = InProgressDenominator;
UpdateProgressText();
}
}
void SBuildProgressWidget::MarkBuildStartTime()
{
BuildStartTime = FDateTime::Now();
}
FReply SBuildProgressWidget::OnStopBuild()
{
FUnrealEdMisc::Get().SetMapBuildCancelled(true);
SetBuildStatusText(NSLOCTEXT("UnrealEd", "StoppingMapBuild", "Stopping Map Build..."));
bStoppingBuild = true;
return FReply::Handled();
}