// 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 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 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 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 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 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()); 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("AssetTools").Get(); // Dump assets to temp text files FString OldTextFilename = AssetTools.DumpAssetToTempFile(DiffArgs.OldAsset); FString NewTextFilename = AssetTools.DumpAssetToTempFile(DiffArgs.NewAsset); FString DiffCommand = GetDefault()->TextDiffToolPath.FilePath; AssetTools.CreateDiffProcess(DiffCommand, OldTextFilename, NewTextFilename); return EAssetCommandResult::Handled; } void UAssetDefinitionDefault::GetAssetStatusInfo(const TSharedPtr& InAssetStatusInfoProvider, TArray& 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::Create(TAttribute::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetDirtyStatusVisibility, InAssetStatusInfoProvider)); OutStatusInfo.Add(DirtyStatus); FAssetDisplayInfo SCCStatus; SCCStatus.Priority = FAssetStatusPriority(EStatusSeverity::Info, 0); SCCStatus.StatusIcon = TAttribute::Create(TAttribute::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusBrush, InAssetStatusInfoProvider)); SCCStatus.StatusIconOverlay = TAttribute::Create(TAttribute::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusOverlayBrush, InAssetStatusInfoProvider)); SCCStatus.IsVisible = TAttribute::Create(TAttribute::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusVisibility, InAssetStatusInfoProvider)); SCCStatus.StatusDescription = TAttribute::Create(TAttribute::FGetter::CreateStatic(&UE::AssetDefinitionDefault::Status::GetSourceControlStatusDescription, InAssetStatusInfoProvider)); OutStatusInfo.Add(SCCStatus); } namespace UE::Editor { UThumbnailInfo* FindOrCreateThumbnailInfo(UObject* AssetObject, TSubclassOf ThumbnailClass) { if (AssetObject && ThumbnailClass) { if (const FObjectProperty* ObjectProperty = FindFProperty(AssetObject->GetClass(), "ThumbnailInfo")) { // Is the property marked as Instanced? if (ObjectProperty->HasAllPropertyFlags(CPF_PersistentInstance | CPF_ExportObject | CPF_InstancedReference)) { // Get the thumbnail. UThumbnailInfo* ThumbnailInfo = Cast(ObjectProperty->GetObjectPropertyValue_InContainer(AssetObject)); if (ThumbnailInfo && ThumbnailInfo->GetClass() == ThumbnailClass) { return ThumbnailInfo; } // We couldn't find it, need to initialize it. ThumbnailInfo = NewObject(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(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