// Copyright Epic Games, Inc. All Rights Reserved. #include "SSearchTreeRow.h" #include "Engine/Blueprint.h" #include "SearchModel.h" #include "IAssetTools.h" #include "Styling/SlateIconFinder.h" #include "AssetToolsModule.h" #include "IAssetTypeActions.h" #include "Kismet2/KismetEditorUtilities.h" #include "IMaterialEditor.h" #include "Materials/Material.h" #include "Materials/MaterialFunction.h" #include "Misc/Paths.h" #define LOCTEXT_NAMESPACE "SObjectBrowserTableRow" FName SSearchTreeRow::NAME_ColumnName(TEXT("Name")); FName SSearchTreeRow::NAME_ColumnType(TEXT("Type")); //FName SSearchTreeRow::CategoryProperty(TEXT("Property")); //FName SSearchTreeRow::CategoryPropertyValue(TEXT("PropertyValue")); void SSearchTreeRow::Construct(const FArguments& InArgs, const TSharedRef& InOwnerTableView, IAssetRegistry* InAssetRegistry, TSharedPtr InThumbnailPool) { BrowserObject = InArgs._Object; AssetRegistry = InAssetRegistry; ThumbnailPool = InThumbnailPool; FSuperRowType::Construct( FSuperRowType::FArguments(), InOwnerTableView ); } TSharedRef SSearchTreeRow::GenerateWidget() { return SNew(STextBlock) .Text(FText::FromString(BrowserObject->GetText())); } TSharedRef SSearchTreeRow::GenerateWidgetForColumn(const FName& ColumnName) { TSharedRef HorizBox = SNew(SHorizontalBox); FAssetToolsModule& AssetToolsModule = FModuleManager::GetModuleChecked("AssetTools"); if (ColumnName == NAME_ColumnName) { TSharedPtr IconWidget; if (BrowserObject->GetType() == ESearchNodeType::Object) { TSharedPtr ObjectNode = StaticCastSharedPtr(BrowserObject); if (UClass* ObjectClass = UClass::TryFindTypeSlow(*ObjectNode->object_native_class, EFindFirstObjectOptions::ExactClass)) { FSlateIcon ClassIcon = FSlateIconFinder::FindIconForClass(ObjectClass); if (ClassIcon.IsSet()) { IconWidget = SNew(SImage) .Image(ClassIcon.GetIcon()); } } } else if (BrowserObject->GetType() == ESearchNodeType::Asset) { TSharedPtr ObjectNode = StaticCastSharedPtr(BrowserObject); if (UClass* ObjectClass = UClass::TryFindTypeSlow(ObjectNode->AssetClass, EFindFirstObjectOptions::ExactClass)) { TSharedPtr AssetActions = AssetToolsModule.Get().GetAssetTypeActionsForClass(ObjectClass).Pin(); FSlateIcon ClassIcon = FSlateIconFinder::FindIconForClass(ObjectClass); if (ClassIcon.IsSet()) { IconWidget = SNew(SImage) .Image(ClassIcon.GetIcon()) .ColorAndOpacity(AssetActions.IsValid() ? AssetActions->GetTypeColor() : FColor::White); } } } HorizBox->AddSlot() .VAlign(VAlign_Center) .AutoWidth() [ SNew(SExpanderArrow, SharedThis(this)) ]; if (IconWidget.IsValid()) { HorizBox->AddSlot() .VAlign(VAlign_Center) .AutoWidth() .Padding(0, 0, 4, 0) [ IconWidget.ToSharedRef() ]; } HorizBox->AddSlot() .VAlign(VAlign_Center) .AutoWidth() [ GenerateWidget() ]; } else if(ColumnName == NAME_ColumnType) { if (BrowserObject->GetType() == ESearchNodeType::Asset) { TSharedPtr AssetNode = StaticCastSharedPtr(BrowserObject); HorizBox->AddSlot() .VAlign(VAlign_Center) .AutoWidth() [ SNew(STextBlock) .Text(FText::FromString(AssetNode->AssetClass)) ]; } } ////FAssetData AssetData = AssetRegistry->GetAssetByObjectPath(*BrowserObject->GetAsset); //// Create the thumbnail handle //int32 ThumbnailSizeX = 24; //int32 ThumbnailSizeY = 24; //TSharedRef AssetThumbnail = MakeShared(AssetData, ThumbnailSizeX, ThumbnailSizeY, ThumbnailPool); //return SNew(SBox) // .WidthOverride(ThumbnailSizeX) // .HeightOverride(ThumbnailSizeY) // [ // AssetThumbnail->MakeThumbnailWidget() // ]; //else if (ColumnName == CategoryClass) //{ // return SNew(STextBlock) // .Text(FText::FromString(BrowserObject->GetText())); //} //else if (ColumnName == CategoryProperty) //{ // //return SNew(STextBlock) // // .Text(FText::FromString(BrowserObject->GetText())); //} //else if (ColumnName == CategoryPropertyValue) //{ // //return SNew(STextBlock) // // .Text(FText::FromString(BrowserObject->Record.Text)); //} return HorizBox; } FReply SSearchTreeRow::OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) { if (BrowserObject->GetType() == ESearchNodeType::Asset) { TSharedPtr ObjectNode = StaticCastSharedPtr(BrowserObject); GEditor->GetEditorSubsystem()->OpenEditorForAsset(ObjectNode->AssetPath); } else if (BrowserObject->GetType() == ESearchNodeType::Object || BrowserObject->GetType() == ESearchNodeType::Property) { FSoftObjectPath ReferencePath(BrowserObject->GetObjectPath()); UObject* Object = ReferencePath.TryLoad(); if (Object && Object->GetTypedOuter()) { FKismetEditorUtilities::BringKismetToFocusAttentionOnObject(Object, false); } if (Object && (Object->GetTypedOuter() || Object->GetTypedOuter())) { const FString& AssetPathName = ReferencePath.GetAssetPathString(); UPackage* Package = LoadPackage(NULL, *AssetPathName, LOAD_NoRedirects); if (Package) { Package->FullyLoad(); FString AssetName = FPaths::GetBaseFilename(AssetPathName); UObject* MaterialObject = FindObject(Package, *AssetName); if (MaterialObject != NULL) { UAssetEditorSubsystem* AssetEditorSubsystem = GEditor->GetEditorSubsystem(); AssetEditorSubsystem->OpenEditorForAsset(MaterialObject); if (IMaterialEditor* MaterialEditor = (IMaterialEditor*)(AssetEditorSubsystem->FindEditorForAsset(MaterialObject, true))) { MaterialEditor->JumpToExpression(Cast(Object)); } } } } else { GEditor->GetEditorSubsystem()->OpenEditorForAsset(ReferencePath.GetAssetPathString()); } } return FReply::Handled(); } #undef LOCTEXT_NAMESPACE