// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Containers/Array.h" #include "Containers/Map.h" #include "Delegates/Delegate.h" #include "Internationalization/Text.h" #include "Misc/TextFilter.h" #include "Templates/SharedPointer.h" #include "ViewModels/CategoryViewModel.h" class FContentSourceViewModel; class FString; class IContentSourceProvider; /** The view model for the SAddContentWidget. */ class FAddContentWidgetViewModel : public TSharedFromThis { public: DECLARE_DELEGATE(FOnCategoriesChanged) DECLARE_DELEGATE(FOnContentSourcesChanged); DECLARE_DELEGATE(FOnSelectedContentSourceChanged); typedef TTextFilter> ContentSourceTextFilter; /** Creates a shared reference to a new view model. */ static TSharedRef CreateShared(); /** Gets the view models for the current set of content source categories. */ const TArray& GetCategories() const; /** Sets the delegate which should be executed when the set of categories changes. */ void SetOnCategoriesChanged(FOnCategoriesChanged OnCategoriesChangedIn); /** Gets the view model for the currently selected category. Only content sources which match the selected category will be returned by GetContentSources(). */ FCategoryViewModel GetSelectedCategory(); /** Sets the currently selected category view model. Only content sources which match the selected category will be returned by GetContentSources(). */ void SetSelectedCategory(FCategoryViewModel SelectedCategoryIn); /** Sets search text which should be used to filter the content sources. */ void SetSearchText(FText SearchTextIn); /** Get any error information that was reported the last time SetSearchText was called. */ FText GetSearchErrorText() const; /** Gets a filtered array of content sources which match both the selected category and the search text if it has been set. */ const TArray>* GetContentSources(); /** Sets the delegate which should be executed when the current set of content sources returned by GetContentSources changes. */ void SetOnContentSourcesChanged(FOnContentSourcesChanged OnContentSourcesChangedIn); /** Gets the currently selected content source. */ TSharedPtr GetSelectedContentSource(); /** Sets the currently selected content source. */ void SetSelectedContentSource(TSharedPtr SelectedContentSourceIn); /** Sets the delegate which should be executed when the selected content source changes. */ void SetOnSelectedContentSourceChanged(FOnSelectedContentSourceChanged OnSelectedContentSourceChangedIn); private: FAddContentWidgetViewModel(); void Initialize(); /** Builds view models for all available content sources. */ void BuildContentSourceViewModels(); /** Filters the current set of content sources based on the selected category and the search text, and updates the selection. * @param bAllowEmptySelection Determines whether or not to select the first available item after filtering if the selected item is null, or not in the filtered set. */ void UpdateFilteredContentSourcesAndSelection(bool bAllowEmptySelection); /** Converts a content source item to an array of strings for processing by the TTextFilter. */ void TransformContentSourceToStrings(TSharedPtr Item, OUT TArray< FString >& Array); /** Handles notification from the content source providers when their content source arrays change. */ void ContentSourcesChanged(); private: /** The array of content source providers who's content sources are being displayed. */ TArray> ContentSourceProviders; /** The view models for the available categories. */ TArray Categories; /** A combined array of all content sources from all content source providers. */ TArray> ContentSourceViewModels; /** A filtered array of content sources based on the currently selected category and the search text. */ TArray> FilteredContentSourceViewModels; /** A map which keeps track of the currently selected content source for each category. */ TMap> CategoryToSelectedContentSourceMap; /** The view model for the currently selected category. */ FCategoryViewModel SelectedCategory; /** The current search text. */ FText SearchText; /** The delegate which is executed when the available categories change. */ FOnCategoriesChanged OnCategoriesChanged; /** The delegate which is executed when the filtered content sources change. */ FOnContentSourcesChanged OnContentSourcesChanged; /** The delegate which is executed when the currently selected content source changes. */ FOnSelectedContentSourceChanged OnSelectedContentSourceChanged; /** The filter which is used to filter the content sources based on the search text. */ TSharedPtr ContentSourceFilter; };