Files
UnrealEngineUWP/Engine/Source/Editor/DetailCustomizations/Private/TimecodeDetailsCustomization.cpp
lonnie li 6abf317840 Timecode: Mark Timecode details customization read-only for non-editable properties.
#rb none
#preflight skip

#ROBOMERGE-AUTHOR: lonnie.li
#ROBOMERGE-SOURCE: CL 20469531 via CL 20469537 via CL 20469544
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v954-20466795)

[CL 20471838 by lonnie li in ue5-main branch]
2022-06-02 13:13:37 -04:00

80 lines
2.4 KiB
C++

// 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())
.IsReadOnly(!PropertyHandle->IsEditable())
];
}
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