2021-08-16 15:28:49 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "Library/SLibraryViewModel.h"
# include "Library/SLibraryView.h"
# include "Widgets/Views/STableViewBase.h"
# include "Widgets/Views/STableRow.h"
# include "WidgetBlueprint.h"
# include "Editor.h"
# include "FrontendFilters.h"
# include "SAssetView.h"
# if WITH_EDITOR
2022-05-09 13:12:28 -04:00
# include "Styling/AppStyle.h"
2021-08-16 15:28:49 -04:00
# endif // WITH_EDITOR
# include "DragDrop/WidgetTemplateDragDropOp.h"
# include "Templates/WidgetTemplateClass.h"
# include "Templates/WidgetTemplateBlueprintClass.h"
2022-05-02 18:06:48 -04:00
# include "AssetRegistry/AssetRegistryModule.h"
2021-08-16 15:28:49 -04:00
# include "WidgetBlueprintEditorUtils.h"
2021-10-06 21:33:14 -04:00
# include "IContentBrowserDataModule.h"
2021-08-16 15:28:49 -04:00
# include "Settings/ContentBrowserSettings.h"
# include "Settings/WidgetDesignerSettings.h"
# include "WidgetPaletteFavorites.h"
2022-09-11 18:33:06 -04:00
# include "Library/SLibraryViewModel.h"
2021-08-16 15:28:49 -04:00
# define LOCTEXT_NAMESPACE "UMG"
2022-05-19 13:34:08 -04:00
void FLibraryViewModel : : BuildWidgetTemplateCategory ( FString & Category , TArray < TSharedPtr < FWidgetTemplate > > & Templates , TArray < FString > & FavoritesList )
2021-08-16 15:28:49 -04:00
{
2023-06-06 08:44:12 -04:00
//This function do not handle Favorites. So we empty the Favorite Array. See FLibraryViewModel::BuildWidgetTemplateCategory to implement favorite cleaning.
FavoritesList . Empty ( ) ;
2021-08-24 11:59:40 -04:00
TSharedPtr < FWidgetHeaderViewModel > Header = MakeShareable ( new FWidgetHeaderViewModel ( ) ) ;
Header - > GroupName = FText : : FromString ( Category ) ;
2021-08-16 15:28:49 -04:00
2021-08-24 11:59:40 -04:00
TSharedPtr < FWidgetTemplateListViewModel > TemplateViewModel = MakeShared < FWidgetTemplateListViewModel > ( ) ;
TemplateViewModel - > ConstructListView ( Templates ) ;
Header - > Children . Add ( TemplateViewModel ) ;
WidgetTemplateListViewModels . Add ( TemplateViewModel ) ;
2021-08-16 15:28:49 -04:00
2021-08-30 11:14:39 -04:00
Header - > Children . Sort ( [ ] ( const TSharedPtr < FWidgetViewModel > & L , const TSharedPtr < FWidgetViewModel > & R ) { return R - > GetName ( ) . CompareTo ( L - > GetName ( ) ) > 0 ; } ) ;
2021-08-24 11:59:40 -04:00
2023-06-06 08:44:12 -04:00
AddHeader ( Header ) ;
2021-08-16 15:28:49 -04:00
}
2021-08-19 11:04:16 -04:00
void FLibraryViewModel : : SetSearchText ( const FText & InSearchText )
{
2021-08-24 11:59:40 -04:00
FWidgetCatalogViewModel : : SetSearchText ( InSearchText ) ;
2021-08-19 11:04:16 -04:00
for ( TSharedPtr < FWidgetViewModel > & WidgetTemplateListViewModel : WidgetTemplateListViewModels )
{
TSharedPtr < FWidgetTemplateListViewModel > WidgetLibrary = StaticCastSharedPtr < FWidgetTemplateListViewModel > ( WidgetTemplateListViewModel ) ;
WidgetLibrary - > SetSearchText ( InSearchText ) ;
}
}
2021-08-16 15:28:49 -04:00
void FLibraryViewModel : : BuildWidgetList ( )
{
2021-08-19 11:04:16 -04:00
WidgetTemplateListViewModels . Reset ( ) ;
2021-08-24 11:59:40 -04:00
FWidgetCatalogViewModel : : BuildWidgetList ( ) ;
2021-08-16 15:28:49 -04:00
}
FWidgetTemplateListViewModel : : FWidgetTemplateListViewModel ( )
{
}
2021-08-19 11:04:16 -04:00
void FWidgetTemplateListViewModel : : ConstructListView ( TArray < TSharedPtr < FWidgetTemplate > > InTemplates )
{
Templates = InTemplates ;
if ( ! TemplatesFilter )
{
2021-10-06 21:33:14 -04:00
NumAssets = 0 ;
NumClasses = 0 ;
2021-08-19 11:04:16 -04:00
// Generate filter text
bool bHasFilters = false ;
TStringBuilder < 2048 > FilterString ;
for ( TSharedPtr < FWidgetTemplate > Template : Templates )
{
if ( TSharedPtr < FWidgetTemplateClass > TemplateClass = StaticCastSharedPtr < FWidgetTemplateClass > ( Template ) )
{
2021-10-06 21:33:14 -04:00
FString TemplateString ;
FString TemplatePath ;
if ( TemplateClass - > GetWidgetAssetData ( ) . IsValid ( ) )
{
TemplateString = TemplateClass - > GetWidgetAssetData ( ) . AssetName . ToString ( ) ;
NumAssets + + ;
}
else if ( UClass * WidgetClass = TemplateClass - > GetWidgetClass ( ) . Get ( ) )
{
TemplateString = WidgetClass - > GetFName ( ) . ToString ( ) ;
NumClasses + + ;
}
2021-08-19 11:04:16 -04:00
if ( ! TemplateString . IsEmpty ( ) )
{
TemplateString . RemoveFromEnd ( TEXT ( " _C " ) ) ;
FilterString + = bHasFilters ? " |+ " : " + " ;
FilterString + = TemplateString ;
2021-10-06 21:33:14 -04:00
bHasFilters = false ;
2021-08-19 11:04:16 -04:00
}
}
}
2021-10-06 21:33:14 -04:00
LibrarySourceData = MakeShared < FSourcesData > ( ) ;
// Provide a dummy invalid virtual path to make sure nothing tries to enumerate root "/"
LibrarySourceData - > VirtualPaths . Add ( FName ( TEXT ( " /UMGWidgetTemplateListViewModel " ) ) ) ;
// Disable any enumerate of virtual path folders
LibrarySourceData - > bIncludeVirtualPaths = false ;
// Supply a custom list of source items to display
LibrarySourceData - > OnEnumerateCustomSourceItemDatas . BindSP ( this , & FWidgetTemplateListViewModel : : EnumerateCustomSourceItemDatas ) ;
CachedLowercaseWidgetFilter = FString ( FilterString . ToString ( ) ) . ToLower ( ) ;
2021-08-19 11:04:16 -04:00
SearchFilter = MakeShared < FFrontendFilter_Text > ( ) ;
SearchFilter - > SetActive ( false ) ;
TemplatesFilter = MakeShared < FAssetFilterCollectionType > ( ) ;
TemplatesFilter - > Add ( SearchFilter ) ;
}
if ( ! AssetViewPtr )
{
AssetViewPtr = SNew ( SAssetView )
. InitialCategoryFilter ( EContentBrowserItemCategoryFilter : : IncludeAssets | EContentBrowserItemCategoryFilter : : IncludeClasses )
2021-10-06 21:33:14 -04:00
. InitialSourcesData ( * LibrarySourceData )
2021-08-19 11:04:16 -04:00
. InitialThumbnailSize ( EThumbnailSize : : Small )
. FrontendFilters ( TemplatesFilter )
. ForceShowEngineContent ( true )
. ForceShowPluginContent ( true )
2023-01-04 13:18:36 -05:00
. ForceHideScrollbar ( true )
2021-08-19 11:04:16 -04:00
. ShowTypeInTileView ( false )
. ShowViewOptions ( false )
. HighlightedText ( this , & FWidgetTemplateListViewModel : : GetSearchText )
;
}
AssetViewPtr - > RequestSlowFullListRefresh ( ) ;
}
2021-10-06 21:33:14 -04:00
bool FWidgetTemplateListViewModel : : EnumerateCustomSourceItemDatas ( TFunctionRef < bool ( FContentBrowserItemData & & ) > InCallback )
{
SourceItemPaths . Reset ( ) ;
SourceItemPaths . Reserve ( NumAssets ) ;
TArray < UObject * > ClassObjects ;
ClassObjects . Reserve ( NumClasses ) ;
for ( TSharedPtr < FWidgetTemplate > Template : Templates )
{
if ( TSharedPtr < FWidgetTemplateClass > TemplateClass = StaticCastSharedPtr < FWidgetTemplateClass > ( Template ) )
{
if ( TemplateClass - > GetWidgetAssetData ( ) . IsValid ( ) )
{
SourceItemPaths . Add ( FContentBrowserItemPath ( TemplateClass - > GetWidgetAssetData ( ) . PackageName , EContentBrowserPathType : : Internal ) ) ;
}
else if ( UClass * WidgetClass = TemplateClass - > GetWidgetClass ( ) . Get ( ) )
{
ClassObjects . Add ( WidgetClass ) ;
}
}
}
UContentBrowserDataSubsystem * ContentBrowserDataSubsystem = IContentBrowserDataModule : : Get ( ) . GetSubsystem ( ) ;
if ( ! SourceItemPaths . IsEmpty ( ) )
{
if ( ! ContentBrowserDataSubsystem - > EnumerateItemsAtPaths ( SourceItemPaths , EContentBrowserItemTypeFilter : : IncludeFiles , InCallback ) )
{
return false ;
}
}
if ( ! ClassObjects . IsEmpty ( ) )
{
if ( ! ContentBrowserDataSubsystem - > EnumerateItemsForObjects ( ClassObjects , InCallback ) )
{
return false ;
}
}
return true ;
}
2021-08-16 15:28:49 -04:00
FText FWidgetTemplateListViewModel : : GetName ( ) const
{
return FText ( ) ;
}
bool FWidgetTemplateListViewModel : : IsTemplate ( ) const
{
return false ;
}
void FWidgetTemplateListViewModel : : GetFilterStrings ( TArray < FString > & OutStrings ) const
{
}
2021-08-19 11:04:16 -04:00
bool FWidgetTemplateListViewModel : : HasFilteredChildTemplates ( ) const
{
FText SearchText = SearchFilter - > GetRawFilterText ( ) ;
return SearchText . IsEmpty ( ) | | CachedLowercaseWidgetFilter . Contains ( SearchText . ToString ( ) . ToLower ( ) ) ;
}
2021-08-16 15:28:49 -04:00
TSharedRef < ITableRow > FWidgetTemplateListViewModel : : BuildRow ( const TSharedRef < STableViewBase > & OwnerTable )
{
return SNew ( STableRow < TSharedPtr < FWidgetViewModel > > , OwnerTable )
. Padding ( 2.0f )
2021-08-19 11:04:16 -04:00
. ShowSelection ( false )
. ShowWires ( false )
2022-05-09 13:12:28 -04:00
. Style ( FAppStyle : : Get ( ) , " UMGEditor.LibraryView " )
2021-08-16 15:28:49 -04:00
[
AssetViewPtr . ToSharedRef ( )
] ;
}
2021-08-19 11:04:16 -04:00
void FWidgetTemplateListViewModel : : SetViewType ( EAssetViewType : : Type ViewType )
{
if ( AssetViewPtr )
{
AssetViewPtr - > SetCurrentViewType ( ViewType ) ;
}
}
void FWidgetTemplateListViewModel : : SetThumbnailSize ( EThumbnailSize ThumbnailSize )
{
if ( AssetViewPtr )
{
AssetViewPtr - > SetCurrentThumbnailSize ( ThumbnailSize ) ;
}
}
void FWidgetTemplateListViewModel : : SetSearchText ( const FText & InSearchText )
{
if ( SearchFilter & & AssetViewPtr )
{
SearchFilter - > SetActive ( ! InSearchText . IsEmpty ( ) ) ;
SearchFilter - > SetRawFilterText ( InSearchText ) ;
AssetViewPtr - > SetUserSearching ( ! InSearchText . IsEmpty ( ) ) ;
}
}
FText FWidgetTemplateListViewModel : : GetSearchText ( ) const
{
if ( SearchFilter )
{
return SearchFilter - > GetRawFilterText ( ) ;
}
return FText : : GetEmpty ( ) ;
}
2022-09-11 18:33:06 -04:00
# undef LOCTEXT_NAMESPACE