From cf0128db217df43a6d0f904606029a693be1004d Mon Sep 17 00:00:00 2001 From: MrRobin Date: Sat, 28 Oct 2023 20:43:30 +0200 Subject: [PATCH] Fixed the editor view --- CommonTime.uplugin | 14 +- Config/FilterPlugin.ini | 8 + README.md | 43 +- Resources/Icon128.png | Bin 12699 -> 9052 bytes .../MyDateTimeDetailCustomization.cpp | 403 +++++------------- .../MyTimespanDetailCustomization.cpp | 188 +++----- .../MyDateTimeDetailCustomization.h | 11 +- .../MyTimespanDetailCustomization.h | 4 + 8 files changed, 237 insertions(+), 434 deletions(-) create mode 100644 Config/FilterPlugin.ini diff --git a/CommonTime.uplugin b/CommonTime.uplugin index 2c23db8..ef09f70 100644 --- a/CommonTime.uplugin +++ b/CommonTime.uplugin @@ -1,20 +1,18 @@ { "FileVersion": 3, "Version": 1, - "VersionName": "1.0", + "VersionName": "0.1.0", "FriendlyName": "CommonTime", - "Description": "", + "Description": "Provides an editor view for editing DateTime and Timespan values.", "Category": "Editor", "CreatedBy": "MrRobinOfficial", "CreatedByURL": "https://github.com/MrRobinOfficial", - "DocsURL": "", + "DocsURL": "https://github.com/MrRobinOfficial/Unreal-CommonTime", "MarketplaceURL": "", - "SupportURL": "", - "EnabledByDefault": true, + "SupportURL": "https://github.com/MrRobinOfficial/Unreal-CommonTime/issues", + "EngineVersion": "5.3.0", "CanContainContent": true, - "IsBetaVersion": false, - "IsExperimentalVersion": false, - "Installed": false, + "Installed": true, "Modules": [ { "Name": "CommonTime", diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini new file mode 100644 index 0000000..ccebca2 --- /dev/null +++ b/Config/FilterPlugin.ini @@ -0,0 +1,8 @@ +[FilterPlugin] +; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and +; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. +; +; Examples: +; /README.txt +; /Extras/... +; /Binaries/ThirdParty/*.dll diff --git a/README.md b/README.md index 7240a63..3e3121e 100644 --- a/README.md +++ b/README.md @@ -1 +1,42 @@ -# Unreal-CommonTime \ No newline at end of file + +

+ CommonTime logo +

+ +

CommonTime [Unreal Engine]

+ +
+ +*Provides an editor view for editing DateTime and Timespan values.* + +[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/mrrobinofficial/unreal-commontime/blob/HEAD/LICENSE.txt) +![plugin-status](https://img.shields.io/badge/plugin_status-ready_to_use-green) +![maintenance-status](https://img.shields.io/badge/maintenance-passively--maintained-yellowgreen.svg) + +
+ +# + +## ⚙️ Supported Platforms +This plug-in was last built against Unreal Engine 5.3. + +## ⚒️ Installation + +You can install from the release section. + +Alternatively, you can install this plugin via terminal with [*git*](https://git-scm.com/). **Here is the command for installing it**. + +```console +git clone git@github.com:MrRobinOfficial/Unreal-CommonTime.git CommonTime +``` + +# + +
+

🖼️ Screenshots

+
+ +# + +## 🆘 Support +If you have any questions or issue, just write either to my [YouTube channel](https://www.youtube.com/@mrrobinofficial), [Email](mailto:mrrobin123mail@gmail.com) or [Twitter DM](https://twitter.com/MrRobinOfficial). diff --git a/Resources/Icon128.png b/Resources/Icon128.png index 1231d4aad4d0d462fb7b178eb5b30aa61a10df0b..4862a02e9aef93a768c3b10c5487542843a13ec7 100644 GIT binary patch literal 9052 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 CcN%8^ literal 12699 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 a;7#~yJh_ha>A&A^fRdb=Y>l)<=>Gxy=2LS3 diff --git a/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp b/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp index 3b15b90..ab3a23c 100644 --- a/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp +++ b/Source/CommonTime/Private/DetailCustomizations/MyDateTimeDetailCustomization.cpp @@ -18,9 +18,13 @@ #include "Widgets/DeclarativeSyntaxSupport.h" #include "DetailLayoutBuilder.h" - #include "Widgets/Input/SNumericEntryBox.h" #include "Widgets/Input/SVectorInputBox.h" +#include "Widgets/Input/NumericTypeInterface.h" +#include "Widgets/Input/NumericUnitTypeInterface.inl" +#include "Math/UnitConversion.h" + +// SExpanderArrow #define LOCTEXT_NAMESPACE "MyDateTimeDetailCustomization" @@ -36,8 +40,95 @@ void FMyDateTimeDetailCustomization::CustomizeHeader(TSharedRef { PropertyHandle = StructPropertyHandle; - const FSlateColor FgColor = FSlateColor(FColor::Yellow); - const FSlateColor BgColor = FSlateColor(FColor::Blue); + SAssignNew(YearEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(1) + .MaxValue(9999) + .MinSliderValue(1) + .MaxSliderValue(9999) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(MonthEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(1) + .MaxValue(12) + .MinSliderValue(1) + .MaxSliderValue(12) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(DayEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(1) + .MaxValue(31) + .MinSliderValue(1) + .MaxSliderValue(31) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(HourEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(0) + .MaxValue(23) + .MinSliderValue(0) + .MaxSliderValue(23) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(MinuteEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(0) + .MaxValue(59) + .MinSliderValue(0) + .MaxSliderValue(59) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(SecondEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(0) + .MaxValue(59) + .MinSliderValue(0) + .MaxSliderValue(59) + .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))) + .LinearDeltaSensitivity(1); HeaderRow .NameContent() @@ -45,273 +136,54 @@ void FMyDateTimeDetailCustomization::CustomizeHeader(TSharedRef StructPropertyHandle->CreatePropertyNameWidget() ] .ValueContent() - .MaxDesiredWidth(0.f) .MinDesiredWidth(125.0f * 3.0f) - //.HAlign(HAlign_Fill) + .MaxDesiredWidth(125.0f * 3.0f) [ SNew(SVerticalBox) + SVerticalBox::Slot() - .HAlign(HAlign_Fill) .AutoHeight() - .Padding(0.0f, 1.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() - .Padding(0.0f, 2.0f) + .Padding(0.0f, 0.0f, 2.0f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(1) - .MaxValue(9999) - .MinSliderValue(1) - .MaxSliderValue(9999) - .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) - .ToolTipText(this, &FMyDateTimeDetailCustomization::GetValueAsText, 3) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + YearEntryBox.ToSharedRef() ] + SHorizontalBox::Slot() - .Padding(3.75f, 2.0f) + .Padding(2.0f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(1) - .MaxValue(12) - .MinSliderValue(1) - .MaxSliderValue(12) - .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) - .ToolTipText(this, &FMyDateTimeDetailCustomization::GetValueAsText, 4) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + MonthEntryBox.ToSharedRef() ] + SHorizontalBox::Slot() - .Padding(0.0f, 2.0f) + .Padding(2.0f, 0.0f, 0.0f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(1) - .MaxValue(31) - .MinSliderValue(1) - .MaxSliderValue(31) - .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) - .ToolTipText(this, &FMyDateTimeDetailCustomization::GetValueAsText, 5) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + DayEntryBox.ToSharedRef() ] ] + SVerticalBox::Slot() - .HAlign(HAlign_Fill) .AutoHeight() - .Padding(0.0f, 1.0f) + [ + SNew(SSpacer) + .Size(FVector2D(8.0f)) + ] + + SVerticalBox::Slot() + .AutoHeight() [ SNew(SHorizontalBox) + SHorizontalBox::Slot() - .Padding(0.0f, 2.0f) + .Padding(0.0f, 0.0f, 2.0f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(0) - .MaxValue(23) - .MinSliderValue(0) - .MaxSliderValue(23) - .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) - .ToolTipText(this, &FMyDateTimeDetailCustomization::GetValueAsText, 0) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + HourEntryBox.ToSharedRef() ] + SHorizontalBox::Slot() - .Padding(3.75f, 2.0f) + .Padding(2.0f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(0) - .MaxValue(59) - .MinSliderValue(0) - .MaxSliderValue(59) - .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) - .ToolTipText(this, &FMyDateTimeDetailCustomization::GetValueAsText, 1) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + MinuteEntryBox.ToSharedRef() ] + SHorizontalBox::Slot() - .Padding(0.0f, 2.0f) + .Padding(2.0f, 0.0f, 0.0f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(0) - .MaxValue(59) - .MinSliderValue(0) - .MaxSliderValue(59) - .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) - .ToolTipText(this, &FMyDateTimeDetailCustomization::GetValueAsText, 2) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + SecondEntryBox.ToSharedRef() ] ] ]; @@ -359,55 +231,6 @@ TOptional FMyDateTimeDetailCustomization::OnGetValue(int32 Index) const } } -FText FMyDateTimeDetailCustomization::GetValueAsText(int32 Index) const -{ - const TOptional& Value = OnGetValue(Index); - - FFormatNamedArguments Args; - - switch (Index) - { - case 0: - Args.Add(TEXT("Key"), INVTEXT("Hour")); - Args.Add(TEXT("Desc"), INVTEXT("A hour between 0-23")); - break; - - case 1: - Args.Add(TEXT("Key"), INVTEXT("Minute")); - Args.Add(TEXT("Desc"), INVTEXT("A minute between 0-59")); - break; - - case 2: - Args.Add(TEXT("Key"), INVTEXT("Second")); - Args.Add(TEXT("Desc"), INVTEXT("A second between 0-59")); - break; - - case 3: - Args.Add(TEXT("Key"), INVTEXT("Year")); - Args.Add(TEXT("Desc"), INVTEXT("A year between 1-9999")); - break; - - case 4: - Args.Add(TEXT("Key"), INVTEXT("Month")); - Args.Add(TEXT("Desc"), INVTEXT("A month between 1-12")); - break; - - case 5: - Args.Add(TEXT("Key"), INVTEXT("Day")); - Args.Add(TEXT("Desc"), INVTEXT("A day between 1-31")); - break; - } - - - if (Value.IsSet() == true) - { - Args.Add(TEXT("Value"), Value.GetValue()); - return FText::Format(LOCTEXT("DateTime", "{Key}: {Value} - {Desc}"), Args); - } - - return FText::Format(LOCTEXT("DateTime", "{Key} - {Desc}"), Args); -} - void FMyDateTimeDetailCustomization::OnBeginSliderMovement() { bIsUsingSlider = true; diff --git a/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp b/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp index 253b0ab..85d7e9f 100644 --- a/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp +++ b/Source/CommonTime/Private/DetailCustomizations/MyTimespanDetailCustomization.cpp @@ -19,6 +19,10 @@ #include "DetailLayoutBuilder.h" #include "Widgets/Input/SNumericEntryBox.h" +#include "Widgets/Input/SVectorInputBox.h" +#include "Widgets/Input/NumericTypeInterface.h" +#include "Widgets/Input/NumericUnitTypeInterface.inl" +#include "Math/UnitConversion.h" #define LOCTEXT_NAMESPACE "MyTimespanDetailCustomization" @@ -40,155 +44,75 @@ void FMyTimespanDetailCustomization::CustomizeHeader( { PropertyHandle = StructPropertyHandle; + SAssignNew(HourEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(0) + .MaxValue(23) + .MinSliderValue(0) + .MaxSliderValue(23) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(MinuteEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(0) + .MaxValue(59) + .MinSliderValue(0) + .MaxSliderValue(59) + .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))) + .LinearDeltaSensitivity(1); + + SAssignNew(SecondEntryBox, SNumericEntryBox) + .AllowSpin(true) + .MinValue(0) + .MaxValue(59) + .MinSliderValue(0) + .MaxSliderValue(59) + .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))) + .LinearDeltaSensitivity(1); + HeaderRow .NameContent() [ StructPropertyHandle->CreatePropertyNameWidget() ] .ValueContent() - .MaxDesiredWidth(0.f) .MinDesiredWidth(125.0f * 3.0f) - //.HAlign(HAlign_Fill) + .MaxDesiredWidth(125.0f * 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() - .Padding(0.0f, 2.0f) + .Padding(0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(0) - .MaxValue(23) - .MinSliderValue(0) - .MaxSliderValue(23) - .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) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ - - //SNew(SNumericEntryBox) - // .AllowSpin(true) - // .Font(IDetailLayoutBuilder::GetDetailFont()) - // .Value(this, &FMyTimespanDetailCustomization::OnGetValue, 0) - // .MinValue(0) - // .MaxValue(23) - // .MinSliderValue(0) - // .MaxSliderValue(23) - // .LabelPadding(FMargin(3.f)) - // .LabelLocation(SNumericEntryBox::ELabelLocation::Inside) - // .UndeterminedString(NSLOCTEXT("PropertyEditor", "MultipleValues", "Multiple Values")) - // .OnValueCommitted(const_cast(this),&FMyTimespanDetailCustomization::OnValueCommitted, 0) - // .OnValueChanged(const_cast(this),&FMyTimespanDetailCustomization::OnValueChanged, 0) - // .OnBeginSliderMovement(const_cast(this), &FMyTimespanDetailCustomization::OnBeginSliderMovement) - // .OnEndSliderMovement(const_cast(this), &FMyTimespanDetailCustomization::OnEndSliderMovement) + HourEntryBox.ToSharedRef() ] + SHorizontalBox::Slot() - .Padding(3.75f, 2.0f) + .Padding(2.5f, 0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(0) - .MaxValue(59) - .MinSliderValue(0) - .MaxSliderValue(59) - .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) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + MinuteEntryBox.ToSharedRef() ] + SHorizontalBox::Slot() - .Padding(0.0f, 2.0f) + .Padding(0.0f) [ - SNew(SNumericEntryBox) - .AllowSpin(true) - .MinValue(0) - .MaxValue(59) - .MinSliderValue(0) - .MaxSliderValue(59) - .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) - //.OnValueChanged(CreatePerComponentChanged(ComponentIndex, OnComponentChanged, InArgs._ConstrainVector)) - //.OnValueCommitted(CreatePerComponentCommitted(ComponentIndex, OnComponentCommitted, InArgs._ConstrainVector)) - //.ToolTipText(MakeAttributeLambda([Value, TooltipText] - //{ - // if (Value.Get().IsSet()) - // { - // return FText::Format(TooltipText, Value.Get().GetValue()); - // } - // return NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values"); - //})) - //.UndeterminedString(NSLOCTEXT("SVectorInputBox", "MultipleValues", "Multiple Values")) - //.ContextMenuExtender(OnContextMenuExtenderComponent) - //.TypeInterface(InArgs._TypeInterface) - //.MinValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinVector)) - //.MaxValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxVector)) - //.MinSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MinSliderVector)) - //.MaxSliderValue(CreatePerComponentGetter(ComponentIndex, TOptional(), InArgs._MaxSliderVector)) - .LinearDeltaSensitivity(1) - /*.Delta(InArgs._SpinDelta)*/ - /*.OnBeginSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnBeginSliderMovement, OnComponentBeginSliderMovement))*/ - /*.OnEndSliderMovement(CreatePerComponentSliderMovementEvent(InArgs._OnEndSliderMovement, OnComponentEndSliderMovement))*/ - /*.DisplayToggle(InArgs._DisplayToggle) - .TogglePadding(InArgs._TogglePadding) - .ToggleChecked(ToggleChecked) - .OnToggleChanged(OnToggleChanged)*/ + SecondEntryBox.ToSharedRef() ] ]; } diff --git a/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h b/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h index 0a59a44..a467aa2 100644 --- a/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h +++ b/Source/CommonTime/Public/DetailCustomizations/MyDateTimeDetailCustomization.h @@ -12,7 +12,7 @@ class IPropertyHandle; class SEditableTextBox; /** - * Implements a details view customization for the FTimespan structure. + * Implements a details view customization for the FDateTime structure. */ class FMyDateTimeDetailCustomization : public IPropertyTypeCustomization @@ -37,8 +37,6 @@ public: private: TOptional OnGetValue(int32 Index) const; - /** @return the value being observed by the Numeric Entry Box as a FText */ - FText GetValueAsText(int32 Index) const; void OnValueCommitted(int32 NewValue, ETextCommit::Type CommitType, int32 Index); void OnValueChanged(int32 NewValue, int32 Index); void OnBeginSliderMovement(); @@ -50,4 +48,11 @@ private: /** True if a value is being changed by dragging a slider */ bool bIsUsingSlider; + + TSharedPtr YearEntryBox; + TSharedPtr MonthEntryBox; + TSharedPtr DayEntryBox; + TSharedPtr HourEntryBox; + TSharedPtr MinuteEntryBox; + TSharedPtr SecondEntryBox; }; diff --git a/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h b/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h index f3fd509..0e0c76e 100644 --- a/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h +++ b/Source/CommonTime/Public/DetailCustomizations/MyTimespanDetailCustomization.h @@ -47,4 +47,8 @@ private: /** True if a value is being changed by dragging a slider */ bool bIsUsingSlider; + + TSharedPtr HourEntryBox; + TSharedPtr MinuteEntryBox; + TSharedPtr SecondEntryBox; };