// Fill out your copyright notice in the Description page of Project Settings. #include "widgets/DTFluxStatusWidget.h" #include "SlateOptMacros.h" #include "DTFluxAPIStatusModule.h" #include "DTFluxCoreSubsystem.h" #include "ISettingsModule.h" #include "MovieSceneSequenceID.h" #include "OutputLogCreationParams.h" #include "OutputLogModule.h" #include "Types/Enum/DTFluxCoreEnum.h" #include "Subsystems/DTFluxNetworkSubsystem.h" #include "Framework/MultiBox/MultiBoxBuilder.h" BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SDTFluxStatusWidget::OnOpenSettingsClicked() { UE_LOG(logDTFluxStatus, Warning, TEXT("Settings Clicked !!!!")); ISettingsModule& SettingsModule = FModuleManager::LoadModuleChecked("Settings"); SettingsModule.ShowViewer("Project", "DTFluxProjectSettings", "DTFluxNetworkSettings"); } FReply SDTFluxStatusWidget::OnRaceDatasClicked() { DTFluxNetwork->SendRequest(EDTFluxRequestType::RaceData); return FReply::Handled(); } FReply SDTFluxStatusWidget::OnTeamListClicked() { DTFluxNetwork->SendRequest(EDTFluxRequestType::TeamList); return FReply::Handled(); } void SDTFluxStatusWidget::Construct(const FArguments& InArgs) { DTFluxNetwork = GEngine->GetEngineSubsystem(); DTFluxCore = GEngine->GetEngineSubsystem(); ConnectionActionButtonText.Set( DTFluxNetwork->WsStatus != EDTFluxConnectionStatus::Connected ? FText::FromString("Connect") : FText::FromString("Disconnect") ); FOutputLogModule& OutputLogModule = FModuleManager::LoadModuleChecked("OutputLog"); const FOutputLogCreationParams Params; bCanSupportFocus = true; PopulateComboBoxItems(); FSlimHorizontalToolBarBuilder ToolBarBuilder( nullptr, FMultiBoxCustomization::None, nullptr, false ); ToolBarBuilder.BeginSection("Settings"); { ToolBarBuilder.AddToolBarButton( FUIAction(FExecuteAction::CreateSP(this, &SDTFluxStatusWidget::OnOpenSettingsClicked)), NAME_None, INVTEXT("DTFlux Settings"), INVTEXT("Ouvrir les paramètres DTFlux"), FSlateIcon(FAppStyle::GetAppStyleSetName(), "Icons.Settings") ); } ToolBarBuilder.EndSection(); FSlateFontInfo TitleTextFont = FCoreStyle::Get().GetFontStyle(FName("EmbossedText")); TitleTextFont.Size = 15; ChildSlot [ SNew(SBorder) .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder")) [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() [ #pragma region ToolBarSection SNew(SBox) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(2.0) [ SNew(SSpacer) ] + SHorizontalBox::Slot() .AutoWidth() .FillWidth(1.0) .VAlign(VAlign_Center) .HAlign(HAlign_Right) [ ToolBarBuilder.MakeWidget() ] ] #pragma endregion ] + SVerticalBox::Slot() .AutoHeight() [ #pragma region WebsocketStatusSection SNew(SBorder) .Padding(6.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .VAlign(VAlign_Center) .HAlign(HAlign_Center) .MaxWidth(175.0) .MinWidth(150.0) [ SNew(STextBlock) .Text(FText::FromString(TEXT("Websocket connection :"))) .Justification(ETextJustify::Left) ] + SHorizontalBox::Slot() .VAlign(VAlign_Center) .MinWidth(50.0) .MaxWidth(100.0) [ SAssignNew(WsStatusText, STextBlock) .Text(this, &SDTFluxStatusWidget::GetWebSocketStatusText) .Justification(ETextJustify::Left) .ColorAndOpacity(this, &SDTFluxStatusWidget::GetWebSocketStatusColor) ] + SHorizontalBox::Slot() .MaxWidth(100.0) .MinWidth(30.0) [ SAssignNew(ConnectionActionButton, SButton) .Text(this, &SDTFluxStatusWidget::GetWebConnectActionButtonText) .ForegroundColor_Raw(this, &SDTFluxStatusWidget::GetWebConnectActionButtonColor) .OnClicked(this, &SDTFluxStatusWidget::OnConnectionActionButtonClicked) .VAlign(VAlign_Center) .HAlign(HAlign_Center) .ContentPadding(1.5f) ] ] #pragma endregion ] + SVerticalBox::Slot() .VAlign(VAlign_Fill) .HAlign(HAlign_Fill) .AutoHeight() [ #pragma region DataModelControlSection SNew(SBorder) .Padding(6.0f) .BorderImage(FAppStyle::GetBrush("ToolPanel.DarkGroupBorder")) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() [ SNew(SButton) .Text(FText::FromString("Get RaceDatas")) .OnClicked(this, &SDTFluxStatusWidget::OnRaceDatasClicked) ] + SHorizontalBox::Slot() [ SNew(SButton) .Text(FText::FromString("Get TeamList")) .OnClicked(this, &SDTFluxStatusWidget::OnTeamListClicked) ] ] #pragma endregion ] + SVerticalBox::Slot() .VAlign(VAlign_Fill) .HAlign(HAlign_Fill) .AutoHeight() [ #pragma region RankingSection SNew(SBorder) .Padding(6.0f) .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder")) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() [ SNew(SBorder) .Padding(6.0f) .BorderImage(FAppStyle::GetBrush("ToolPanel.DarkGroupBorder")) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .VAlign(VAlign_Center) .HAlign(HAlign_Left) .AutoWidth() [ SNew(STextBlock) .Text(FText::FromString(TEXT("Contest Rankings:"))) .Margin(FMargin(0.0f, 0.0f, 8.0f, 0.0f)) ] + SHorizontalBox::Slot() .VAlign(VAlign_Center) .FillWidth(1.0f) .MaxWidth(200.0f) [ SNew(SBorder) .BorderImage(FAppStyle::GetBrush("ToolPanel.GroupBorder")) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .VAlign(VAlign_Center) [ SAssignNew(ContestComboBox, SComboBox>) .OptionsSource(&ContestComboBoxItems) .OnGenerateWidget(this, &SDTFluxStatusWidget::OnGeneRankingComboWidget) .OnSelectionChanged(this, &SDTFluxStatusWidget::OnComboContestRankingChanged) .Content() [ SNew(STextBlock) .Text(this, &SDTFluxStatusWidget::GetCurrContestComboBoxValue) ] ] ] ] + SHorizontalBox::Slot() .VAlign(VAlign_Center) .AutoWidth() .Padding(FMargin(8.0f, 0.0f, 0.0f, 0.0f)) [ SNew(SButton) .Text(FText::FromString(TEXT("RequestRanking"))) .OnClicked(this, &SDTFluxStatusWidget::OnRankingButtonClicked) .ContentPadding(FMargin(12.0f, 4.0f)) .VAlign(VAlign_Center) .HAlign(HAlign_Center) ] ] ] ] #pragma endregion ] + SVerticalBox::Slot() .FillHeight(1.0f) .Padding(3.0f) [ OutputLogModule.MakeOutputLogWidget(Params) ] ] ]; } FText SDTFluxStatusWidget::GetWebSocketStatusText() const { FString Status = UEnum::GetDisplayValueAsText(DTFluxNetwork->WsStatus).ToString(); return FText::FromString(Status); // FText::FromString("Unknown"); } FText SDTFluxStatusWidget::GetWebConnectActionButtonText() const { switch (DTFluxNetwork->WsStatus) { case EDTFluxConnectionStatus::Connected: return FText::FromString("Disconnect"); default: return FText::FromString("Connect"); } } FReply SDTFluxStatusWidget::OnConnectionActionButtonClicked() { if (DTFluxNetwork) { switch (DTFluxNetwork->WsStatus) { case EDTFluxConnectionStatus::Connected: DTFluxNetwork->Reconnect(); break; default: DTFluxNetwork->Connect(); break; } } return FReply::Handled(); } FSlateColor SDTFluxStatusWidget::GetWebSocketStatusColor() const { FColor Color; switch (DTFluxNetwork->WsStatus) { case EDTFluxConnectionStatus::Unset: Color = FColor::Orange; break; case EDTFluxConnectionStatus::Connected: Color = FColor::Green; break; case EDTFluxConnectionStatus::NotConnected: Color = FColor::Orange; break; case EDTFluxConnectionStatus::Closed: Color = FColor::Magenta; break; default: Color = FColor::Red; break; } return FSlateColor(Color); } FSlateColor SDTFluxStatusWidget::GetWebConnectActionButtonColor() const { FColor Color = FColor::Green; switch (DTFluxNetwork->WsStatus) { case EDTFluxConnectionStatus::Connected: Color = FColor::Red; break; default: Color = FColor::Green; break; } return FSlateColor(Color); } void SDTFluxStatusWidget::PopulateComboBoxItems() { ContestComboBoxItems.Empty(); if (DTFluxNetwork) { FString Separator = " | "; FString RootSeparator = " -> "; TArray DataFromSubsystem = TArray(); DTFluxCore->GetContests(DataFromSubsystem); for (const auto& Contest : DataFromSubsystem) { ContestComboBoxItems.Add( FComboBoxItem::CreateItem(EComboBoxItemType::Contest, Contest.Name + RootSeparator, Contest.ContestId)); for (const auto& Stage : Contest.Stages) { int StageId = Stage.StageId; FString StageDisplayName = Contest.Name + Separator + Stage.Name; ContestComboBoxItems.Add(FComboBoxItem::CreateItem(EComboBoxItemType::Stage, StageDisplayName + RootSeparator, Contest.ContestId, StageId)); for (const auto& Split : Contest.Splits) { ContestComboBoxItems.Add(FComboBoxItem::CreateItem(EComboBoxItemType::Split, StageDisplayName + Separator + Split.Name, Contest.ContestId, StageId, Split.SplitId)); } } } } if (ContestComboBox.IsValid()) { ContestComboBox->RefreshOptions(); if (ContestComboBoxItems.Num() > 0) { ContestComboBox->SetSelectedItem(ContestComboBoxItems[0]); SelectedContestComboBoxItem = ContestComboBoxItems[0]; } } } TSharedRef SDTFluxStatusWidget::OnGeneRankingComboWidget(TSharedPtr InItem) { return SNew(STextBlock) .Text(FText::FromString(InItem->DisplayText)) .ColorAndOpacity(GetComboItemRankingColor(InItem)) .Margin(FMargin(2.0f, 1.0f)); } void SDTFluxStatusWidget::OnComboContestRankingChanged(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) { SelectedContestComboBoxItem = NewSelection; } FText SDTFluxStatusWidget::GetCurrContestComboBoxValue() const { if (SelectedContestComboBoxItem.IsValid()) { return FText::FromString(SelectedContestComboBoxItem->DisplayText); } return FText::FromString("None"); } FSlateColor SDTFluxStatusWidget::GetComboItemRankingColor(const TSharedPtr Item) { switch (Item->Type) { case EComboBoxItemType::Contest: return FSlateColor(FLinearColor(0.2f, 0.6f, 1.0f)); case EComboBoxItemType::Stage: return FSlateColor(FLinearColor(0.2f, 0.8f, 0.2f)); case EComboBoxItemType::Split: return FSlateColor(FLinearColor(1.0f, 0.8f, 0.2f)); case EComboBoxItemType::None: return FSlateColor(FLinearColor(0.6f, 0.28f, 0.28f)); default: return FSlateColor(FLinearColor::White); } } FReply SDTFluxStatusWidget::OnRankingButtonClicked() const { if (DTFluxCore) { // Exemple d'envoi de requête basée sur la sélection int ForContest = SelectedContestComboBoxItem.IsValid() ? SelectedContestComboBoxItem->ContestId : -1; int ForStage = SelectedContestComboBoxItem.IsValid() ? SelectedContestComboBoxItem->StageId : -1; int ForSplit = SelectedContestComboBoxItem.IsValid() ? SelectedContestComboBoxItem->SplitId : -1; EDTFluxApiDataType RequestType = EDTFluxApiDataType::None; if (ForContest == -1) { UE_LOG(logDTFluxStatus, Error, TEXT("Contest not selected !!!!")); return FReply::Handled(); } if (ForStage == -1) { UE_LOG(logDTFluxStatus, Warning, TEXT("Stage not selected !!!! Requesting contest Ranking")); DTFluxCore->TrackedRequestContestRankings({ForContest}); return FReply::Handled(); } if (ForSplit == -1) { UE_LOG(logDTFluxStatus, Warning, TEXT("Split not selected !!!! Requesting stage Ranking")); FDTFluxStageKey StageKey = {ForContest, ForStage}; DTFluxCore->TrackedRequestStageRankings({StageKey}); return FReply::Handled(); } FDTFluxSplitKey SplitKey = {ForContest, ForStage, ForSplit}; DTFluxCore->TrackedRequestSplitRankings({SplitKey}); UE_LOG(logDTFluxStatus, Warning, TEXT("Requesting %s Ranking"), *UEnum::GetValueAsString(RequestType)); } return FReply::Handled(); } END_SLATE_FUNCTION_BUILD_OPTIMIZATION