// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "CommonActivatableWidget.h" #include "GameplayTagContainer.h" #include "GameFeatureAction_WorldActionBase.h" #include "UI/LyraHUD.h" #include "UIExtensionSystem.h" #include "GameFeatureAction_AddWidget.generated.h" struct FWorldContext; struct FComponentRequestHandle; USTRUCT() struct FLyraHUDLayoutRequest { GENERATED_BODY() // The layout widget to spawn UPROPERTY(EditAnywhere, Category=UI, meta=(AssetBundles="Client")) TSoftClassPtr LayoutClass; // The layer to insert the widget in UPROPERTY(EditAnywhere, Category=UI, meta=(Categories="UI.Layer")) FGameplayTag LayerID; }; USTRUCT() struct FLyraHUDElementEntry { GENERATED_BODY() // The widget to spawn UPROPERTY(EditAnywhere, Category=UI, meta=(AssetBundles="Client")) TSoftClassPtr WidgetClass; // The slot ID where we should place this widget UPROPERTY(EditAnywhere, Category = UI) FGameplayTag SlotID; }; ////////////////////////////////////////////////////////////////////// // UGameFeatureAction_AddWidget /** * GameFeatureAction responsible for granting abilities (and attributes) to actors of a specified type. */ UCLASS(MinimalAPI, meta = (DisplayName = "Add Widgets")) class UGameFeatureAction_AddWidgets final : public UGameFeatureAction_WorldActionBase { GENERATED_BODY() public: //~ Begin UGameFeatureAction interface virtual void OnGameFeatureDeactivating(FGameFeatureDeactivatingContext& Context) override; #if WITH_EDITORONLY_DATA virtual void AddAdditionalAssetBundleData(FAssetBundleData& AssetBundleData) override; #endif //~ End UGameFeatureAction interface //~ Begin UObject interface #if WITH_EDITOR virtual EDataValidationResult IsDataValid(TArray& ValidationErrors) override; #endif //~ End UObject interface private: // Layout to add to the HUD UPROPERTY(EditAnywhere, Category=UI, meta=(TitleProperty="{LayerID} -> {LayoutClass}")) TArray Layout; // Widgets to add to the HUD UPROPERTY(EditAnywhere, Category=UI, meta=(TitleProperty="{SlotID} -> {WidgetClass}")) TArray Widgets; private: struct FPerContextData { TArray> ComponentRequests; TArray> LayoutsAdded; TArray ExtensionHandles; }; TMap ContextData; //~ Begin UGameFeatureAction_WorldActionBase interface virtual void AddToWorld(const FWorldContext& WorldContext, const FGameFeatureStateChangeContext& ChangeContext) override; //~ End UGameFeatureAction_WorldActionBase interface void Reset(FPerContextData& ActiveData); void HandleActorExtension(AActor* Actor, FName EventName, FGameFeatureStateChangeContext ChangeContext); void AddWidgets(AActor* Actor, FPerContextData& ActiveData); void RemoveWidgets(AActor* Actor, FPerContextData& ActiveData); };