From 1c04ae6bd7d2cfed9f38e5bf2e863bbcea7c8fde Mon Sep 17 00:00:00 2001 From: Ange-Marie MAURIN Date: Mon, 14 Jul 2025 02:40:03 +0200 Subject: [PATCH] Added Blank Delegate for split Sensors + Added Getters for Contest/Stage/Split rankings for 1 participant + Global Cleaning --- .../Widget/DTFluxAssetModelDetailsWidget.cpp | 55 +++++------ .../Widget/DTFluxAssetModelDetailsWidget.h | 13 +-- .../Public/Types/Enum/DTFluxModelEnums.h | 93 ++++++++++--------- .../Public/Types/Struct/DTFluxFinishData.h | 6 +- .../Types/Struct/DTFluxRankingStructs.h | 4 +- .../Public/Types/Struct/DTFluxSplitSensor.h | 4 +- .../Private/DTFluxCoreSubsystem.cpp | 78 +++++++++++++++- .../Public/DTFluxCoreSubsystem.h | 29 +++++- .../DTFluxUtilities/Private/FTDFluxUtils.cpp | 3 +- 9 files changed, 185 insertions(+), 100 deletions(-) diff --git a/Source/DTFluxAssetsEditor/Private/Widget/DTFluxAssetModelDetailsWidget.cpp b/Source/DTFluxAssetsEditor/Private/Widget/DTFluxAssetModelDetailsWidget.cpp index ccc1403..329d339 100644 --- a/Source/DTFluxAssetsEditor/Private/Widget/DTFluxAssetModelDetailsWidget.cpp +++ b/Source/DTFluxAssetsEditor/Private/Widget/DTFluxAssetModelDetailsWidget.cpp @@ -1,6 +1,7 @@ // Fill out your copyright notice in the Description page of Project Settings. #include "Widget/DTFluxAssetModelDetailsWidget.h" +#include "DTFluxAssetsEditorModule.h" #include "Widgets/Layout/SBorder.h" #include "Widgets/Layout/SBox.h" #include "Widgets/Text/STextBlock.h" @@ -23,19 +24,19 @@ TSharedRef SHierarchicalTreeItemRow::GenerateWidgetForColumn(const FNam { if (!Item.IsValid()) { - UE_LOG(LogTemp, Warning, TEXT("GenerateWidgetForColumn: Invalid item for column %s"), *ColumnName.ToString()); + // UE_LOG(logDTFluxAssetEditor, Warning, TEXT("GenerateWidgetForColumn: Invalid item for column %s"), *ColumnName.ToString()); return SNew(STextBlock).Text(FText::FromString("Invalid Item")); } if (!ParentWidget) { - UE_LOG(LogTemp, Warning, TEXT("GenerateWidgetForColumn: Invalid ParentWidget for column %s"), - *ColumnName.ToString()); + // UE_LOG(logDTFluxAssetEditor, Warning, TEXT("GenerateWidgetForColumn: Invalid ParentWidget for column %s"), + // *ColumnName.ToString()); return SNew(STextBlock).Text(FText::FromString("Invalid Parent")); } - UE_LOG(LogTemp, VeryVerbose, TEXT("GenerateWidgetForColumn: %s for item %s"), - *ColumnName.ToString(), *Item->Name); + // UE_LOG(logDTFluxAssetEditor, VeryVerbose, TEXT("GenerateWidgetForColumn: %s for item %s"), + // *ColumnName.ToString(), *Item->Name); if (ColumnName == "Name") { @@ -93,7 +94,7 @@ TSharedRef SHierarchicalTreeItemRow::GenerateWidgetForColumn(const FNam .OverflowPolicy(ETextOverflowPolicy::Ellipsis); } - UE_LOG(LogTemp, Warning, TEXT("GenerateWidgetForColumn: Unknown column %s"), *ColumnName.ToString()); + UE_LOG(logDTFluxAssetEditor, Warning, TEXT("GenerateWidgetForColumn: Unknown column %s"), *ColumnName.ToString()); return SNew(STextBlock).Text(FText::FromString(FString::Printf(TEXT("Unknown: %s"), *ColumnName.ToString()))); } @@ -411,7 +412,7 @@ void SDTFluxAssetModelDetailsWidget::BuildContestHierarchy() RootItems.Add(ContestItem); } - UE_LOG(LogTemp, Log, TEXT("Built contest hierarchy with %d root contests"), RootItems.Num()); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("Built contest hierarchy with %d root contests"), RootItems.Num()); } void SDTFluxAssetModelDetailsWidget::BuildParticipantList() @@ -420,11 +421,11 @@ void SDTFluxAssetModelDetailsWidget::BuildParticipantList() if (!ModelAsset) { - UE_LOG(LogTemp, Warning, TEXT("BuildParticipantList: ModelAsset is null!")); - return; + UE_LOG(logDTFluxAssetEditor, Warning, TEXT("BuildParticipantList: ModelAsset is null!")); + // return; } - UE_LOG(LogTemp, Log, TEXT("BuildParticipantList: ModelAsset has %d participants"), ModelAsset->Participants.Num()); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("BuildParticipantList: ModelAsset has %d participants"), ModelAsset->Participants.Num()); // Créer la liste des participants (pas de hiérarchie pour les participants) for (const auto& ParticipantPair : ModelAsset->Participants) @@ -433,12 +434,12 @@ void SDTFluxAssetModelDetailsWidget::BuildParticipantList() auto ParticipantItem = FHierarchicalTreeItem::CreateParticipant(Participant); ParticipantItems.Add(ParticipantItem); - UE_LOG(LogTemp, Log, TEXT("BuildParticipantList: Added participant %s (Bib: %d)"), - *ParticipantItem->Name, ParticipantItem->Bib); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("BuildParticipantList: Added participant %s (Bib: %d)"), + // *ParticipantItem->Name, ParticipantItem->Bib); } - UE_LOG(LogTemp, Log, TEXT("BuildParticipantList: Built participant list with %d participants"), - ParticipantItems.Num()); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("BuildParticipantList: Built participant list with %d participants"), + // ParticipantItems.Num()); } // ===== CALLBACKS TREEVIEW ===== @@ -448,12 +449,12 @@ TSharedRef SDTFluxAssetModelDetailsWidget::OnGenerateRowForTree( { if (!Item.IsValid()) { - UE_LOG(LogTemp, Warning, TEXT("OnGenerateRowForTree: Invalid item!")); + UE_LOG(logDTFluxAssetEditor, Warning, TEXT("OnGenerateRowForTree: Invalid item!")); return SNew(STableRow, OwnerTable); } - UE_LOG(LogTemp, Log, TEXT("OnGenerateRowForTree: Generating row for %s (Type: %d)"), - *Item->Name, (int32)Item->Type); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("OnGenerateRowForTree: Generating row for %s (Type: %d)"), + // *Item->Name, (int32)Item->Type); return SNew(SHierarchicalTreeItemRow, OwnerTable) .Item(Item) @@ -536,7 +537,7 @@ FReply SDTFluxAssetModelDetailsWidget::OnExpandAllClicked() } } - UE_LOG(LogTemp, Log, TEXT("Expanded all contests")); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("Expanded all contests")); return FReply::Handled(); } @@ -550,14 +551,14 @@ FReply SDTFluxAssetModelDetailsWidget::OnCollapseAllClicked() } } - UE_LOG(LogTemp, Log, TEXT("Collapsed all contests")); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("Collapsed all contests")); return FReply::Handled(); } FReply SDTFluxAssetModelDetailsWidget::OnRefreshClicked() { RefreshData(); - UE_LOG(LogTemp, Log, TEXT("Data refreshed")); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("Data refreshed")); return FReply::Handled(); } @@ -567,21 +568,17 @@ void SDTFluxAssetModelDetailsWidget::RefreshData() { if (!ModelAsset) { - UE_LOG(LogTemp, Warning, TEXT("ModelAsset is null!")); + UE_LOG(logDTFluxAssetEditor, Warning, TEXT("ModelAsset is null!")); return; } - UE_LOG(LogTemp, Log, TEXT("RefreshData: Starting refresh for ModelAsset %s"), *ModelAsset->GetName()); - - // Nettoyer les données existantes + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("RefreshData: Starting refresh for ModelAsset %s"), *ModelAsset->GetName()); RootItems.Empty(); ParticipantItems.Empty(); - // Construire la hiérarchie BuildContestHierarchy(); BuildParticipantList(); - // Refresh les vues if (ContestTreeView.IsValid()) { ContestTreeView->RequestTreeRefresh(); @@ -591,9 +588,8 @@ void SDTFluxAssetModelDetailsWidget::RefreshData() { ParticipantTreeView->RequestTreeRefresh(); } - - UE_LOG(LogTemp, Log, TEXT("RefreshData: Completed successfully - %d contests, %d participants"), RootItems.Num(), - ParticipantItems.Num()); + // UE_LOG(logDTFluxAssetEditor, Log, TEXT("RefreshData: Completed successfully - %d contests, %d participants"), RootItems.Num(), + // ParticipantItems.Num()); } // ===== MÉTHODES UTILITAIRES ===== @@ -635,7 +631,6 @@ FText SDTFluxAssetModelDetailsWidget::GetStatsText() const { if (!ModelAsset) return FText::FromString("No data"); - return FText::FromString(FString::Printf( TEXT("Contests: [%d] Participants: [%d] Persons: [%d]"), ModelAsset->Contests.Num(), diff --git a/Source/DTFluxAssetsEditor/Public/Widget/DTFluxAssetModelDetailsWidget.h b/Source/DTFluxAssetsEditor/Public/Widget/DTFluxAssetModelDetailsWidget.h index 9ec71e1..427c88b 100644 --- a/Source/DTFluxAssetsEditor/Public/Widget/DTFluxAssetModelDetailsWidget.h +++ b/Source/DTFluxAssetsEditor/Public/Widget/DTFluxAssetModelDetailsWidget.h @@ -137,7 +137,7 @@ struct FHierarchicalTreeItem typedef TSharedPtr FHierarchicalTreeItemPtr; /** - * Widget avec STreeView simple et efficace + * ModelAsset TreeviewWidget */ class DTFLUXASSETSEDITOR_API SDTFluxAssetModelDetailsWidget : public SCompoundWidget { @@ -152,40 +152,33 @@ public: void Construct(const FArguments& InArgs); void RefreshData(); - // Méthodes publiques pour la sous-classe Row FSlateColor GetItemTypeColor(FHierarchicalTreeItem::EItemType Type) const; const FSlateBrush* GetItemIcon(FHierarchicalTreeItem::EItemType Type) const; private: - // Données UDTFluxModelAsset* ModelAsset = nullptr; - TArray RootItems; // Contests racines avec hiérarchie - TArray ParticipantItems; // Participants séparés + TArray RootItems; + TArray ParticipantItems; - // Widgets - TreeView simple TSharedPtr> ContestTreeView; TSharedPtr> ParticipantTreeView; TSharedPtr StatsText; TSharedPtr SelectionText; - // Méthodes de construction void BuildContestHierarchy(); void BuildParticipantList(); - // Callbacks TreeView TSharedRef OnGenerateRowForTree(FHierarchicalTreeItemPtr Item, const TSharedRef& OwnerTable); void OnGetChildrenForTree(FHierarchicalTreeItemPtr Item, TArray& OutChildren); void OnTreeSelectionChanged(FHierarchicalTreeItemPtr SelectedItem, ESelectInfo::Type SelectInfo); void OnSetExpansionRecursive(FHierarchicalTreeItemPtr Item, bool bIsExpanded); - // Callbacks des boutons FReply OnRefreshClicked(); FReply OnExpandAllClicked(); FReply OnCollapseAllClicked(); EActiveTimerReturnType ForceInitialLayout(double InCurrentTime, float InDeltaTime); - // Utilitaires FText GetStatsText() const; }; diff --git a/Source/DTFluxCore/Public/Types/Enum/DTFluxModelEnums.h b/Source/DTFluxCore/Public/Types/Enum/DTFluxModelEnums.h index 70aca67..3fafd83 100644 --- a/Source/DTFluxCore/Public/Types/Enum/DTFluxModelEnums.h +++ b/Source/DTFluxCore/Public/Types/Enum/DTFluxModelEnums.h @@ -11,79 +11,80 @@ UENUM(BlueprintType, Category="DTFlux|Model") enum class EDTFluxParticipantStatusType : uint8 { - Normal = 0 UMETA(DisplayName="Normal"), - OutOfRace = 1 UMETA(DisplayName="HorsCourse"), - DSQ = 2 UMETA(DisplayName="Disqualifié"), - DNF = 3 UMETA(DisplayName="Abandon"), - DNS = 4 UMETA(DisplayName="NonPartant"), - NotLinedUp = 5 UMETA(DisplayName="NonPresentAuDépart"), - Unknown = 1 << 4 UMETA(DisplayName="Unknown") + Normal = 0 UMETA(DisplayName="Normal"), + OutOfRace = 1 UMETA(DisplayName="HorsCourse"), + DSQ = 2 UMETA(DisplayName="Disqualifié"), + DNF = 3 UMETA(DisplayName="Abandon"), + DNS = 4 UMETA(DisplayName="NonPartant"), + NotLinedUp = 5 UMETA(DisplayName="NonPresentAuDépart"), + Unknown = 1 << 4 UMETA(DisplayName="Unknown") }; UENUM(BlueprintType, meta=(Bitflags, UseEnumValuesAsMaskValuesInEditor=true)) enum class EParticipantSortingType : uint8 { - - None = 0 << 1 UMETA(DisplayName="Normal"), - Alpha = 1 << 1 UMETA(DisplayName="Aplha"), - PoursuiteStartTime = 1 << 2 UMETA(DisplayName="Poursuite StartTime"), - Rank = 1 << 3 UMETA(DisplayName="Rank"), - IgnoreEmpty = 1 << 4 UMETA(DisplayName="IgnoreEmpty"), + None = 0 << 1 UMETA(DisplayName="Normal"), + Alpha = 1 << 1 UMETA(DisplayName="Aplha"), + PoursuiteStartTime = 1 << 2 UMETA(DisplayName="Poursuite StartTime"), + Rank = 1 << 3 UMETA(DisplayName="Rank"), + IgnoreEmpty = 1 << 4 UMETA(DisplayName="IgnoreEmpty"), }; + ENUM_CLASS_FLAGS(EParticipantSortingType); -UENUM(BlueprintType, meta=(Bitflags, UseEnumValuesAsMaskValuesInEditor=true)) +UENUM(BlueprintType) enum class EDTFluxFinisherType : uint8 { - None = 0b0000000 UMETA(DisplayName="Unknown"), - Finish = 0b0000001 UMETA(DisplayName="Finish"), - Winner = 0b0000010 UMETA(DisplayName="Winner"), - Spotter = 0b0000100 UMETA(DisplayName="Spotter"), + None = 0b0000000 UMETA(DisplayName="Unknown"), + Finish = 0b0000001 UMETA(DisplayName="Finish"), + Winner = 0b0000010 UMETA(DisplayName="Winner"), + Spotter = 0b0000100 UMETA(DisplayName="Spotter"), }; -ENUM_CLASS_FLAGS(EDTFluxFinisherType); UENUM(BlueprintType, meta=(Bitflags, UseEnumValuesAsMaskValuesInEditor=true)) enum class EDTFluxSplitType : uint8 { - None = 0b00000000 UMETA(DisplayName="Undefined"), - PreFinnish = 0b00000001 UMETA(DisplayName="PreFinnishSplit"), - Finish = 0b00000010 UMETA(DisplayName="FinishSplit"), - Regular = 0b00000100 UMETA(DisplayName="Regular"), + None = 0b00000000 UMETA(DisplayName="Undefined"), + PreFinnish = 0b00000001 UMETA(DisplayName="PreFinnishSplit"), + Finish = 0b00000010 UMETA(DisplayName="FinishSplit"), + Regular = 0b00000100 UMETA(DisplayName="Regular"), }; + ENUM_CLASS_FLAGS(EDTFluxSplitType); UENUM(BlueprintType, meta=(Bitflags, UseEnumValuesAsMaskValuesInEditor=true)) -enum class EDTFluxSortingFilter : uint8 +enum class EDTFluxSortingFilter : uint8 { - None = 0b00000000 UMETA(DisplayName="No Sorting"), - IgnoreStatusOut = 0b00000001 UMETA(DisplayName="IgnoreStatusOut"), - Ascending = 0b00000010 UMETA(DisplayName="Ascending"), - Descending = 0b00000100 UMETA(DisplayName="Descending"), - IgnoreEmpty = 0b00001000 UMETA(DisplayName="IgnoreEmpty"), - ByRank = 0b00010000 UMETA(DisplayName="ByRank"), - ByAlpha = 0b01000000 UMETA(DisplayName="ByAlpha"), - ByStartTime = 0b00100000 UMETA(DisplayName="ByStartTime"), - AscendingByRank = Ascending | ByRank UMETA(DisplayName="AscendingByRank"), - DescendingByRank= Descending | ByRank UMETA(DisplayName="DescendingByRank") + None = 0b00000000 UMETA(DisplayName="No Sorting"), + IgnoreStatusOut = 0b00000001 UMETA(DisplayName="IgnoreStatusOut"), + Ascending = 0b00000010 UMETA(DisplayName="Ascending"), + Descending = 0b00000100 UMETA(DisplayName="Descending"), + IgnoreEmpty = 0b00001000 UMETA(DisplayName="IgnoreEmpty"), + ByRank = 0b00010000 UMETA(DisplayName="ByRank"), + ByAlpha = 0b01000000 UMETA(DisplayName="ByAlpha"), + ByStartTime = 0b00100000 UMETA(DisplayName="ByStartTime"), + AscendingByRank = Ascending | ByRank UMETA(DisplayName="AscendingByRank"), + DescendingByRank = Descending | ByRank UMETA(DisplayName="DescendingByRank") }; + ENUM_CLASS_FLAGS(EDTFluxSortingFilter); UENUM(BlueprintType) enum class EDTFluxSortingRankingType: uint8 { - Rank = 0b00000000 UMETA(DisplayName="Rank (Default)"), - Name = 0b00000001 UMETA(DisplayName="Name"), - Bib = 0b00000010 UMETA(DisplayName="Bib"), - TimeSwim = 0b00000100 UMETA(DisplayName="Swimming Time"), - TimeTransition = 0b00001000 UMETA(DisplayName="Transition Time"), - TimeRun = TimeSwim|TimeTransition UMETA(DisplayName="Running Time"), - StartTime = 0b00001110 UMETA(DisplayName="StartTime"), - Gap = 0b00010000 UMETA(DisplayName="StartTime"), - SwimSpeed = 0b00100000 UMETA(DisplayName="StartTime"), - RunningSpeed = 0b01000000 UMETA(DisplayName="StartTime"), - TotalSpeed = 0b10000000 UMETA(DisplayName="StartTime"), -}; \ No newline at end of file + Rank = 0b00000000 UMETA(DisplayName="Rank (Default)"), + Name = 0b00000001 UMETA(DisplayName="Name"), + Bib = 0b00000010 UMETA(DisplayName="Bib"), + TimeSwim = 0b00000100 UMETA(DisplayName="Swimming Time"), + TimeTransition = 0b00001000 UMETA(DisplayName="Transition Time"), + TimeRun = TimeSwim | TimeTransition UMETA(DisplayName="Running Time"), + StartTime = 0b00001110 UMETA(DisplayName="StartTime"), + Gap = 0b00010000 UMETA(DisplayName="StartTime"), + SwimSpeed = 0b00100000 UMETA(DisplayName="StartTime"), + RunningSpeed = 0b01000000 UMETA(DisplayName="StartTime"), + TotalSpeed = 0b10000000 UMETA(DisplayName="StartTime"), +}; diff --git a/Source/DTFluxCore/Public/Types/Struct/DTFluxFinishData.h b/Source/DTFluxCore/Public/Types/Struct/DTFluxFinishData.h index 003dcf0..78a78e1 100644 --- a/Source/DTFluxCore/Public/Types/Struct/DTFluxFinishData.h +++ b/Source/DTFluxCore/Public/Types/Struct/DTFluxFinishData.h @@ -15,6 +15,7 @@ USTRUCT(BlueprintType, Category="DTFlux|Model") struct DTFLUXCORE_API FDTFluxFinisherData { GENERATED_BODY() + public: UPROPERTY(BlueprintReadWrite, Category="DTFlux|Model") int ContestId; @@ -23,9 +24,7 @@ public: UPROPERTY(BlueprintReadWrite, Category="DTFlux|Model") int Bib = -1; UPROPERTY(BlueprintReadWrite, Category="DTFlux|Model") - FDTFluxStageRanking SplitRanking; - UPROPERTY(BlueprintReadWrite, Category="DTFlux|Model") - FDTFluxStageRanking StageRanking; + FString Time; }; USTRUCT(BlueprintType, Category="FDTFlux|Model") @@ -64,4 +63,3 @@ struct DTFLUXCORE_API FDTFluxContestFinished UPROPERTY(BlueprintReadOnly, Category="DTFlux|Subsystem|Events") TArray Rankings; }; - diff --git a/Source/DTFluxCore/Public/Types/Struct/DTFluxRankingStructs.h b/Source/DTFluxCore/Public/Types/Struct/DTFluxRankingStructs.h index ff5fc01..3232676 100644 --- a/Source/DTFluxCore/Public/Types/Struct/DTFluxRankingStructs.h +++ b/Source/DTFluxCore/Public/Types/Struct/DTFluxRankingStructs.h @@ -57,7 +57,7 @@ public: }; /** - * @struct FDTFluxStageRanking + * @struct FDTFluxDetailedRankingItem * Representing a stage ranking for a participant */ USTRUCT(BlueprintType, Category="DTFlux|Model") @@ -125,7 +125,7 @@ struct FDTFluxStageRanking : public FDTFluxDetailedRankingItem * This struct is only a cosmetic Struct */ USTRUCT(BlueprintType, Category="DTFlux|Model") -struct DTFLUXCORE_API FDTFluxSplitRanking : public FDTFluxStageRanking +struct DTFLUXCORE_API FDTFluxSplitRanking : public FDTFluxDetailedRankingItem { GENERATED_BODY() }; diff --git a/Source/DTFluxCore/Public/Types/Struct/DTFluxSplitSensor.h b/Source/DTFluxCore/Public/Types/Struct/DTFluxSplitSensor.h index a1dc0f3..9aaa3f0 100644 --- a/Source/DTFluxCore/Public/Types/Struct/DTFluxSplitSensor.h +++ b/Source/DTFluxCore/Public/Types/Struct/DTFluxSplitSensor.h @@ -17,7 +17,7 @@ struct FDTFluxSplitSensorInfo public: FDTFluxSplitSensorInfo() = default; - + UPROPERTY(BlueprintReadOnly, VisibleAnywhere) int Bib = -1; UPROPERTY(BlueprintReadOnly, VisibleAnywhere) @@ -32,6 +32,4 @@ public: FString Gap = "-"; UPROPERTY(BlueprintReadOnly, VisibleAnywhere) int Rank; - }; - diff --git a/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp b/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp index 4238f88..f45cc22 100644 --- a/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp +++ b/Source/DTFluxCoreSubsystem/Private/DTFluxCoreSubsystem.cpp @@ -288,6 +288,76 @@ void UDTFluxCoreSubsystem::SendRequest(const FString& Message) } } +bool UDTFluxCoreSubsystem::GetStageRankingForBib(const int ContestId, const int StageId, const int Bib, + FDTFluxStageRanking& OutStageRanking) +{ + if (DataStorage) + { + FDTFluxStageKey StageKey(ContestId, StageId); + if (DataStorage->StageRankings.Contains(StageKey)) + { + FDTFluxStageRankings StageRankings = DataStorage->StageRankings[StageKey]; + for (auto& Ranking : StageRankings.Rankings) + { + if (Ranking.Bib == Bib) + { + OutStageRanking = static_cast(Ranking); + return true; + } + } + } + UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Unable to find StageRanking for Bib %i"), Bib); + return false; + } + UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DataStorage not available")); + return false; +} + +bool UDTFluxCoreSubsystem::GetSplitRankingForBib(const int ContestId, const int StageId, const int SplitId, + const int Bib, FDTFluxSplitRanking& OutSplitRankings) +{ + if (DataStorage) + { + FDTFluxSplitKey SplitKey(ContestId, StageId, SplitId); + if (DataStorage->SplitRankings.Contains(SplitKey)) + { + FDTFluxSplitRankings SplitRankings = DataStorage->SplitRankings[SplitKey]; + for (auto& Ranking : SplitRankings.Rankings) + { + if (Ranking.Bib == Bib) + { + OutSplitRankings = static_cast(Ranking); + return true; + } + } + } + UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Unable to find SplitRanking for Bib %i"), Bib); + return false; + } + UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DataStorage not available")); + return false; +} + +bool UDTFluxCoreSubsystem::GetContestRanking(const int ContestId, FDTFluxContestRanking& OutContestRanking) +{ + if (DataStorage) + { + FDTFluxContest Contest; + if (GetContestForId(ContestId, Contest)) + { + for (auto& Ranking : DataStorage->ContestRankings[ContestId].Rankings) + { + OutContestRanking = Ranking; + return true; + } + } + UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Unable to find ContestRanking for ContestId %i"), ContestId); + return false; + } + UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DataStorage not available")); + return false; +} + bool UDTFluxCoreSubsystem::GetContestRankings(const int ContestId, FDTFluxContestRankings& OutContestRankings) { @@ -468,13 +538,15 @@ TArray UDTFluxCoreSubsystem::TrackedRequestSplitRankings(const TArray(); } -const FDTFluxParticipant UDTFluxCoreSubsystem::GetParticipant(int InBib) +bool UDTFluxCoreSubsystem::GetParticipant(int InBib, FDTFluxParticipant& OutParticipant) { if (DataStorage->Participants.Contains(InBib)) { - return DataStorage->Participants[InBib]; + OutParticipant = DataStorage->Participants[InBib]; + return true; } - return FDTFluxParticipant(); + + return false; } TArray UDTFluxCoreSubsystem::GetCurrentContestsId() diff --git a/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h b/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h index 753691a..0f17fd7 100644 --- a/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h +++ b/Source/DTFluxCoreSubsystem/Public/DTFluxCoreSubsystem.h @@ -59,6 +59,33 @@ public: UPROPERTY(BlueprintReadOnly, Category="DTFlux|Core Subsystem") UDTFluxPursuitManager* PursuitManager = nullptr; + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSplitSensor, FDTFluxSplitSensorInfo, SplitSensorInfo); + + UPROPERTY(BlueprintReadOnly, Category="DTFlux|Core Subsystem") + FOnSplitSensor OnSplitSensor; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnFinisher, FDTFluxSplitSensorInfo, SplitSensorInfo); + + UPROPERTY(BlueprintReadOnly, Category="DTFlux|Core Subsystem") + FOnFinisher OnFinisher; + + DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnWinner, FDTFluxSplitSensorInfo, SplitSensorInfo); + + UPROPERTY(BlueprintReadOnly, Category="DTFlux|Core Subsystem") + FOnWinner OnWinner; + + + UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") + bool GetStageRankingForBib(const int ContestId, const int StageId, const int Bib, + FDTFluxStageRanking& OutStageRankings); + + UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") + bool GetSplitRankingForBib(const int ContestId, const int StageId, const int SplitId, const int Bib, + FDTFluxSplitRanking& OutSplitRankings); + + UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") + bool GetContestRanking(const int ContestId, FDTFluxContestRanking& OutContestRanking); + UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") bool GetContestRankings(const int ContestId, FDTFluxContestRankings& OutContestRankings); @@ -88,7 +115,7 @@ public: UFUNCTION(BlueprintCallable, Category="DTFlux|Core Subsystem") - const FDTFluxParticipant GetParticipant(int InBib); + bool GetParticipant(int InBib, FDTFluxParticipant& OutParticipant); //TODO : this must be a ProjectSetting UPROPERTY(BlueprintReadOnly, Category="DTFlux|Core Subsystem") diff --git a/Source/DTFluxUtilities/Private/FTDFluxUtils.cpp b/Source/DTFluxUtilities/Private/FTDFluxUtils.cpp index 3755425..c7a22fa 100644 --- a/Source/DTFluxUtilities/Private/FTDFluxUtils.cpp +++ b/Source/DTFluxUtilities/Private/FTDFluxUtils.cpp @@ -9,7 +9,8 @@ FText UFTDFluxUtils::GetFormatedName(const int& Bib, const int MaxChar, const FS const FString OverFlowChar) { UDTFluxCoreSubsystem* CoreSubsystem = GEngine->GetEngineSubsystem(); - const FDTFluxParticipant OutParticipant = CoreSubsystem->GetParticipant(Bib); + FDTFluxParticipant OutParticipant; + CoreSubsystem->GetParticipant(Bib, OutParticipant); return OutParticipant.GetFormattedNameText(MaxChar, Separator, OverFlowChar); }