SContentBrowserPathPicker.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. // Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
  2. #include "SContentBrowserPathPicker.h"
  3. #include "Modules/ModuleManager.h"
  4. #include "Widgets/SBoxPanel.h"
  5. #include "Widgets/Text/STextBlock.h"
  6. #include "Widgets/Input/SEditableTextBox.h"
  7. #include "Widgets/Input/SButton.h"
  8. #include "EditorStyleSet.h"
  9. #include "GameFramework/Actor.h"
  10. #include "AssetRegistry/AssetData.h"
  11. #include "Engine/Selection.h"
  12. #include "Editor.h"
  13. #include "Misc/FileHelper.h"
  14. #include "IAssetTools.h"
  15. #include "IContentBrowserSingleton.h"
  16. #include "ContentBrowserModule.h"
  17. #include "AssetToolsModule.h"
  18. #include "AssetRegistry/AssetRegistryModule.h"
  19. #include "PackageTools.h"
  20. #define LOCTEXT_NAMESPACE "SContentBrowserPathPicker"
  21. FString SContentBrowserPathPicker::LastAssetPath = FString("/Game");
  22. void SContentBrowserPathPicker::Construct(const FArguments& InArgs, TSharedPtr<SWindow> InParentWindow)
  23. {
  24. AssetFilenameSuffix = InArgs._AssetFilenameSuffix;
  25. HeadingText = InArgs._HeadingText;
  26. CreateButtonText = InArgs._CreateButtonText;
  27. OnCreateAssetAction = InArgs._OnCreateAssetAction;
  28. bIsReportingError = false;
  29. AssetPath = LastAssetPath;
  30. FPathPickerConfig PathPickerConfig;
  31. PathPickerConfig.DefaultPath = AssetPath;
  32. PathPickerConfig.OnPathSelected = FOnPathSelected::CreateRaw(this, &SContentBrowserPathPicker::OnSelectAssetPath);
  33. SelectionDelegateHandle = USelection::SelectionChangedEvent.AddSP(this, &SContentBrowserPathPicker::OnLevelSelectionChanged);
  34. // Set up PathPickerConfig.
  35. FContentBrowserModule& ContentBrowserModule = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
  36. ParentWindow = InParentWindow;
  37. FString PackageName;
  38. ActorInstanceLabel.Empty();
  39. if( InArgs._DefaultNameOverride.IsEmpty() )
  40. {
  41. USelection* SelectedActors = GEditor->GetSelectedActors();
  42. for(FSelectionIterator Iter(*SelectedActors); Iter; ++Iter)
  43. {
  44. AActor* Actor = Cast<AActor>(*Iter);
  45. if(Actor)
  46. {
  47. ActorInstanceLabel += Actor->GetActorLabel();
  48. ActorInstanceLabel += TEXT("_");
  49. break;
  50. }
  51. }
  52. }
  53. else
  54. {
  55. ActorInstanceLabel = InArgs._DefaultNameOverride.ToString();
  56. }
  57. ActorInstanceLabel = UPackageTools::SanitizePackageName(ActorInstanceLabel + AssetFilenameSuffix);
  58. FString AssetName = ActorInstanceLabel;
  59. FString BasePath = AssetPath / AssetName;
  60. FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
  61. AssetToolsModule.Get().CreateUniqueAssetName(BasePath, TEXT(""), PackageName, AssetName);
  62. ChildSlot
  63. [
  64. SNew(SVerticalBox)
  65. + SVerticalBox::Slot()
  66. .FillHeight(1.0f)
  67. [
  68. ContentBrowserModule.Get().CreatePathPicker(PathPickerConfig)
  69. ]
  70. #if 0
  71. + SVerticalBox::Slot()
  72. .AutoHeight()
  73. [
  74. SNew(SHorizontalBox)
  75. + SHorizontalBox::Slot()
  76. .Padding(0.0f, 0.0f, 4.0f, 0.0f)
  77. .AutoWidth()
  78. [
  79. SNew(STextBlock)
  80. .Text(HeadingText)
  81. ]
  82. + SHorizontalBox::Slot()
  83. .FillWidth(1.0f)
  84. [
  85. SAssignNew(FileNameWidget, SEditableTextBox)
  86. .Text(FText::FromString(AssetName))
  87. .OnTextChanged(this, &SContentBrowserPathPicker::OnFilenameChanged)
  88. ]
  89. ]
  90. #endif
  91. + SVerticalBox::Slot()
  92. .HAlign(HAlign_Right)
  93. .Padding(0, 20, 0, 0)
  94. .AutoHeight()
  95. [
  96. SNew(SHorizontalBox)
  97. + SHorizontalBox::Slot()
  98. .Padding(0, 2, 6, 0)
  99. .AutoWidth()
  100. [
  101. SNew(SButton)
  102. .VAlign(VAlign_Bottom)
  103. .ContentPadding(FMargin(8, 2, 8, 2))
  104. .OnClicked(this, &SContentBrowserPathPicker::OnCreateAssetFromActorClicked)
  105. .IsEnabled(this, &SContentBrowserPathPicker::ISContentBrowserPathPickerEnabled)
  106. .ButtonStyle(FAppStyle::Get(), "FlatButton.Success")
  107. .TextStyle(FAppStyle::Get(), "FlatButton.DefaultTextStyle")
  108. .Text(CreateButtonText)
  109. ]
  110. + SHorizontalBox::Slot()
  111. .Padding(0, 2, 0, 0)
  112. .AutoWidth()
  113. [
  114. SNew(SButton)
  115. .VAlign(VAlign_Bottom)
  116. .ContentPadding(FMargin(8, 2, 8, 2))
  117. .OnClicked(this, &SContentBrowserPathPicker::OnCancelCreateAssetFromActor)
  118. .ButtonStyle(FAppStyle::Get(), "FlatButton.Default")
  119. .TextStyle(FAppStyle::Get(), "FlatButton.DefaultTextStyle")
  120. .Text(LOCTEXT("CancelButtonText", "Cancel"))
  121. ]
  122. ]
  123. ];
  124. //OnFilenameChanged(FText::FromString(AssetName));
  125. }
  126. void SContentBrowserPathPicker::RequestDestroyParentWindow()
  127. {
  128. USelection::SelectionChangedEvent.Remove(SelectionDelegateHandle);
  129. if (ParentWindow.IsValid())
  130. {
  131. ParentWindow.Pin()->RequestDestroyWindow();
  132. }
  133. }
  134. FReply SContentBrowserPathPicker::OnCreateAssetFromActorClicked()
  135. {
  136. RequestDestroyParentWindow();
  137. //OnCreateAssetAction.ExecuteIfBound(AssetPath / FileNameWidget->GetText().ToString());
  138. OnCreateAssetAction.ExecuteIfBound(AssetPath);// / FileNameWidget->GetText().ToString());
  139. return FReply::Handled();
  140. }
  141. FReply SContentBrowserPathPicker::OnCancelCreateAssetFromActor()
  142. {
  143. RequestDestroyParentWindow();
  144. return FReply::Handled();
  145. }
  146. void SContentBrowserPathPicker::OnSelectAssetPath(const FString& Path)
  147. {
  148. AssetPath = Path;
  149. LastAssetPath = AssetPath;
  150. //OnFilenameChanged(FileNameWidget->GetText());
  151. }
  152. void SContentBrowserPathPicker::OnLevelSelectionChanged(UObject* InObjectSelected)
  153. {
  154. // When actor selection changes, this window should be destroyed.
  155. RequestDestroyParentWindow();
  156. }
  157. void SContentBrowserPathPicker::OnFilenameChanged(const FText& InNewName)
  158. {
  159. TArray<FAssetData> AssetData;
  160. FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
  161. AssetRegistryModule.Get().GetAssetsByPath(FName(*AssetPath), AssetData);
  162. FText ErrorText;
  163. if (!FFileHelper::IsFilenameValidForSaving(InNewName.ToString(), ErrorText) || !FName(*InNewName.ToString()).IsValidObjectName(ErrorText))
  164. {
  165. FileNameWidget->SetError(ErrorText);
  166. bIsReportingError = true;
  167. return;
  168. }
  169. else
  170. {
  171. // Check to see if the name conflicts
  172. for (auto Iter = AssetData.CreateConstIterator(); Iter; ++Iter)
  173. {
  174. if (Iter->AssetName.ToString() == InNewName.ToString())
  175. {
  176. FileNameWidget->SetError(LOCTEXT("AssetInUseError", "Asset name already in use!"));
  177. bIsReportingError = true;
  178. return;
  179. }
  180. }
  181. }
  182. FileNameWidget->SetError(FText::FromString(TEXT("")));
  183. bIsReportingError = false;
  184. }
  185. bool SContentBrowserPathPicker::ISContentBrowserPathPickerEnabled() const
  186. {
  187. return !bIsReportingError;
  188. }
  189. #undef LOCTEXT_NAMESPACE