October3d55/M/LGUI/Source/LGUIEditor/Private/DetailCustomization/UIToggleCustomization.cpp

169 lines
7.5 KiB
C++
Raw Normal View History

2025-03-10 09:43:27 +08:00
// Copyright 2019-Present LexLiu. All Rights Reserved.
#include "DetailCustomization/UIToggleCustomization.h"
#include "LGUIEditorUtils.h"
#include "Core/ActorComponent/UIItem.h"
#include "Core/Actor/UIBaseActor.h"
#include "IDetailGroup.h"
#include "Interaction/UIToggleGroupComponent.h"
#include "Interaction/UISelectableTransitionComponent.h"
#include "Interaction/UIToggleComponent.h"
#include "LGUIEditorModule.h"
#include "DetailLayoutBuilder.h"
#include "DetailCategoryBuilder.h"
#define LOCTEXT_NAMESPACE "UIToggleCustomization"
TSharedRef<IDetailCustomization> FUIToggleCustomization::MakeInstance()
{
return MakeShareable(new FUIToggleCustomization);
}
void FUIToggleCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder)
{
TArray<TWeakObjectPtr<UObject>> targetObjects;
DetailBuilder.GetObjectsBeingCustomized(targetObjects);
TargetScriptPtr = Cast<UUIToggleComponent>(targetObjects[0].Get());
if (TargetScriptPtr != nullptr)
{
}
else
{
UE_LOG(LGUIEditor, Log, TEXT("Get TargetScript is null"));
}
IDetailCategoryBuilder& category = DetailBuilder.EditCategory("LGUI-Toggle");
auto transitionHandle = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, ToggleTransition));
transitionHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &FUIToggleCustomization::ForceRefresh, &DetailBuilder));
auto toggleActorHandle = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, ToggleActor));
toggleActorHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &FUIToggleCustomization::ForceRefresh, &DetailBuilder));
UUIItem* targetUIItem = nullptr;
UUISelectableTransitionComponent* targetTweenComp = nullptr;
if (auto toggleActor = TargetScriptPtr->ToggleActor.Get())
{
targetUIItem = toggleActor->FindComponentByClass<UUIItem>();
targetTweenComp = toggleActor->FindComponentByClass<UUISelectableTransitionComponent>();
}
uint8 transitionType;
transitionHandle->GetValue(transitionType);
TArray<FName> needToHidePropertyNameForTransition;
IDetailGroup& transitionGroup = category.AddGroup(FName("Transition"), LOCTEXT("Transition", "Transition"));
transitionGroup.HeaderProperty(transitionHandle);
if (transitionType == (uint8)(UIToggleTransitionType::None))
{
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, ToggleActor));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffAlpha));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnAlpha));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffColor));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnColor));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnTransitionName));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffTransitionName));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, ToggleDuration));
}
else if (transitionType == (uint8)(UIToggleTransitionType::Fade))
{
transitionGroup.AddPropertyRow(toggleActorHandle);
if (!targetUIItem)
{
transitionGroup.AddWidgetRow()
.ValueContent()
.MinDesiredWidth(500)
[
SNew(STextBlock)
.AutoWrapText(true)
.Text(LOCTEXT("TransitionActor_Fade_Tip", "If use Fade, Target must have UIItem component"))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffColor));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnColor));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnTransitionName));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffTransitionName));
transitionGroup.AddPropertyRow(DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffAlpha)));
transitionGroup.AddPropertyRow(DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnAlpha)));
transitionGroup.AddPropertyRow(DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, ToggleDuration)));
}
else if (transitionType == (uint8)(UIToggleTransitionType::ColorTint))
{
transitionGroup.AddPropertyRow(toggleActorHandle);
if (!targetUIItem)
{
transitionGroup.AddWidgetRow()
.ValueContent()
.MinDesiredWidth(500)
[
SNew(STextBlock)
.AutoWrapText(true)
.Text(LOCTEXT("TransitionActor_ColorTint_Tip", "If use ColorTint, Target must have UIItem component"))
.ColorAndOpacity(FLinearColor(FColor::Red))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffAlpha));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnAlpha));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnTransitionName));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffTransitionName));
transitionGroup.AddPropertyRow(DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffColor)));
transitionGroup.AddPropertyRow(DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnColor)));
transitionGroup.AddPropertyRow(DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, ToggleDuration)));
}
else if (transitionType == (uint8)(UIToggleTransitionType::TransitionComponent))
{
transitionGroup.AddPropertyRow(toggleActorHandle);
if (!targetTweenComp)
{
transitionGroup.AddWidgetRow()
.ValueContent()
.MinDesiredWidth(500)
[
SNew(STextBlock)
.AutoWrapText(true)
.Text(LOCTEXT("TransitionActor_TransitionComponent_Tip", "If use TransitionComponent, Target must have UUISelectableTransitionComponent component"))
.ColorAndOpacity(FLinearColor(FColor::Red))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffAlpha));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnAlpha));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OffColor));
needToHidePropertyNameForTransition.Add(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, OnColor));
}
for (auto item : needToHidePropertyNameForTransition)
{
DetailBuilder.HideProperty(item);
}
auto groupActorHandle = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UUIToggleComponent, UIToggleGroupActor));
groupActorHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &FUIToggleCustomization::ForceRefresh, &DetailBuilder));
if (TargetScriptPtr->UIToggleGroupActor.Get())
{
auto toggleGroupComp = TargetScriptPtr->UIToggleGroupActor->FindComponentByClass<UUIToggleGroupComponent>();
if (!toggleGroupComp)
{
category.AddProperty(groupActorHandle);
category.AddCustomRow(LOCTEXT("Group", "Group"))
.ValueContent()
.MinDesiredWidth(500)
[
SNew(STextBlock)
.AutoWrapText(true)
.Text(LOCTEXT("GroupActorTip", "If use Group, Target must have UUIToggleGroupComponent"))
.ColorAndOpacity(FLinearColor(FColor::Red))
.Font(IDetailLayoutBuilder::GetDetailFont())
];
}
}
}
void FUIToggleCustomization::ForceRefresh(IDetailLayoutBuilder* DetailBuilder)
{
if (TargetScriptPtr.IsValid())
{
DetailBuilder->ForceRefreshDetails();
}
}
#undef LOCTEXT_NAMESPACE