// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
#include "RenamePluginPrivatePCH.h"
#include "RenamePluginButtonList.h"
#include "EditorStyle.h"
#include "SEditableTextBox.h"
#include "AssetToolsModule.h"
#define LOCTEXT_NAMESPACE "RenamePluginButtonList"
void RenamePluginButtonList::Construct(const FArguments& InArgs, TSharedPtr<SDockTab> InOwnerTab)
{
this->ChildSlot
[
SNew(SVerticalBox)
+ SVerticalBox::Slot()
.MaxHeight(20.f)
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.MaxWidth(140.f)
[
SNew(STextBlock)
.Text(FText::FromString(FString(TEXT("请输入你想要的重命名:"))))
]
+ SHorizontalBox::Slot()
.Padding(10.f,0.f)
.MaxWidth(80.f)
[
SNew(SEditableTextBox)
.OnTextChanged(FOnTextChanged::CreateRaw(this, &RenamePluginButtonList::OnTextChanged))
]
]
+ SVerticalBox::Slot()
.Padding(0.f, 10.f)
.MaxHeight(20.f)
[
SNew(STextBlock)
.Text(FText::FromString(FString(TEXT("然后选择你想要重命名的文件<按住Ctrl可以多选>,最后点击确定即可."))))
]
+ SVerticalBox::Slot()
.Padding(0.f,10.f)
.MaxHeight(30.f)
[
SNew(SHorizontalBox)
+ SHorizontalBox::Slot()
.Padding(0.f, 0.f)
.MaxWidth(80.f)
[
SNew(SButton)
.VAlign(VAlign_Center)
.HAlign(HAlign_Center)
.Text(FText::FromString(FString(TEXT("确 定"))))
.OnClicked(this, &RenamePluginButtonList::OnRenameClicked)
]
]
];
}
void RenamePluginButtonList::OnTextChanged(const FText& InText)
{
Rename = InText.ToString();
//UE_LOG(LogTemp, Log, TEXT("%s"), *Prefix.ToString());
}
FReply RenamePluginButtonList::OnRenameClicked()
{
// TArray<AStaticMeshActor*> SelectedActors;
// SelectedActors = GetSelectedActors();
// 获取选中的素材文件
TArray<FAssetData> AssetData;
AssetData = GetSelectMaterialAssets();
// 判断是否重名
for (int32 i = 0;i < AssetData.Num(); i++)
{
FString FullName = GetSelectMaterialFullName(AssetData[i]);
FString Suffix = FString::FromInt(i + 1);
FString NewName = Rename + FString("_") + Suffix;
if (!IsValidRename(FullName, NewName))
{
UObject* Object = AssetData[i].GetAsset();
// 修改名字
FText ErrorMessage;
RenameAsset(Object, NewName, ErrorMessage);
}
}
return FReply::Handled();
}
TArray<AStaticMeshActor*> RenamePluginButtonList::GetSelectedActors()
{
TArray<AStaticMeshActor*> ReturnActor;
USelection* mySel = GEditor->GetSelectedActors();
UE_LOG(LogTemp, Log, TEXT("选中文件个数 = %d"), mySel->Num());
for (int32 i = 0; i < mySel->Num(); i++)
{
UObject* Object = mySel->GetSelectedObject(i);
FString ObjName = Object->GetName();
AActor* Actor = GEditor->SelectNamedActor(*ObjName);
AStaticMeshActor* StaticMeshActor = Cast<AStaticMeshActor>(Actor);
if (StaticMeshActor)
{
ReturnActor.Add(StaticMeshActor);
}
}
return ReturnActor;
}
TArray<FAssetData> RenamePluginButtonList::GetSelectMaterialAssets()
{
TArray<FAssetData> AssetData;
GEditor->GetContentBrowserSelections(AssetData);
UE_LOG(LogTemp, Log, TEXT("选中素材文件个数 = %d"), AssetData.Num());
return AssetData;
}
FString RenamePluginButtonList::GetSelectMaterialFullName(const FAssetData& SelectMaterial)
{
FString FullName = SelectMaterial.PackagePath.ToString() + FString("/") + SelectMaterial.GetAsset()->GetName(); //获取资源的相对path
UE_LOG(LogTemp, Log, TEXT("FullName = %s"), *FullName);
return FullName;
}
bool RenamePluginButtonList::IsValidRename(const FString& ResoureceName, const FString& NewName)
{
FString PackageName = ResoureceName;
UE_LOG(LogTemp, Log, TEXT("IsValidRename NewName = %s"), *NewName);
UE_LOG(LogTemp, Log, TEXT("IsValidRename ResoureceName = %s"), *PackageName);
UPackage* Pkg = CreatePackage(NULL, *PackageName);
Pkg->FullyLoad();
// Check for an existing object
UObject* ExistingObject = StaticFindObject(UObject::StaticClass(), Pkg, *NewName);
return ExistingObject != NULL ? true : false;
}
void RenamePluginButtonList::RenameAsset(UObject* Asset, const FString& NewName, FText& ErrorMessage)
{
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
TArray<FAssetRenameData> AssetsAndNames;
const FString PackagePath = FPackageName::GetLongPackagePath(Asset->GetOutermost()->GetName());
UE_LOG(LogTemp, Log, TEXT("RenameAsset PackagePath = %s"), *PackagePath);
new(AssetsAndNames)FAssetRenameData(Asset, PackagePath, NewName);
AssetToolsModule.Get().RenameAssets(AssetsAndNames);
}
评论6
最新资源