VRTowerDef/Plugins/MetaXR/Source/OculusXREditor/Private/OculusXRSettingsToggle.cpp

203 lines
6.1 KiB
C++

// @lint-ignore-every LICENSELINT
// Copyright Epic Games, Inc. All Rights Reserved.
#include "OculusXRSettingsToggle.h"
#include "Containers/Array.h"
#include "Delegates/Delegate.h"
#include "DetailCategoryBuilder.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "Engine/ImportantToggleSettingInterface.h"
#include "Fonts/SlateFontInfo.h"
#include "HAL/PlatformProcess.h"
#include "IDetailPropertyRow.h"
#include "Layout/Children.h"
#include "Layout/Margin.h"
#include "Misc/Attribute.h"
#include "PropertyHandle.h"
#include "SlotBase.h"
#include "Styling/AppStyle.h"
#include "Styling/SlateColor.h"
#include "Styling/SlateTypes.h"
#include "Templates/Casts.h"
#include "Types/SlateEnums.h"
#include "UObject/NameTypes.h"
#include "UObject/Object.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Input/SCheckBox.h"
#include "Widgets/Input/SHyperlink.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/SCompoundWidget.h"
#include "Widgets/Text/STextBlock.h"
#define LOCTEXT_NAMESPACE "OculusXRSettingsToggle"
class SImportantToggleButton : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SImportantToggleButton)
: _Text()
{
}
SLATE_STYLE_ARGUMENT(FCheckBoxStyle, CheckBoxStyle)
SLATE_ARGUMENT(FText, Text)
SLATE_ARGUMENT(FText, ToolTipText)
SLATE_ATTRIBUTE(bool, IsSet)
SLATE_EVENT(FSimpleDelegate, OnToggled)
SLATE_END_ARGS()
void Construct(const FArguments& InArgs)
{
OnToggled = InArgs._OnToggled;
IsSetAttribute = InArgs._IsSet;
FSlateFontInfo LargeDetailsFont = IDetailLayoutBuilder::GetDetailFontBold();
LargeDetailsFont.Size += 4;
ChildSlot
[SNew(SCheckBox)
.Style(InArgs._CheckBoxStyle)
.IsChecked(this, &SImportantToggleButton::GetCheckedState)
.OnCheckStateChanged(this, &SImportantToggleButton::OnClick)
.ToolTipText(InArgs._ToolTipText)
.Padding(FMargin(16.0f, 12.0f))
.ForegroundColor(FSlateColor::UseForeground())
.IsFocusable(true)
[SNew(STextBlock)
.Text(InArgs._Text)
.Font(LargeDetailsFont)]];
}
private:
void OnClick(ECheckBoxState State)
{
OnToggled.ExecuteIfBound();
}
ECheckBoxState GetCheckedState() const
{
return IsSetAttribute.Get() ? ECheckBoxState::Checked : ECheckBoxState::Unchecked;
}
private:
TAttribute<bool> IsSetAttribute;
FSimpleDelegate OnToggled;
};
TSharedRef<IDetailCustomization> FOculusXRSettingsToggle::MakeInstance()
{
return MakeShareable(new FOculusXRSettingsToggle);
}
void FOculusXRSettingsToggle::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
TArray<TWeakObjectPtr<UObject>> Objects;
DetailBuilder.GetObjectsBeingCustomized(Objects);
if (Objects.Num() == 1)
{
ToggleSettingObject = Objects[0];
IImportantToggleSettingInterface* ToggleSettingInterface = Cast<IImportantToggleSettingInterface>(ToggleSettingObject.Get());
if (ToggleSettingInterface != nullptr)
{
FName CategoryName;
FName PropertyName;
ToggleSettingInterface->GetToggleCategoryAndPropertyNames(CategoryName, PropertyName);
IDetailCategoryBuilder& Category = DetailBuilder.EditCategory(CategoryName);
TogglePropertyHandle = DetailBuilder.GetProperty(PropertyName);
FSlateFontInfo StateDescriptionFont = IDetailLayoutBuilder::GetDetailFont();
StateDescriptionFont.Size += 4;
// Customize collision section
Category.InitiallyCollapsed(false)
.AddProperty(TogglePropertyHandle)
.ShouldAutoExpand(true)
.CustomWidget()
[SNew(SVerticalBox)
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(0.0f, 12.0f, 0.0f, 0.0f)
[SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.AutoWidth()
[SNew(SImportantToggleButton)
.CheckBoxStyle(FAppStyle::Get(), "Property.ToggleButton.Start")
.Text(ToggleSettingInterface->GetFalseStateLabel())
.ToolTipText(ToggleSettingInterface->GetFalseStateTooltip())
.IsSet(this, &FOculusXRSettingsToggle::IsToggleValue, false)
.OnToggled(this, &FOculusXRSettingsToggle::OnToggledTo, false)]
+ SHorizontalBox::Slot()
.AutoWidth()
[SNew(SImportantToggleButton)
.CheckBoxStyle(FAppStyle::Get(), "Property.ToggleButton.End")
.Text(ToggleSettingInterface->GetTrueStateLabel())
.ToolTipText(ToggleSettingInterface->GetTrueStateTooltip())
.IsSet(this, &FOculusXRSettingsToggle::IsToggleValue, true)
.OnToggled(this, &FOculusXRSettingsToggle::OnToggledTo, true)]
+ SHorizontalBox::Slot()
.HAlign(HAlign_Right)
.Padding(0.0f, 12.0f)
[SNew(SVerticalBox)
+ SVerticalBox::Slot()
.VAlign(VAlign_Center)
[SNew(SHyperlink)
.Text(ToggleSettingInterface->GetAdditionalInfoUrlLabel())
.OnNavigate(this, &FOculusXRSettingsToggle::OnNavigateHyperlink, ToggleSettingInterface->GetAdditionalInfoUrl())]]]
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(0.0f, 12.0f)
[SNew(STextBlock)
.AutoWrapText(true)
.Text(this, &FOculusXRSettingsToggle::GetDescriptionText)
.Font(StateDescriptionFont)]];
}
}
}
bool FOculusXRSettingsToggle::IsToggleValue(bool bValue) const
{
bool bPropertyValue = false;
TogglePropertyHandle->GetValue(bPropertyValue);
return bPropertyValue == bValue;
}
void FOculusXRSettingsToggle::OnToggledTo(bool bSetTo)
{
TogglePropertyHandle->SetValue(bSetTo);
}
void FOculusXRSettingsToggle::OnNavigateHyperlink(FString Url)
{
FPlatformProcess::LaunchURL(*Url, nullptr, nullptr);
}
FText FOculusXRSettingsToggle::GetDescriptionText() const
{
IImportantToggleSettingInterface* ToogleSettingInterface = Cast<IImportantToggleSettingInterface>(ToggleSettingObject.Get());
if (ToogleSettingInterface != nullptr)
{
bool bPropertyValue = false;
TogglePropertyHandle->GetValue(bPropertyValue);
if (bPropertyValue)
{
return ToogleSettingInterface->GetTrueStateDescription();
}
else
{
return ToogleSettingInterface->GetFalseStateDescription();
}
}
return FText::GetEmpty();
}
#undef LOCTEXT_NAMESPACE