Files
UnrealEngine/Engine/Source/Editor/UnrealEd/Private/AssetDefinitionDefault.cpp
2025-05-18 13:04:45 +08:00

222 lines
8.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AssetDefinitionDefault.h"
#include "AssetDefinitionAssetInfo.h"
#include "AssetToolsModule.h"
#include "IAssetStatusInfoProvider.h"
#include "EditorFramework/AssetImportData.h"
#include "EditorFramework/ThumbnailInfo.h"
#include "ISourceControlModule.h"
#include "ISourceControlProvider.h"
#include "Settings/EditorLoadingSavingSettings.h"
#include "Toolkits/SimpleAssetEditor.h"
#define LOCTEXT_NAMESPACE "AssetDefinitionDefault"
namespace UE::AssetDefinitionDefault::Status
{
EVisibility GetDirtyStatusVisibility(const TSharedPtr<IAssetStatusInfoProvider> InAssetStatusInfoProvider)
{
EVisibility DirtyStatusVisibility = EVisibility::Collapsed;
if (!InAssetStatusInfoProvider.IsValid())
{
return DirtyStatusVisibility;
}
if (const UPackage* Package = InAssetStatusInfoProvider->FindPackage())
{
DirtyStatusVisibility = Package->IsDirty() ? EVisibility::Visible : EVisibility::Collapsed;
}
return DirtyStatusVisibility;
}
const FSlateBrush* GetSourceControlStatusBrush(const TSharedPtr<IAssetStatusInfoProvider> InAssetStatusInfoProvider)
{
const FSlateBrush* SourceControlBrush = FAppStyle::GetNoBrush();
if (!InAssetStatusInfoProvider.IsValid())
{
return SourceControlBrush;
}
if (ISourceControlModule::Get().IsEnabled() && ISourceControlModule::Get().GetProvider().IsAvailable())
{
const FString FileName = InAssetStatusInfoProvider->TryGetFilename();
if (FSourceControlStatePtr SourceControlState = ISourceControlModule::Get().GetProvider().GetState(FileName, EStateCacheUsage::Use))
{
FSlateIcon SCCIcon = SourceControlState->GetIcon();
if (SCCIcon.IsSet())
{
SourceControlBrush = SCCIcon.GetIcon();
}
}
}
return SourceControlBrush;
}
const FSlateBrush* GetSourceControlStatusOverlayBrush(const TSharedPtr<IAssetStatusInfoProvider> InAssetStatusInfoProvider)
{
const FSlateBrush* SourceControlStatusOverlay = FAppStyle::GetNoBrush();
if (!InAssetStatusInfoProvider.IsValid())
{
return SourceControlStatusOverlay;
}
if (ISourceControlModule::Get().IsEnabled() && ISourceControlModule::Get().GetProvider().IsAvailable())
{
const FString FileName = InAssetStatusInfoProvider->TryGetFilename();
if (FSourceControlStatePtr SourceControlState = ISourceControlModule::Get().GetProvider().GetState(FileName, EStateCacheUsage::Use))
{
FSlateIcon SCCIcon = SourceControlState->GetIcon();
if (SCCIcon.IsSet())
{
SourceControlStatusOverlay = SCCIcon.GetOverlayIcon();
}
}
}
return SourceControlStatusOverlay;
}
EVisibility GetSourceControlStatusVisibility(const TSharedPtr<IAssetStatusInfoProvider> InAssetStatusInfoProvider)
{
EVisibility SourceControlStatusVisibility = EVisibility::Collapsed;
if (!InAssetStatusInfoProvider.IsValid())
{
return SourceControlStatusVisibility;
}
if (ISourceControlModule::Get().IsEnabled() && ISourceControlModule::Get().GetProvider().IsAvailable())
{
const FString FileName = InAssetStatusInfoProvider->TryGetFilename();
if (FSourceControlStatePtr SourceControlState = ISourceControlModule::Get().GetProvider().GetState(FileName, EStateCacheUsage::Use))
{
FSlateIcon SCCIcon = SourceControlState->GetIcon();
if (SCCIcon.IsSet())
{
SourceControlStatusVisibility = EVisibility::Visible;
}
}
}
return SourceControlStatusVisibility;
}
FText GetSourceControlStatusDescription(const TSharedPtr<IAssetStatusInfoProvider> InAssetStatusInfoProvider)
{
const FText SourceControlDescriptionEmpty = LOCTEXT("NoStatus", "Couldn't retrieve source control status");
FText SourceControlDescription = FText::GetEmpty();
if (!InAssetStatusInfoProvider.IsValid())
{
return SourceControlDescriptionEmpty;
}
if (ISourceControlModule::Get().IsEnabled() && ISourceControlModule::Get().GetProvider().IsAvailable())
{
const FString FileName = InAssetStatusInfoProvider->TryGetFilename();
if (FSourceControlStatePtr SourceControlState = ISourceControlModule::Get().GetProvider().GetState(FileName, EStateCacheUsage::Use))
{
// Calling this instead of GetStatusText, since that will check for warnings and won't give out a tooltip for every state unlike GetDisplayTooltip
SourceControlDescription = SourceControlState->GetDisplayTooltip();
}
}
return SourceControlDescription.IsEmpty() ? SourceControlDescriptionEmpty : SourceControlDescription;
}
}
EAssetCommandResult UAssetDefinitionDefault::OpenAssets(const FAssetOpenArgs& OpenArgs) const
{
if (GetAssetOpenSupport(FAssetOpenSupportArgs(OpenArgs.OpenMethod)).IsSupported)
{
FSimpleAssetEditor::CreateEditor(EToolkitMode::Standalone, OpenArgs.ToolkitHost, OpenArgs.LoadObjects<UObject>());
return EAssetCommandResult::Handled;
}
return EAssetCommandResult::Unhandled;
}
EAssetCommandResult UAssetDefinitionDefault::PerformAssetDiff(const FAssetDiffArgs& DiffArgs) const
{
if (DiffArgs.OldAsset == nullptr && DiffArgs.NewAsset == nullptr)
{
return EAssetCommandResult::Unhandled;
}
IAssetTools& AssetTools = FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools").Get();
// Dump assets to temp text files
FString OldTextFilename = AssetTools.DumpAssetToTempFile(DiffArgs.OldAsset);
FString NewTextFilename = AssetTools.DumpAssetToTempFile(DiffArgs.NewAsset);
FString DiffCommand = GetDefault<UEditorLoadingSavingSettings>()->TextDiffToolPath.FilePath;
AssetTools.CreateDiffProcess(DiffCommand, OldTextFilename, NewTextFilename);
return EAssetCommandResult::Handled;
}
void UAssetDefinitionDefault::GetAssetStatusInfo(const TSharedPtr<IAssetStatusInfoProvider>& InAssetStatusInfoProvider, TArray<FAssetDisplayInfo>& OutStatusInfo) const
{
FAssetDisplayInfo DirtyStatus;
DirtyStatus.StatusIcon = FAppStyle::GetBrush("ContentBrowser.ContentDirty");
DirtyStatus.Priority = FAssetStatusPriority(EStatusSeverity::Info, 5);
DirtyStatus.StatusDescription = LOCTEXT("DirtyAssetTooltip", "Asset has unsaved changes");
DirtyStatus.IsVisible = TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetDirtyStatusVisibility, InAssetStatusInfoProvider));
OutStatusInfo.Add(DirtyStatus);
FAssetDisplayInfo SCCStatus;
SCCStatus.Priority = FAssetStatusPriority(EStatusSeverity::Info, 0);
SCCStatus.StatusIcon = TAttribute<const FSlateBrush*>::Create(TAttribute<const FSlateBrush*>::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusBrush, InAssetStatusInfoProvider));
SCCStatus.StatusIconOverlay = TAttribute<const FSlateBrush*>::Create(TAttribute<const FSlateBrush*>::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusOverlayBrush, InAssetStatusInfoProvider));
SCCStatus.IsVisible = TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusVisibility, InAssetStatusInfoProvider));
SCCStatus.StatusDescription = TAttribute<FText>::Create(TAttribute<FText>::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusDescription, InAssetStatusInfoProvider));
OutStatusInfo.Add(SCCStatus);
}
namespace UE::Editor
{
UThumbnailInfo* FindOrCreateThumbnailInfo(UObject* AssetObject, TSubclassOf<UThumbnailInfo> ThumbnailClass)
{
if (AssetObject && ThumbnailClass)
{
if (const FObjectProperty* ObjectProperty = FindFProperty<FObjectProperty>(AssetObject->GetClass(), "ThumbnailInfo"))
{
// Is the property marked as Instanced?
if (ObjectProperty->HasAllPropertyFlags(CPF_PersistentInstance | CPF_ExportObject | CPF_InstancedReference))
{
// Get the thumbnail.
UThumbnailInfo* ThumbnailInfo = Cast<UThumbnailInfo>(ObjectProperty->GetObjectPropertyValue_InContainer(AssetObject));
if (ThumbnailInfo && ThumbnailInfo->GetClass() == ThumbnailClass)
{
return ThumbnailInfo;
}
// We couldn't find it, need to initialize it.
ThumbnailInfo = NewObject<UThumbnailInfo>(AssetObject, ThumbnailClass, NAME_None, RF_Transactional);
ObjectProperty->SetObjectPropertyValue_InContainer(AssetObject, ThumbnailInfo);
return ThumbnailInfo;
}
}
}
return nullptr;
}
bool TrySetExistingThumbnailInfo(UObject* InAssetObject, UThumbnailInfo* InThumbnailInfo)
{
if (InAssetObject)
{
if (const FObjectProperty* ObjectProperty = FindFProperty<FObjectProperty>(InAssetObject->GetClass(), "ThumbnailInfo"))
{
// Is the property marked as Instanced?
if (ObjectProperty->HasAllPropertyFlags(CPF_PersistentInstance | CPF_ExportObject | CPF_InstancedReference))
{
ObjectProperty->SetObjectPropertyValue_InContainer(InAssetObject, InThumbnailInfo);
return true;
}
}
}
return false;
}
}
#undef LOCTEXT_NAMESPACE