Files
UnrealEngineUWP/Engine/Source/Editor/DetailCustomizations/Private/FrameRateCustomization.cpp
Francis Hurteau 57c677da93 Copying //UE4/Dev-Enterprise@4705006 to Dev-Main (//UE4/Dev-Main)
#rb none
#lockdown Nick.Penwarden

[CL 4705151 by Francis Hurteau in Main branch]
2019-01-10 17:26:53 -05:00

116 lines
3.2 KiB
C++

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#include "FrameRateCustomization.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/SFrameRatePicker.h"
#include "IPropertyUtilities.h"
#include "IPropertyTypeCustomization.h"
#include "PropertyHandle.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "IDetailChildrenBuilder.h"
#include "Misc/FrameRate.h"
#include "Editor.h"
#define LOCTEXT_NAMESPACE "FrameRateCustomization"
TSharedRef<IPropertyTypeCustomization> FFrameRateCustomization::MakeInstance()
{
return MakeShareable(new FFrameRateCustomization);
}
void FFrameRateCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> InPropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils)
{
StructPropertyHandle = InPropertyHandle;
}
void FFrameRateCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> InPropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils)
{
TSharedPtr<IPropertyUtilities> PropertyUtils = CustomizationUtils.GetPropertyUtilities();
FDetailWidgetRow& CustomRow = ChildBuilder.AddCustomRow(StructPropertyHandle->GetPropertyDisplayName());
CustomRow.NameContent()
[
StructPropertyHandle->CreatePropertyNameWidget()
];
CustomRow.ValueContent()
[
SNew(SFrameRatePicker)
.Font(CustomizationUtils.GetRegularFont())
.HasMultipleValues(this, &FFrameRateCustomization::HasMultipleValues)
.Value(this, &FFrameRateCustomization::GetFirstFrameRate)
.OnValueChanged(this, &FFrameRateCustomization::SetFrameRate)
].IsEnabled(MakeAttributeLambda([=] { return !InPropertyHandle->IsEditConst() && PropertyUtils->IsPropertyEditingEnabled(); }));
}
FFrameRate FFrameRateCustomization::GetFirstFrameRate() const
{
TArray<const void*> RawData;
StructPropertyHandle->AccessRawData(RawData);
for (const void* RawPtr : RawData)
{
if (RawPtr)
{
return *reinterpret_cast<const FFrameRate*>(RawPtr);
}
}
return FFrameRate();
}
void FFrameRateCustomization::SetFrameRate(FFrameRate NewFrameRate)
{
if (UStructProperty* StructProperty = Cast<UStructProperty>(StructPropertyHandle->GetProperty()))
{
TArray<void*> RawData;
StructPropertyHandle->AccessRawData(RawData);
FFrameRate* PreviousFrameRate = reinterpret_cast<FFrameRate*>(RawData[0]);
FString TextValue;
StructProperty->Struct->ExportText(TextValue, &NewFrameRate, PreviousFrameRate, nullptr, EPropertyPortFlags::PPF_None, nullptr);
ensure(StructPropertyHandle->SetValueFromFormattedString(TextValue, EPropertyValueSetFlags::DefaultFlags) == FPropertyAccess::Result::Success);
}
}
bool FFrameRateCustomization::HasMultipleValues() const
{
TArray<const void*> RawData;
StructPropertyHandle->AccessRawData(RawData);
TOptional<FFrameRate> CompareAgainst;
for (const void* RawPtr : RawData)
{
if (RawPtr == nullptr)
{
if (CompareAgainst.IsSet())
{
return false;
}
}
else
{
FFrameRate ThisRate = *reinterpret_cast<const FFrameRate*>(RawPtr);
if (!CompareAgainst.IsSet())
{
CompareAgainst = ThisRate;
}
else if (ThisRate != CompareAgainst.GetValue())
{
return true;
}
}
}
return false;
}
#undef LOCTEXT_NAMESPACE