diff --git a/Resources/Screenshot_01.png b/Resources/Screenshot_01.png index d6252cc..a7d59a9 100644 Binary files a/Resources/Screenshot_01.png and b/Resources/Screenshot_01.png differ diff --git a/Resources/Screenshot_02.png b/Resources/Screenshot_02.png index 20f750d..e871bb9 100644 Binary files a/Resources/Screenshot_02.png and b/Resources/Screenshot_02.png differ diff --git a/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp b/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp index ab3a23c..527b90c 100644 --- a/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp +++ b/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp @@ -40,94 +40,106 @@ void FMyDateTimeDetailCustomization::CustomizeHeader(TSharedRef { PropertyHandle = StructPropertyHandle; - SAssignNew(YearEntryBox, SNumericEntryBox) + SAssignNew(YearEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(1) .MaxValue(9999) .MinSliderValue(1) .MaxSliderValue(9999) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyDateTimeDetailCustomization::OnGetValue, 3) .OnValueChanged(this, &FMyDateTimeDetailCustomization::OnValueChanged, 3) .OnValueCommitted(this, &FMyDateTimeDetailCustomization::OnValueCommitted, 3) .OnBeginSliderMovement(this, &FMyDateTimeDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyDateTimeDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Years))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Years))) .LinearDeltaSensitivity(1); - SAssignNew(MonthEntryBox, SNumericEntryBox) + SAssignNew(MonthEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(1) .MaxValue(12) .MinSliderValue(1) .MaxSliderValue(12) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyDateTimeDetailCustomization::OnGetValue, 4) .OnValueChanged(this, &FMyDateTimeDetailCustomization::OnValueChanged, 4) .OnValueCommitted(this, &FMyDateTimeDetailCustomization::OnValueCommitted, 4) .OnBeginSliderMovement(this, &FMyDateTimeDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyDateTimeDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Months))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Months))) .LinearDeltaSensitivity(1); - SAssignNew(DayEntryBox, SNumericEntryBox) + SAssignNew(DayEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(1) .MaxValue(31) .MinSliderValue(1) .MaxSliderValue(31) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyDateTimeDetailCustomization::OnGetValue, 5) .OnValueChanged(this, &FMyDateTimeDetailCustomization::OnValueChanged, 5) .OnValueCommitted(this, &FMyDateTimeDetailCustomization::OnValueCommitted, 5) .OnBeginSliderMovement(this, &FMyDateTimeDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyDateTimeDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Days))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Days))) .LinearDeltaSensitivity(1); - SAssignNew(HourEntryBox, SNumericEntryBox) + SAssignNew(HourEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(0) .MaxValue(23) .MinSliderValue(0) .MaxSliderValue(23) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyDateTimeDetailCustomization::OnGetValue, 0) .OnValueChanged(this, &FMyDateTimeDetailCustomization::OnValueChanged, 0) .OnValueCommitted(this, &FMyDateTimeDetailCustomization::OnValueCommitted, 0) .OnBeginSliderMovement(this, &FMyDateTimeDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyDateTimeDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Hours))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Hours))) .LinearDeltaSensitivity(1); - SAssignNew(MinuteEntryBox, SNumericEntryBox) + SAssignNew(MinuteEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(0) .MaxValue(59) .MinSliderValue(0) .MaxSliderValue(59) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyDateTimeDetailCustomization::OnGetValue, 1) .OnValueChanged(this, &FMyDateTimeDetailCustomization::OnValueChanged, 1) .OnValueCommitted(this, &FMyDateTimeDetailCustomization::OnValueCommitted, 1) .OnBeginSliderMovement(this, &FMyDateTimeDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyDateTimeDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Minutes))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Minutes))) .LinearDeltaSensitivity(1); - SAssignNew(SecondEntryBox, SNumericEntryBox) + SAssignNew(SecondEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(0) .MaxValue(59) .MinSliderValue(0) .MaxSliderValue(59) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyDateTimeDetailCustomization::OnGetValue, 2) .OnValueChanged(this, &FMyDateTimeDetailCustomization::OnValueChanged, 2) .OnValueCommitted(this, &FMyDateTimeDetailCustomization::OnValueCommitted, 2) .OnBeginSliderMovement(this, &FMyDateTimeDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyDateTimeDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Seconds))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Seconds))) .LinearDeltaSensitivity(1); HeaderRow @@ -193,41 +205,41 @@ void FMyDateTimeDetailCustomization::CustomizeHeader(TSharedRef /* FMyDateTimeDetailCustomization callbacks *****************************************************************************/ -TOptional FMyDateTimeDetailCustomization::OnGetValue(int32 Index) const +TOptional FMyDateTimeDetailCustomization::OnGetValue(int32 Index) const { TArray RawData; PropertyHandle->AccessRawData(RawData); if (RawData.Num() != 1) - return TOptional(); + return TOptional(); if (RawData[0] == nullptr) - return TOptional(); + return TOptional(); auto* DateTime = ((FDateTime*)RawData[0]); switch (Index) { case 0: - return TOptional(DateTime->GetHour()); + return TOptional(DateTime->GetHour()); case 1: - return TOptional(DateTime->GetMinute()); + return TOptional(DateTime->GetMinute()); case 2: - return TOptional(DateTime->GetSecond()); + return TOptional(DateTime->GetSecond()); case 3: - return TOptional(DateTime->GetYear()); + return TOptional(DateTime->GetYear()); case 4: - return TOptional(DateTime->GetMonth()); + return TOptional(DateTime->GetMonth()); case 5: - return TOptional(DateTime->GetDay()); + return TOptional(DateTime->GetDay()); default: - return TOptional(); + return TOptional(); } } @@ -242,15 +254,17 @@ void FMyDateTimeDetailCustomization::OnBeginSliderMovement() ); } -void FMyDateTimeDetailCustomization::OnEndSliderMovement(int32 NewValue) +void FMyDateTimeDetailCustomization::OnEndSliderMovement(double NewValue) { bIsUsingSlider = false; GEditor->EndTransaction(); } -void FMyDateTimeDetailCustomization::OnValueCommitted(int32 NewValue, ETextCommit::Type CommitType, int32 Index) +void FMyDateTimeDetailCustomization::OnValueCommitted(double NewValue, ETextCommit::Type CommitType, int32 Index) { + NewValue = FMath::CeilToDouble(NewValue); + TArray RawData; PropertyHandle->AccessRawData(RawData); @@ -311,11 +325,13 @@ void FMyDateTimeDetailCustomization::OnValueCommitted(int32 NewValue, ETextCommi PropertyHandle->NotifyFinishedChangingProperties(); } -void FMyDateTimeDetailCustomization::OnValueChanged(int32 NewValue, int32 Index) +void FMyDateTimeDetailCustomization::OnValueChanged(double NewValue, int32 Index) { if (!bIsUsingSlider) return; + NewValue = FMath::CeilToDouble(NewValue); + TArray RawData; PropertyHandle->AccessRawData(RawData); @@ -374,9 +390,6 @@ void FMyDateTimeDetailCustomization::OnValueChanged(int32 NewValue, int32 Index) PropertyHandle->NotifyPostChange(EPropertyChangeType::ValueSet); PropertyHandle->NotifyFinishedChangingProperties(); - - //EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::InteractiveChange; - //PropertyHandle->SetValue(NewValue, Flags); } #undef LOCTEXT_NAMESPACE diff --git a/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp b/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp index 85d7e9f..b4e9f15 100644 --- a/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp +++ b/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp @@ -44,49 +44,55 @@ void FMyTimespanDetailCustomization::CustomizeHeader( { PropertyHandle = StructPropertyHandle; - SAssignNew(HourEntryBox, SNumericEntryBox) + SAssignNew(HourEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(0) .MaxValue(23) .MinSliderValue(0) .MaxSliderValue(23) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyTimespanDetailCustomization::OnGetValue, 0) .OnValueChanged(this, &FMyTimespanDetailCustomization::OnValueChanged, 0) .OnValueCommitted(this, &FMyTimespanDetailCustomization::OnValueCommitted, 0) .OnBeginSliderMovement(this, &FMyTimespanDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyTimespanDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Hours))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Hours))) .LinearDeltaSensitivity(1); - SAssignNew(MinuteEntryBox, SNumericEntryBox) + SAssignNew(MinuteEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(0) .MaxValue(59) .MinSliderValue(0) .MaxSliderValue(59) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyTimespanDetailCustomization::OnGetValue, 1) .OnValueChanged(this, &FMyTimespanDetailCustomization::OnValueChanged, 1) .OnValueCommitted(this, &FMyTimespanDetailCustomization::OnValueCommitted, 1) .OnBeginSliderMovement(this, &FMyTimespanDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyTimespanDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Minutes))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Minutes))) .LinearDeltaSensitivity(1); - SAssignNew(SecondEntryBox, SNumericEntryBox) + SAssignNew(SecondEntryBox, SNumericEntryBox) .AllowSpin(true) .MinValue(0) .MaxValue(59) .MinSliderValue(0) .MaxSliderValue(59) + .MinFractionalDigits(0) + .MaxFractionalDigits(0) .Font(IDetailLayoutBuilder::GetDetailFont()) .Value(this, &FMyTimespanDetailCustomization::OnGetValue, 2) .OnValueChanged(this, &FMyTimespanDetailCustomization::OnValueChanged, 2) .OnValueCommitted(this, &FMyTimespanDetailCustomization::OnValueCommitted, 2) .OnBeginSliderMovement(this, &FMyTimespanDetailCustomization::OnBeginSliderMovement) .OnEndSliderMovement(this, &FMyTimespanDetailCustomization::OnEndSliderMovement) - .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Seconds))) + .TypeInterface(MakeShareable(new TNumericUnitTypeInterface(EUnit::Seconds))) .LinearDeltaSensitivity(1); HeaderRow @@ -121,32 +127,32 @@ void FMyTimespanDetailCustomization::CustomizeHeader( /* FMyTimespanDetailCustomization callbacks *****************************************************************************/ -TOptional FMyTimespanDetailCustomization::OnGetValue(int32 Index) const +TOptional FMyTimespanDetailCustomization::OnGetValue(int32 Index) const { TArray RawData; PropertyHandle->AccessRawData(RawData); if (RawData.Num() != 1) - return TOptional(); + return TOptional(); if (RawData[0] == nullptr) - return TOptional(); + return TOptional(); auto* Timespan = ((FTimespan*)RawData[0]); switch (Index) { case 0: - return TOptional(Timespan->GetHours()); + return TOptional(Timespan->GetHours()); case 1: - return TOptional(Timespan->GetMinutes()); + return TOptional(Timespan->GetMinutes()); case 2: - return TOptional(Timespan->GetSeconds()); + return TOptional(Timespan->GetSeconds()); default: - return TOptional(); + return TOptional(); } } @@ -157,15 +163,17 @@ void FMyTimespanDetailCustomization::OnBeginSliderMovement() GEditor->BeginTransaction(FText::Format(NSLOCTEXT("MyTimespanDetailCustomization", "SetTimespanProperty", "Edit {0}"), PropertyHandle->GetPropertyDisplayName())); } -void FMyTimespanDetailCustomization::OnEndSliderMovement(int32 NewValue) +void FMyTimespanDetailCustomization::OnEndSliderMovement(double NewValue) { bIsUsingSlider = false; GEditor->EndTransaction(); } -void FMyTimespanDetailCustomization::OnValueCommitted(int32 NewValue, ETextCommit::Type CommitType, int32 Index) +void FMyTimespanDetailCustomization::OnValueCommitted(double NewValue, ETextCommit::Type CommitType, int32 Index) { + NewValue = FMath::CeilToDouble(NewValue); + TArray RawData; PropertyHandle->AccessRawData(RawData); @@ -202,13 +210,12 @@ void FMyTimespanDetailCustomization::OnValueCommitted(int32 NewValue, ETextCommi PropertyHandle->NotifyFinishedChangingProperties(); } -void FMyTimespanDetailCustomization::OnValueChanged(int32 NewValue, int32 Index) +void FMyTimespanDetailCustomization::OnValueChanged(double NewValue, int32 Index) { if (!bIsUsingSlider) return; - //EPropertyValueSetFlags::Type Flags = EPropertyValueSetFlags::InteractiveChange; - //PropertyHandle->SetValue(NewValue, Flags); + NewValue = FMath::CeilToDouble(NewValue); TArray RawData; diff --git a/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h b/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h index a467aa2..26ea689 100644 --- a/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h +++ b/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h @@ -36,11 +36,11 @@ public: void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; private: - TOptional OnGetValue(int32 Index) const; - void OnValueCommitted(int32 NewValue, ETextCommit::Type CommitType, int32 Index); - void OnValueChanged(int32 NewValue, int32 Index); + TOptional OnGetValue(int32 Index) const; + void OnValueCommitted(double NewValue, ETextCommit::Type CommitType, int32 Index); + void OnValueChanged(double NewValue, int32 Index); void OnBeginSliderMovement(); - void OnEndSliderMovement(int32 NewValue); + void OnEndSliderMovement(double NewValue); private: /** Holds a handle to the property being edited. */ diff --git a/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h b/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h index 0e0c76e..4cc1c4c 100644 --- a/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h +++ b/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h @@ -35,11 +35,11 @@ public: void CustomizeHeader(TSharedRef StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override; private: - TOptional OnGetValue(int32 Index) const; - void OnValueCommitted(int32 NewValue, ETextCommit::Type CommitType, int32 Index); - void OnValueChanged(int32 NewValue, int32 Index); + TOptional OnGetValue(int32 Index) const; + void OnValueCommitted(double NewValue, ETextCommit::Type CommitType, int32 Index); + void OnValueChanged(double NewValue, int32 Index); void OnBeginSliderMovement(); - void OnEndSliderMovement(int32 NewValue); + void OnEndSliderMovement(double NewValue); private: /** Holds a handle to the property being edited. */