RealtimeStyleTransferRuntime/Plugins/GameSettings/Source/Private/GameSettingValueScalarDynam...

211 lines
6.8 KiB
C++
Raw Normal View History

2022-05-23 18:41:30 +00:00
// Copyright Epic Games, Inc. All Rights Reserved.
#include "GameSettingValueScalarDynamic.h"
#define LOCTEXT_NAMESPACE "GameSetting"
//////////////////////////////////////////////////////////////////////////
// SettingScalarFormats
//////////////////////////////////////////////////////////////////////////
static FText PercentFormat = LOCTEXT("PercentFormat", "{0}%");
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::Raw([](double SourceValue, double NormalizedValue) {
return FText::AsNumber(SourceValue);
});
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::RawOneDecimal([](double SourceValue, double NormalizedValue) {
FNumberFormattingOptions FormattingOptions;
FormattingOptions.MinimumIntegralDigits = 1;
FormattingOptions.MinimumFractionalDigits = 1;
FormattingOptions.MaximumFractionalDigits = 1;
return FText::AsNumber(SourceValue, &FormattingOptions);
});
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::RawTwoDecimals([](double SourceValue, double NormalizedValue) {
FNumberFormattingOptions FormattingOptions;
FormattingOptions.MinimumIntegralDigits = 1;
FormattingOptions.MinimumFractionalDigits = 2;
FormattingOptions.MaximumFractionalDigits = 2;
return FText::AsNumber(SourceValue, &FormattingOptions);
});
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::SourceAsInteger([](double SourceValue, double NormalizedValue) {
FNumberFormattingOptions FormattingOptions;
FormattingOptions.MinimumIntegralDigits = 1;
FormattingOptions.MinimumFractionalDigits = 0;
FormattingOptions.MaximumFractionalDigits = 0;
return FText::AsNumber(SourceValue, &FormattingOptions);
});
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::ZeroToOnePercent([](double SourceValue, double NormalizedValue) {
return FText::Format(PercentFormat, (int32)FMath::RoundHalfFromZero(100.0 * NormalizedValue));
});
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::ZeroToOnePercent_OneDecimal([](double SourceValue, double NormalizedValue) {
const FNumberFormattingOptions& FormattingOptions = GetOneDecimalFormattingOptions();
const double NormalizedValueTo100_0 = FMath::RoundHalfFromZero(1000.0 * NormalizedValue);
return FText::Format(PercentFormat, FText::AsNumber(NormalizedValueTo100_0 / 10.0, &FormattingOptions));
});
const FNumberFormattingOptions& UGameSettingValueScalarDynamic::GetOneDecimalFormattingOptions()
{
static FNumberFormattingOptions FormattingOptions;
FormattingOptions.MinimumFractionalDigits = 1;
FormattingOptions.MaximumFractionalDigits = 1;
return FormattingOptions;
}
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::SourceAsPercent1([](double SourceValue, double NormalizedValue) {
return FText::Format(PercentFormat, (int32)FMath::RoundHalfFromZero(100.0 * SourceValue));
});
FSettingScalarFormatFunction UGameSettingValueScalarDynamic::SourceAsPercent100([](double SourceValue, double NormalizedValue) {
return FText::Format(PercentFormat, (int32)FMath::RoundHalfFromZero(SourceValue));
});
//////////////////////////////////////////////////////////////////////////
// UGameSettingValueScalarDynamic
//////////////////////////////////////////////////////////////////////////
UGameSettingValueScalarDynamic::UGameSettingValueScalarDynamic()
{
}
void UGameSettingValueScalarDynamic::Startup()
{
// Should I also do something with Setter?
Getter->Startup(LocalPlayer, FSimpleDelegate::CreateUObject(this, &ThisClass::OnDataSourcesReady));
}
void UGameSettingValueScalarDynamic::OnDataSourcesReady()
{
StartupComplete();
}
void UGameSettingValueScalarDynamic::OnInitialized()
{
#if !UE_BUILD_SHIPPING
ensureAlwaysMsgf(DisplayFormat, TEXT("%s: Has no DisplayFormat set. Please call SetDisplayFormat."), *GetDevName().ToString());
#endif
#if !UE_BUILD_SHIPPING
ensureAlways(Getter);
ensureAlwaysMsgf(Getter->Resolve(LocalPlayer), TEXT("%s: %s did not resolve, are all functions and properties valid, and are they UFunctions/UProperties?"), *GetDevName().ToString(), *Getter->ToString());
ensureAlways(Setter);
ensureAlwaysMsgf(Setter->Resolve(LocalPlayer), TEXT("%s: %s did not resolve, are all functions and properties valid, and are they UFunctions/UProperties?"), *GetDevName().ToString(), *Setter->ToString());
#endif
Super::OnInitialized();
}
void UGameSettingValueScalarDynamic::StoreInitial()
{
InitialValue = GetValue();
}
void UGameSettingValueScalarDynamic::ResetToDefault()
{
if (DefaultValue.IsSet())
{
SetValue(DefaultValue.GetValue(), EGameSettingChangeReason::ResetToDefault);
}
}
void UGameSettingValueScalarDynamic::RestoreToInitial()
{
SetValue(InitialValue, EGameSettingChangeReason::RestoreToInitial);
}
void UGameSettingValueScalarDynamic::SetDynamicGetter(const TSharedRef<FGameSettingDataSource>& InGetter)
{
Getter = InGetter;
}
void UGameSettingValueScalarDynamic::SetDynamicSetter(const TSharedRef<FGameSettingDataSource>& InSetter)
{
Setter = InSetter;
}
void UGameSettingValueScalarDynamic::SetDefaultValue(double InValue)
{
DefaultValue = InValue;
}
void UGameSettingValueScalarDynamic::SetDisplayFormat(FSettingScalarFormatFunction InDisplayFormat)
{
DisplayFormat = InDisplayFormat;
}
void UGameSettingValueScalarDynamic::SetSourceRangeAndStep(const TRange<double>& InRange, double InStep)
{
SourceRange = InRange;
SourceStep = InStep;
}
void UGameSettingValueScalarDynamic::SetMinimumLimit(const TOptional<double>& InMinimum)
{
Minimum = InMinimum;
}
void UGameSettingValueScalarDynamic::SetMaximumLimit(const TOptional<double>& InMaximum)
{
Maximum = InMaximum;
}
double UGameSettingValueScalarDynamic::GetValue() const
{
const FString OutValue = Getter->GetValueAsString(LocalPlayer);
double Value;
LexFromString(Value, *OutValue);
return Value;
}
TRange<double> UGameSettingValueScalarDynamic::GetSourceRange() const
{
return SourceRange;
}
double UGameSettingValueScalarDynamic::GetSourceStep() const
{
return SourceStep;
}
TOptional<double> UGameSettingValueScalarDynamic::GetDefaultValue() const
{
return DefaultValue;
}
void UGameSettingValueScalarDynamic::SetValue(double InValue, EGameSettingChangeReason Reason)
{
InValue = FMath::RoundHalfFromZero(InValue / SourceStep);
InValue = InValue * SourceStep;
if (Minimum.IsSet())
{
InValue = FMath::Max(Minimum.GetValue(), InValue);
}
if (Maximum.IsSet())
{
InValue = FMath::Min(Maximum.GetValue(), InValue);
}
const FString StringValue = LexToString(InValue);
Setter->SetValue(LocalPlayer, StringValue);
NotifySettingChanged(Reason);
}
FText UGameSettingValueScalarDynamic::GetFormattedText() const
{
const double SourceValue = GetValue();
const double NormalizedValue = GetValueNormalized();
return DisplayFormat(SourceValue, NormalizedValue);
}
#undef LOCTEXT_NAMESPACE