128 lines
3.8 KiB
C++
128 lines
3.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "PreviewProfileController.h"
|
|
|
|
#include "Editor/EditorPerProjectUserSettings.h"
|
|
#include "AssetViewerSettings.h"
|
|
|
|
FPreviewProfileController::FPreviewProfileController()
|
|
{
|
|
PerProjectSettings = GetMutableDefault<UEditorPerProjectUserSettings>();
|
|
if (PerProjectSettings)
|
|
{
|
|
AssetViewerSettings = UAssetViewerSettings::Get();
|
|
if (AssetViewerSettings)
|
|
{
|
|
AssetViewerSettingsProfileAddRemoveHandle = AssetViewerSettings->OnAssetViewerProfileAddRemoved().AddLambda([this]()
|
|
{
|
|
UpdateAssetViewerProfiles();
|
|
OnPreviewProfileListChanged().Broadcast();
|
|
});
|
|
|
|
AssetViewerSettingsChangedHandle = AssetViewerSettings->OnAssetViewerSettingsChanged().AddLambda([this](const FName& InPropertyName)
|
|
{
|
|
FString CurrProfileName = AssetViewerProfileNames[CurrentProfileIndex];
|
|
UpdateAssetViewerProfiles();
|
|
if (CurrProfileName != AssetViewerProfileNames[CurrentProfileIndex])
|
|
{
|
|
OnPreviewProfileChanged().Broadcast();
|
|
}
|
|
});
|
|
|
|
UpdateAssetViewerProfiles();
|
|
}
|
|
}
|
|
}
|
|
|
|
FPreviewProfileController::~FPreviewProfileController()
|
|
{
|
|
if (IsValid(AssetViewerSettings))
|
|
{
|
|
AssetViewerSettings->OnAssetViewerProfileAddRemoved().Remove(AssetViewerSettingsProfileAddRemoveHandle);
|
|
AssetViewerSettings->OnAssetViewerSettingsChanged().Remove(AssetViewerSettingsChangedHandle);
|
|
}
|
|
}
|
|
|
|
void FPreviewProfileController::UpdateAssetViewerProfiles()
|
|
{
|
|
AssetViewerProfileNames.Empty();
|
|
|
|
if (AssetViewerSettings && PerProjectSettings)
|
|
{
|
|
// Rebuild the profile list.
|
|
for (const FPreviewSceneProfile& Profile : AssetViewerSettings->Profiles)
|
|
{
|
|
AssetViewerProfileNames.Add(Profile.ProfileName);
|
|
}
|
|
|
|
CurrentProfileIndex = PerProjectSettings->AssetViewerProfileIndex;
|
|
|
|
EnsureProfilesStateCoherence();
|
|
}
|
|
}
|
|
|
|
TArray<FString> FPreviewProfileController::GetPreviewProfiles(int32& OutCurrentProfileIndex) const
|
|
{
|
|
if (PerProjectSettings && AssetViewerSettings)
|
|
{
|
|
EnsureProfilesStateCoherence();
|
|
OutCurrentProfileIndex = CurrentProfileIndex;
|
|
}
|
|
return AssetViewerProfileNames;
|
|
}
|
|
|
|
bool FPreviewProfileController::SetActiveProfile(const FString& ProfileName)
|
|
{
|
|
if (IsValid(PerProjectSettings) && IsValid(AssetViewerSettings))
|
|
{
|
|
EnsureProfilesStateCoherence();
|
|
|
|
int32 Index = AssetViewerProfileNames.IndexOfByKey(ProfileName);
|
|
if (Index != INDEX_NONE && Index != PerProjectSettings->AssetViewerProfileIndex)
|
|
{
|
|
// Store the settings.
|
|
PerProjectSettings->AssetViewerProfileIndex = Index;
|
|
CurrentProfileIndex = Index;
|
|
|
|
// Notify the observer about the change.
|
|
AssetViewerSettings->OnAssetViewerSettingsChanged().Broadcast(GET_MEMBER_NAME_CHECKED(FPreviewSceneProfile, ProfileName));
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
FString FPreviewProfileController::GetActiveProfile() const
|
|
{
|
|
if (PerProjectSettings && AssetViewerSettings)
|
|
{
|
|
EnsureProfilesStateCoherence();
|
|
return AssetViewerProfileNames[PerProjectSettings->AssetViewerProfileIndex];
|
|
}
|
|
return FString();
|
|
}
|
|
|
|
bool FPreviewProfileController::HasAnyUserProfiles() const
|
|
{
|
|
if (AssetViewerSettings)
|
|
{
|
|
for (const FPreviewSceneProfile& Profile : AssetViewerSettings->Profiles)
|
|
{
|
|
if (!Profile.bIsEngineDefaultProfile)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void FPreviewProfileController::EnsureProfilesStateCoherence() const
|
|
{
|
|
ensureMsgf(AssetViewerProfileNames.Num() == AssetViewerSettings->Profiles.Num(), TEXT("List of profiles is out of sync with the list of corresponding profile names."));
|
|
ensureMsgf(AssetViewerProfileNames.Num() > 0, TEXT("The list of profiles is expected to always have at least one default profile"));
|
|
ensureMsgf(AssetViewerSettings->Profiles.IsValidIndex(PerProjectSettings->AssetViewerProfileIndex), TEXT("The active asset viewer profile is invalid."));
|
|
ensureMsgf(CurrentProfileIndex == PerProjectSettings->AssetViewerProfileIndex, TEXT("The cached selected profile index is out of sync."));
|
|
}
|