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

147 lines
4.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "FbxSceneImportDataDetails.h"
#include "Containers/Array.h"
#include "Containers/UnrealString.h"
#include "DesktopPlatformModule.h"
#include "DetailCategoryBuilder.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "Factories/FbxSceneImportData.h"
#include "Framework/Application/SlateApplication.h"
#include "GenericPlatform/GenericWindow.h"
#include "HAL/PlatformCrt.h"
#include "HAL/PlatformMath.h"
#include "IDesktopPlatform.h"
#include "IDetailPropertyRow.h"
#include "Internationalization/Internationalization.h"
#include "Misc/AssertionMacros.h"
#include "Misc/Paths.h"
#include "PropertyEditorModule.h"
#include "PropertyHandle.h"
#include "SlotBase.h"
#include "Templates/Casts.h"
#include "UObject/WeakObjectPtr.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/SWindow.h"
class UObject;
#define LOCTEXT_NAMESPACE "FbxSceneImportDataDetails"
FFbxSceneImportDataDetails::FFbxSceneImportDataDetails()
{
ImportData = nullptr;
}
TSharedRef<IDetailCustomization> FFbxSceneImportDataDetails::MakeInstance()
{
return MakeShareable( new FFbxSceneImportDataDetails);
}
void FFbxSceneImportDataDetails::CustomizeDetails( IDetailLayoutBuilder& DetailBuilder )
{
TArray<TWeakObjectPtr<UObject>> EditingObjects;
DetailBuilder.GetObjectsBeingCustomized(EditingObjects);
check(EditingObjects.Num() == 1);
IDetailCategoryBuilder &ImportSettingsCategory = DetailBuilder.EditCategory("ImportSettings");
ImportData = Cast<UFbxSceneImportData>(EditingObjects[0].Get());
// Grab and hide per-type import options
SourceFileFbxHandle = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UFbxSceneImportData, SourceFbxFile));
SourceFileFbxHandle->MarkHiddenByCustomization();
IDetailPropertyRow &SourceFileFbxRow = ImportSettingsCategory.AddProperty(SourceFileFbxHandle);
TSharedPtr<SWidget> NameWidget;
TSharedPtr<SWidget> ValueWidget;
FDetailWidgetRow Row;
SourceFileFbxRow.GetDefaultWidgets(NameWidget, ValueWidget, Row);
SourceFileValueWidget = ValueWidget;
FDetailWidgetRow &DetailWidgetRow = SourceFileFbxRow.CustomWidget();
DetailWidgetRow.NameContent()
.MinDesiredWidth(Row.NameWidget.MinWidth)
.MaxDesiredWidth(Row.NameWidget.MaxWidth)
[
NameWidget.ToSharedRef()
]
.ValueContent()
.MinDesiredWidth(Row.ValueContent().MaxWidth)
.MaxDesiredWidth(Row.ValueContent().MaxWidth)
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.FillWidth(1.0f)
[
ValueWidget.ToSharedRef()
]
+ SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SButton)
.Text(LOCTEXT("SourceFbxFile_Browse", "Browse..."))
.OnClicked(this, &FFbxSceneImportDataDetails::OnBrowseClicked)
]
];
}
FReply FFbxSceneImportDataDetails::OnBrowseClicked()
{
if (!SourceFileValueWidget.IsValid() || !SourceFileFbxHandle.IsValid())
{
return FReply::Handled();
}
//Popup a selectfile dialog and store the result into the asset
TArray<FString> OpenFilenames;
IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get();
bool bOpened = false;
if (DesktopPlatform != NULL)
{
TSharedPtr<SWindow> ParentWindow = FSlateApplication::Get().FindWidgetWindow(SourceFileValueWidget.ToSharedRef());
void* ParentWindowHandle = (ParentWindow.IsValid() && ParentWindow->GetNativeWindow().IsValid()) ? ParentWindow->GetNativeWindow()->GetOSWindowHandle() : nullptr;
FString DefaultFile = TEXT("");
FString DefaultPath = TEXT("");
if (SourceFileFbxHandle->GetValue(DefaultFile) == FPropertyAccess::Success)
{
DefaultPath = FPaths::GetPath(DefaultFile);
if (!FPaths::FileExists(DefaultFile))
{
DefaultFile = TEXT("");
}
}
else
{
DefaultFile = TEXT("");
DefaultPath = FPaths::GetPath(FPaths::GetProjectFilePath());
}
bOpened = DesktopPlatform->OpenFileDialog(
ParentWindowHandle,
TEXT("Select FBX|OBJ file.."),
DefaultPath,
DefaultFile,
TEXT("FBX file (*.fbx)|*.fbx|OBJ file (*.obj)|*.obj"),
EFileDialogFlags::None,
OpenFilenames);
}
if (bOpened == true)
{
if (OpenFilenames.Num() > 0)
{
SourceFileFbxHandle->SetValue(OpenFilenames[0]);
}
}
return FReply::Handled();
}
#undef LOCTEXT_NAMESPACE