Files
UnrealEngineUWP/Engine/Source/Editor/DetailCustomizations/Private/TimecodeDetailsCustomization.cpp

79 lines
2.3 KiB
C++
Raw Normal View History

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TimecodeDetailsCustomization.h"
#include "Misc/Timecode.h"
#include "IDetailPropertyRow.h"
#include "IDetailChildrenBuilder.h"
#include "DetailLayoutBuilder.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Input/SEditableTextBox.h"
#include "PropertyCustomizationHelpers.h"
#define LOCTEXT_NAMESPACE "Timecode"
void FTimecodeDetailsCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> PropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils)
{
TimecodeProperty = PropertyHandle;
ChildBuilder.AddCustomRow(LOCTEXT("TimecodeLabel", "Timecode"))
.NameContent()
[
SNew(STextBlock)
.Text(PropertyHandle->GetPropertyDisplayName())
.ToolTipText(LOCTEXT("TimecodeLabelTooltip", "Timecode"))
.Font(CustomizationUtils.GetRegularFont())
]
.ValueContent()
[
SNew(SEditableTextBox)
.Text(this, &FTimecodeDetailsCustomization::OnGetTimecodeText)
.OnTextCommitted(this, &FTimecodeDetailsCustomization::OnTimecodeTextCommitted)
.SelectAllTextWhenFocused(true)
.RevertTextOnEscape(true)
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
FText FTimecodeDetailsCustomization::OnGetTimecodeText() const
{
TArray<void*> RawData;
TimecodeProperty->AccessRawData(RawData);
if (RawData.Num())
{
FString CurrentValue = ((FTimecode*)RawData[0])->ToString();
return FText::FromString(CurrentValue);
}
return FText::GetEmpty();
}
void FTimecodeDetailsCustomization::OnTimecodeTextCommitted(const FText& InText, ETextCommit::Type CommitInfo)
{
TArray<void*> RawData;
TimecodeProperty->AccessRawData(RawData);
if (RawData.Num())
{
TArray<FString> Splits;
InText.ToString().ParseIntoArray(Splits, TEXT(":"));
if (Splits.Num() == 4)
{
TimecodeProperty->NotifyPreChange();
((FTimecode*)RawData[0])->Hours = FCString::Atoi(*Splits[0]);
((FTimecode*)RawData[0])->Minutes = FCString::Atoi(*Splits[1]);
((FTimecode*)RawData[0])->Seconds = FCString::Atoi(*Splits[2]);
((FTimecode*)RawData[0])->Frames = FCString::Atoi(*Splits[3]);
TimecodeProperty->NotifyPostChange(EPropertyChangeType::ValueSet);
TimecodeProperty->NotifyFinishedChangingProperties();
}
else
{
UE_LOG(LogTemp, Error, TEXT("Unexpected timecode format. Expected 4 values, got %d"), Splits.Num());
}
}
}
#undef LOCTEXT_NAMESPACE