RealtimeStyleTransferRuntime/Source/LyraGame/GameFeatures/GameFeatureAction_AddWidget.h

101 lines
3.0 KiB
C
Raw Permalink Normal View History

2022-05-23 18:41:30 +00:00
// 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<UCommonActivatableWidget> 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<UUserWidget> 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<FText>& ValidationErrors) override;
#endif
//~ End UObject interface
private:
// Layout to add to the HUD
UPROPERTY(EditAnywhere, Category=UI, meta=(TitleProperty="{LayerID} -> {LayoutClass}"))
TArray<FLyraHUDLayoutRequest> Layout;
// Widgets to add to the HUD
UPROPERTY(EditAnywhere, Category=UI, meta=(TitleProperty="{SlotID} -> {WidgetClass}"))
TArray<FLyraHUDElementEntry> Widgets;
private:
struct FPerContextData
{
TArray<TSharedPtr<FComponentRequestHandle>> ComponentRequests;
TArray<TWeakObjectPtr<UCommonActivatableWidget>> LayoutsAdded;
TArray<FUIExtensionHandle> ExtensionHandles;
};
TMap<FGameFeatureStateChangeContext, FPerContextData> 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);
};