Fixing Various Bugs On Delegates
This commit is contained in:
448
Source/DTFluxAPIStatus/Private/widgets/DTFluxStatusWidget.cpp
Normal file
448
Source/DTFluxAPIStatus/Private/widgets/DTFluxStatusWidget.cpp
Normal file
@ -0,0 +1,448 @@
|
||||
// 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<ISettingsModule>("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<UDTFluxNetworkSubsystem>();
|
||||
DTFluxCore =
|
||||
GEngine->GetEngineSubsystem<UDTFluxCoreSubsystem>();
|
||||
ConnectionActionButtonText.Set(
|
||||
DTFluxNetwork->WsStatus != EDTFluxConnectionStatus::Connected
|
||||
? FText::FromString("Connect")
|
||||
: FText::FromString("Disconnect")
|
||||
);
|
||||
FOutputLogModule& OutputLogModule = FModuleManager::LoadModuleChecked<FOutputLogModule>("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<TSharedPtr<FComboBoxItem>>)
|
||||
.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<FDTFluxContest> DataFromSubsystem = DTFluxCore->GetContests();
|
||||
|
||||
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<SWidget> SDTFluxStatusWidget::OnGeneRankingComboWidget(TSharedPtr<FComboBoxItem> InItem)
|
||||
{
|
||||
return SNew(STextBlock)
|
||||
.Text(FText::FromString(InItem->DisplayText))
|
||||
.ColorAndOpacity(GetComboItemRankingColor(InItem))
|
||||
.Margin(FMargin(2.0f, 1.0f));
|
||||
}
|
||||
|
||||
void SDTFluxStatusWidget::OnComboContestRankingChanged(TSharedPtr<FComboBoxItem> 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<FComboBoxItem> 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 (DTFluxNetwork)
|
||||
{
|
||||
// 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"));
|
||||
RequestType = EDTFluxApiDataType::ContestRanking;
|
||||
DTFluxNetwork->SendRequest(RequestType, ForContest);
|
||||
return FReply::Handled();
|
||||
}
|
||||
RequestType = ForSplit == -1 ? EDTFluxApiDataType::StageRanking : EDTFluxApiDataType::SplitRanking;
|
||||
UE_LOG(logDTFluxStatus, Warning, TEXT("Requesting %s Ranking"), *UEnum::GetValueAsString(RequestType));
|
||||
DTFluxNetwork->SendRequest(RequestType, ForContest, ForStage, ForSplit);
|
||||
}
|
||||
|
||||
return FReply::Handled();
|
||||
}
|
||||
|
||||
|
||||
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
||||
@ -0,0 +1,43 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "widgets/styles/DTFluxStatusStyle.h"
|
||||
|
||||
#include "Interfaces/IPluginManager.h"
|
||||
#include "Styling/SlateStyleRegistry.h"
|
||||
#include "Styling/SlateStyleMacros.h"
|
||||
|
||||
#define RootToContentDir Style->RootToContentDir
|
||||
|
||||
TSharedPtr<ISlateStyle> FDTFluxStatusStyle::StyleSet = nullptr;
|
||||
|
||||
void FDTFluxStatusStyle::RegisterStyle()
|
||||
{
|
||||
if (StyleSet.IsValid()) return;
|
||||
|
||||
StyleSet = Create();
|
||||
FSlateStyleRegistry::RegisterSlateStyle(*StyleSet);
|
||||
}
|
||||
|
||||
void FDTFluxStatusStyle::UnregisterStyle()
|
||||
{
|
||||
if (StyleSet.IsValid())
|
||||
{
|
||||
FSlateStyleRegistry::UnRegisterSlateStyle(*StyleSet);
|
||||
ensure(StyleSet.IsUnique());
|
||||
StyleSet.Reset();
|
||||
}
|
||||
}
|
||||
|
||||
void FDTFluxStatusStyle::ReloadTextures()
|
||||
{
|
||||
}
|
||||
|
||||
TSharedPtr<ISlateStyle> FDTFluxStatusStyle::Create()
|
||||
{
|
||||
TSharedPtr<FSlateStyleSet> Style = MakeShareable(new FSlateStyleSet("DTFluxAPIStatusStyle"));
|
||||
Style->SetContentRoot(IPluginManager::Get().FindPlugin("DTFluxAPI")->GetBaseDir() / TEXT("Resources"));
|
||||
|
||||
Style->Set("LevelEditor.Tab.Icon", new IMAGE_BRUSH_SVG("DTFluxServerStatusWhite", FVector2d(16)));
|
||||
return Style;
|
||||
}
|
||||
Reference in New Issue
Block a user