189 lines
5.0 KiB
C++
189 lines
5.0 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "TraceTools/Widgets/SToggleTraceButton.h"
|
|
|
|
#include "Framework/Application/SlateApplication.h"
|
|
#include "Internationalization/Text.h"
|
|
#include "SlateOptMacros.h"
|
|
#include "Styling/StyleColors.h"
|
|
#include "Widgets/Images/SImage.h"
|
|
#include "Widgets/Input/SButton.h"
|
|
#include "Widgets/Layout/SBorder.h"
|
|
#include "Widgets/SBoxPanel.h"
|
|
#include "Widgets/SOverlay.h"
|
|
#include "Widgets/SBoxPanel.h"
|
|
#include "Widgets/Text/STextBlock.h"
|
|
|
|
//TraceTools
|
|
#include "Services/SessionTraceControllerFilterService.h"
|
|
#include "TraceToolsStyle.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "SToggleTraceButton"
|
|
|
|
namespace UE::TraceTools
|
|
{
|
|
|
|
SLATE_IMPLEMENT_WIDGET(SToggleTraceButton)
|
|
|
|
void SToggleTraceButton::PrivateRegisterAttributes(FSlateAttributeInitializer& AttributeInitializer)
|
|
{
|
|
SLATE_ADD_MEMBER_ATTRIBUTE_DEFINITION_WITH_NAME(AttributeInitializer, "IsTraceRunning", IsTraceRunningAttribute, EInvalidateWidgetReason::Paint);
|
|
}
|
|
|
|
SToggleTraceButton::SToggleTraceButton()
|
|
: IsTraceRunningAttribute(*this)
|
|
{
|
|
}
|
|
|
|
SToggleTraceButton::~SToggleTraceButton()
|
|
{
|
|
}
|
|
|
|
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
|
void SToggleTraceButton::Construct(const FArguments& InArgs)
|
|
{
|
|
OnToggleTraceRequested = InArgs._OnToggleTraceRequested;
|
|
IsTraceRunningAttribute.Assign(*this, InArgs._IsTraceRunning);
|
|
ButtonSize = InArgs._ButtonSize;
|
|
|
|
ChildSlot
|
|
[
|
|
SNew(SButton)
|
|
.ButtonStyle(FAppStyle::Get(), "SimpleButton")
|
|
.ContentPadding(FMargin(0.0f, 0.0f, 0.0f, 3.0f))
|
|
.HAlign(HAlign_Left)
|
|
.VAlign(VAlign_Bottom)
|
|
.ToolTipText(this, &SToggleTraceButton::GetRecordingButtonTooltipText)
|
|
.OnClicked_Lambda([this]() { this->ToggleTrace_OnClicked(); return FReply::Handled(); })
|
|
.OnHovered_Lambda([this]() { this->bIsTraceRecordButtonHovered = true; })
|
|
.OnUnhovered_Lambda([this]() { this->bIsTraceRecordButtonHovered = false; })
|
|
.Content()
|
|
[
|
|
SNew(SOverlay)
|
|
|
|
+ SOverlay::Slot()
|
|
[
|
|
SNew(SImage)
|
|
.ColorAndOpacity(this, &SToggleTraceButton::GetRecordingButtonColor)
|
|
.Image(GetToggleTraceCenterBrush())
|
|
.Visibility(this, &SToggleTraceButton::GetStartTraceIconVisibility)
|
|
]
|
|
|
|
+ SOverlay::Slot()
|
|
[
|
|
SNew(SImage)
|
|
.ColorAndOpacity(this, &SToggleTraceButton::GetRecordingButtonOutlineColor)
|
|
.Image(GetToggleTraceOutlineBrush())
|
|
.Visibility(this, &SToggleTraceButton::GetStartTraceIconVisibility)
|
|
]
|
|
|
|
+ SOverlay::Slot()
|
|
[
|
|
SNew(SImage)
|
|
.Image(GetToggleTraceStopBrush())
|
|
.Visibility(this, &SToggleTraceButton::GetStopTraceIconVisibility)
|
|
]
|
|
]
|
|
];
|
|
}
|
|
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
|
|
|
EVisibility SToggleTraceButton::GetStartTraceIconVisibility() const
|
|
{
|
|
if (GetStopTraceIconVisibility() == EVisibility::Hidden)
|
|
{
|
|
return EVisibility::Visible;
|
|
}
|
|
|
|
return EVisibility::Hidden;
|
|
}
|
|
|
|
EVisibility SToggleTraceButton::GetStopTraceIconVisibility() const
|
|
{
|
|
if (bIsTraceRecordButtonHovered && IsTraceRunningAttribute.Get())
|
|
{
|
|
return EVisibility::Visible;
|
|
}
|
|
|
|
return EVisibility::Hidden;
|
|
}
|
|
|
|
FSlateColor SToggleTraceButton::GetRecordingButtonColor() const
|
|
{
|
|
if (!IsTraceRunningAttribute.Get())
|
|
{
|
|
return FStyleColors::White;
|
|
}
|
|
|
|
return FStyleColors::Error;
|
|
}
|
|
|
|
FSlateColor SToggleTraceButton::GetRecordingButtonOutlineColor() const
|
|
{
|
|
if (!IsTraceRunningAttribute.Get())
|
|
{
|
|
ConnectionStartTime = FSlateApplication::Get().GetCurrentTime();
|
|
return FLinearColor::White.CopyWithNewOpacity(0.5f);
|
|
}
|
|
|
|
double ElapsedTime = FSlateApplication::Get().GetCurrentTime() - ConnectionStartTime;
|
|
return FStyleColors::Error.GetColor(FWidgetStyle()).CopyWithNewOpacity(0.5f + 0.5f * FMath::MakePulsatingValue(ElapsedTime, 0.5f));
|
|
}
|
|
|
|
FText SToggleTraceButton::GetRecordingButtonTooltipText() const
|
|
{
|
|
if (!IsTraceRunningAttribute.Get())
|
|
{
|
|
return LOCTEXT("StartTracing", "Start tracing. The trace destination is set from the menu.");
|
|
}
|
|
|
|
return LOCTEXT("StopTracing", "Stop Tracing.");
|
|
}
|
|
|
|
void SToggleTraceButton::ToggleTrace_OnClicked() const
|
|
{
|
|
OnToggleTraceRequested.ExecuteIfBound();
|
|
}
|
|
|
|
const FSlateBrush* SToggleTraceButton::GetToggleTraceCenterBrush() const
|
|
{
|
|
switch (ButtonSize)
|
|
{
|
|
case EButtonSize::StatusBar:
|
|
return FTraceToolsStyle::Get().GetBrush("ToggleTraceButton.RecordTraceCenter.StatusBar");
|
|
case EButtonSize::SlimToolbar:
|
|
return FTraceToolsStyle::Get().GetBrush("ToggleTraceButton.RecordTraceCenter.SlimToolbar");
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
const FSlateBrush* SToggleTraceButton::GetToggleTraceOutlineBrush() const
|
|
{
|
|
switch (ButtonSize)
|
|
{
|
|
case EButtonSize::StatusBar:
|
|
return FTraceToolsStyle::Get().GetBrush("ToggleTraceButton.RecordTraceOutline.StatusBar");
|
|
case EButtonSize::SlimToolbar:
|
|
return FTraceToolsStyle::Get().GetBrush("ToggleTraceButton.RecordTraceOutline.SlimToolbar");
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
const FSlateBrush* SToggleTraceButton::GetToggleTraceStopBrush() const
|
|
{
|
|
switch (ButtonSize)
|
|
{
|
|
case EButtonSize::StatusBar:
|
|
return FTraceToolsStyle::Get().GetBrush("ToggleTraceButton.TraceStop.StatusBar");
|
|
case EButtonSize::SlimToolbar:
|
|
return FTraceToolsStyle::Get().GetBrush("ToggleTraceButton.TraceStop.SlimToolbar");
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
} // namespace UE::TraceTools
|
|
|
|
#undef LOCTEXT_NAMESPACE |