diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardActor.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardActor.cpp new file mode 100644 index 0000000..1d594fa --- /dev/null +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardActor.cpp @@ -0,0 +1,109 @@ +#include "HyperTwistTraining/HyperTwistCoachDashboardActor.h" + +#include "Blueprint/UserWidget.h" +#include "HyperTwistTraining/HyperTwistCoachDashboardWidget.h" + +AHyperTwistCoachDashboardActor::AHyperTwistCoachDashboardActor() +{ + PrimaryActorTick.bCanEverTick = false; +} + +void AHyperTwistCoachDashboardActor::BeginPlay() +{ + Super::BeginPlay(); + + if (bCreateDashboardOnBeginPlay) + { + CreateAndShowDashboard(); + } +} + +void AHyperTwistCoachDashboardActor::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + if (bRemoveDashboardOnEndPlay) + { + RemoveDashboard(); + } + + Super::EndPlay(EndPlayReason); +} + +UHyperTwistCoachDashboardWidget* AHyperTwistCoachDashboardActor::CreateAndShowDashboard() +{ + if (ActiveDashboardWidget != nullptr) + { + RefreshDashboard(); + return ActiveDashboardWidget; + } + + const TSubclassOf ResolvedWidgetClass = ResolveDashboardWidgetClass(); + if (GetWorld() == nullptr || *ResolvedWidgetClass == nullptr) + { + return nullptr; + } + + ActiveDashboardWidget = CreateWidget(GetWorld(), ResolvedWidgetClass); + if (ActiveDashboardWidget == nullptr) + { + return nullptr; + } + + ApplyDashboardDefaults(ActiveDashboardWidget); + ActiveDashboardWidget->AddToViewport(DashboardZOrder); + + if (bRefreshDashboardOnCreate) + { + ActiveDashboardWidget->RefreshCoachDashboardView(); + } + + return ActiveDashboardWidget; +} + +void AHyperTwistCoachDashboardActor::RemoveDashboard() +{ + if (ActiveDashboardWidget == nullptr) + { + return; + } + + ActiveDashboardWidget->RemoveFromParent(); + ActiveDashboardWidget = nullptr; +} + +void AHyperTwistCoachDashboardActor::RefreshDashboard() +{ + if (ActiveDashboardWidget != nullptr) + { + ApplyDashboardDefaults(ActiveDashboardWidget); + ActiveDashboardWidget->RefreshCoachDashboardView(); + } +} + +bool AHyperTwistCoachDashboardActor::HasActiveDashboard() const +{ + return ActiveDashboardWidget != nullptr; +} + +TSubclassOf AHyperTwistCoachDashboardActor::ResolveDashboardWidgetClass() const +{ + if (*DashboardWidgetClass != nullptr) + { + return DashboardWidgetClass; + } + + return UHyperTwistCoachDashboardWidget::StaticClass(); +} + +void AHyperTwistCoachDashboardActor::ApplyDashboardDefaults(UHyperTwistCoachDashboardWidget* DashboardWidget) const +{ + if (DashboardWidget == nullptr) + { + return; + } + + DashboardWidget->bRefreshOnConstruct = bRefreshDashboardOnCreate; + DashboardWidget->DefaultUserId = DashboardDefaultUserId; + DashboardWidget->DefaultSessionId = DashboardDefaultSessionId; + DashboardWidget->DefaultMode = DashboardDefaultMode; + DashboardWidget->DefaultCoachMaxCases = DashboardDefaultCoachMaxCases; +} diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardActor.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardActor.h new file mode 100644 index 0000000..c4db972 --- /dev/null +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardActor.h @@ -0,0 +1,66 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "HyperTwistTraining/HyperTwistTrainingTypes.h" +#include "HyperTwistCoachDashboardActor.generated.h" + +class UHyperTwistCoachDashboardWidget; + +UCLASS(BlueprintType, Blueprintable) +class UNREALHYPERTWIST_API AHyperTwistCoachDashboardActor : public AActor +{ + GENERATED_BODY() + +public: + AHyperTwistCoachDashboardActor(); + + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + bool bCreateDashboardOnBeginPlay = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + bool bRemoveDashboardOnEndPlay = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + int32 DashboardZOrder = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + TSubclassOf DashboardWidgetClass; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + bool bRefreshDashboardOnCreate = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + FString DashboardDefaultUserId = TEXT("local-user"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + FString DashboardDefaultSessionId = TEXT("training_session_dashboard"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + EHyperTwistTrainingDeliveryMode DashboardDefaultMode = EHyperTwistTrainingDeliveryMode::Timer; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist|Training|Coach|Dashboard") + int32 DashboardDefaultCoachMaxCases = 5; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|Coach|Dashboard") + TObjectPtr ActiveDashboardWidget = nullptr; + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach|Dashboard") + UHyperTwistCoachDashboardWidget* CreateAndShowDashboard(); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach|Dashboard") + void RemoveDashboard(); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach|Dashboard") + void RefreshDashboard(); + + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + bool HasActiveDashboard() const; + +private: + TSubclassOf ResolveDashboardWidgetClass() const; + void ApplyDashboardDefaults(UHyperTwistCoachDashboardWidget* DashboardWidget) const; +};