Files
UnrealEngineUWP/Engine/Plugins/Runtime/ZoneGraph/Source/ZoneGraphEditor/Private/ZoneLaneProfileRefDetails.cpp
mieszko zielinski c019c2635f Moved GameplayBehaviors out of restricted folder over to Experimental
Moved SmartObjects out of restricted folder
Moved StateTree out of restricted folder
Moved ZoneGraph out of restricted folder
Moved ZoneGraphAnnotations out of restricted folder

#jira UE-115297

#ROBOMERGE-OWNER: mieszko.zielinski
#ROBOMERGE-AUTHOR: mieszko.zielinski
#ROBOMERGE-SOURCE: CL 17648223 via CL 17648246 via CL 17648261 via CL 17648385 via CL 17648390 via CL 17648742
#ROBOMERGE-BOT: STARSHIP (Release-Engine-Test -> Main) (v875-17642767)

[CL 17648750 by mieszko zielinski in ue5-main branch]
2021-09-28 13:33:17 -04:00

146 lines
4.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "ZoneLaneProfileRefDetails.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Images/SImage.h"
#include "DetailWidgetRow.h"
#include "DetailLayoutBuilder.h"
#include "IPropertyUtilities.h"
#include "IDetailPropertyRow.h"
#include "IDetailChildrenBuilder.h"
#include "Widgets/Input/SComboButton.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "ScopedTransaction.h"
#include "ZoneGraphSettings.h"
#include "ZoneGraphTypes.h"
#include "Modules/ModuleManager.h"
#include "ISettingsModule.h"
#include "Editor.h"
#include "ZoneGraphPropertyUtils.h"
#define LOCTEXT_NAMESPACE "ZoneGraphEditor"
TSharedRef<IPropertyTypeCustomization> FZoneLaneProfileRefDetails::MakeInstance()
{
return MakeShareable(new FZoneLaneProfileRefDetails);
}
void FZoneLaneProfileRefDetails::CustomizeHeader(TSharedRef<class IPropertyHandle> StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
StructProperty = StructPropertyHandle;
PropUtils = StructCustomizationUtils.GetPropertyUtilities().Get();
NameProperty = StructProperty->GetChildHandle(TEXT("Name"));
IDProperty = StructProperty->GetChildHandle(TEXT("ID"));
HeaderRow
.NameContent()
[
StructPropertyHandle->CreatePropertyNameWidget()
]
.ValueContent()
[
SNew(SComboButton)
.OnGetMenuContent(this, &FZoneLaneProfileRefDetails::OnGetProfileContent)
.ContentPadding(FMargin(6.0f, 2.0f))
.ButtonContent()
[
SNew(STextBlock)
.Text(this, &FZoneLaneProfileRefDetails::GetCurrentProfileDesc)
.Font(IDetailLayoutBuilder::GetDetailFont())
]
];
}
void FZoneLaneProfileRefDetails::CustomizeChildren(TSharedRef<class IPropertyHandle> StructPropertyHandle, class IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
}
void FZoneLaneProfileRefDetails::OnProfileComboChange(int32 Idx)
{
const UZoneGraphSettings* ZoneGraphSettings = GetDefault<UZoneGraphSettings>();
if (Idx == -1)
{
// Goto settings to create new Profile
FModuleManager::LoadModuleChecked<ISettingsModule>("Settings").ShowViewer(ZoneGraphSettings->GetContainerName(), ZoneGraphSettings->GetCategoryName(), ZoneGraphSettings->GetSectionName());
return;
}
const TArray<FZoneLaneProfile>& LaneProfiles = ZoneGraphSettings->GetLaneProfiles();
if (Idx >= 0 && Idx < LaneProfiles.Num())
{
const FZoneLaneProfile& LaneProfile = LaneProfiles[Idx];
FScopedTransaction Transaction(FText::Format(LOCTEXT("SetPropertyValue", "Set {0}"), StructProperty->GetPropertyDisplayName()));
if (NameProperty)
{
NameProperty->SetValue(LaneProfile.Name, EPropertyValueSetFlags::NotTransactable);
}
if (IDProperty)
{
UE::ZoneGraph::PropertyUtils::SetValue<FGuid>(IDProperty, LaneProfile.ID, EPropertyValueSetFlags::NotTransactable);
}
if (PropUtils)
{
PropUtils->ForceRefresh();
}
}
}
TSharedRef<SWidget> FZoneLaneProfileRefDetails::OnGetProfileContent() const
{
FMenuBuilder MenuBuilder(true, NULL);
const UZoneGraphSettings* ZoneGraphSettings = GetDefault<UZoneGraphSettings>();
FUIAction NewItemAction(FExecuteAction::CreateSP(const_cast<FZoneLaneProfileRefDetails*>(this), &FZoneLaneProfileRefDetails::OnProfileComboChange, -1));
MenuBuilder.AddMenuEntry(LOCTEXT("CreateOrEditLaneProfile", "Create or Edit Lane Profile..."), TAttribute<FText>(), FSlateIcon(), NewItemAction);
MenuBuilder.AddMenuSeparator();
const TArray<FZoneLaneProfile>& LaneProfiles = ZoneGraphSettings->GetLaneProfiles();
for (int32 Index = 0; Index < LaneProfiles.Num(); Index++)
{
const FZoneLaneProfile& LaneProfile = LaneProfiles[Index];
FUIAction ItemAction(FExecuteAction::CreateSP(const_cast<FZoneLaneProfileRefDetails*>(this), &FZoneLaneProfileRefDetails::OnProfileComboChange, (int)Index));
MenuBuilder.AddMenuEntry(FText::FromName(LaneProfile.Name), TAttribute<FText>(), FSlateIcon(), ItemAction);
}
return MenuBuilder.MakeWidget();
}
FText FZoneLaneProfileRefDetails::GetCurrentProfileDesc() const
{
TOptional<FGuid> ProfileIDOpt = UE::ZoneGraph::PropertyUtils::GetValue<FGuid>(IDProperty);
if (ProfileIDOpt.IsSet())
{
const FGuid ProfileID = ProfileIDOpt.GetValue();
if (ProfileID.IsValid())
{
const UZoneGraphSettings* ZoneGraphSettings = GetDefault<UZoneGraphSettings>();
const FZoneLaneProfile* LaneProfile = ZoneGraphSettings->GetLaneProfileByID(ProfileID);
if (LaneProfile)
{
return FText::FromName(LaneProfile->Name);
}
else
{
FName OldProfileName;
if (NameProperty && NameProperty->GetValue(OldProfileName) == FPropertyAccess::Success)
{
FFormatNamedArguments Args;
Args.Add(TEXT("Identifier"), FText::FromName(OldProfileName));
return FText::Format(LOCTEXT("InvalidProfile", "Invalid Profile {Identifier}"), Args);
}
}
}
else
{
return LOCTEXT("Invalid", "Invalid");
}
}
// TODO: handle multiple values
return FText();
}
#undef LOCTEXT_NAMESPACE