Adding Status and Last server response handled but not tested

This commit is contained in:
2025-07-03 17:28:51 +02:00
parent 2855fa1e98
commit fa5493adcf
43 changed files with 2035 additions and 379 deletions

View File

@ -0,0 +1,34 @@
using UnrealBuildTool;
public class DTFluxAPIStatus : ModuleRules
{
public DTFluxAPIStatus(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
"Projects",
"DTFluxNetwork",
"DTFluxProjectSettings",
"DTFluxCore",
"EditorStyle",
"ToolWidgets", // Nécessaire pour FSlimHorizontalToolBarBuilder
"UnrealEd",
"Settings"
}
);
}
}

View File

@ -0,0 +1,111 @@
#include "DTFluxAPIStatusModule.h"
#include "LevelEditor.h"
#include "widgets/DTFluxStatusWidget.h"
#include "widgets/styles/DTFluxStatusStyle.h"
#define LOCTEXT_NAMESPACE "FDTFluxAPIStatusModule"
DEFINE_LOG_CATEGORY(logDTFluxStatus);
FName DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::StatusTabId = "DTFluxStatusTab";
FText DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::StatusTabDisplayName = FText::FromString(TEXT("DTFlux Status"));
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::StartupModule()
{
InitMenuExtension();
RegisterStatusTab();
FDTFluxStatusStyle::RegisterStyle();
}
#pragma region MenuExtension
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::InitMenuExtension()
{
FLevelEditorModule& LevelEditorModule =
FModuleManager::LoadModuleChecked<FLevelEditorModule>(TEXT("LevelEditor"));
// FDTFluxAPIModule& DTFluxApi =
// FModuleManager::LoadModuleChecked<FDTFluxAPIModule>(TEXT("DTFluxAPI"));
const TSharedPtr<FExtender> MenuExtender = MakeShareable(new FExtender());
MenuExtender->AddMenuBarExtension(
"Help",
EExtensionHook::Before,
nullptr,
FMenuBarExtensionDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::AddMenu)
);
LevelEditorModule.GetMenuExtensibilityManager()->AddExtender(MenuExtender);
}
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::AddMenu(FMenuBarBuilder& MenuBarBuilder)
{
MenuBarBuilder.AddPullDownMenu(
FText::FromString("DTFlux"),
FText::FromString("DTFlux API Tools"),
FNewMenuDelegate::CreateRaw(this, &FDTFluxAPIStatusModule::FillMenu)
);
}
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::FillMenu(FMenuBuilder& MenuBuilder)
{
MenuBuilder.BeginSection(NAME_None, FText::FromString("DTFlux API"));
MenuBuilder.AddMenuEntry(
FText::FromString("Status"),
FText::FromString("Launch DTFlux Status"),
FSlateIcon(FDTFluxStatusStyle::GetStyleSetName(), "LevelEditor.Tab.Icon"),
FExecuteAction::CreateRaw(this, &FDTFluxAPIStatusModule::OnButtonClicked)
);
MenuBuilder.EndSection();
}
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::OnButtonClicked()
{
FGlobalTabmanager::Get()->TryInvokeTab(StatusTabId);
UE_LOG(LogTemp, Log, TEXT("Status Tab Launched"))
}
#pragma endregion EditorTab
#pragma region
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::RegisterStatusTab()
{
FTabSpawnerEntry& SpawnerEntry =
FGlobalTabmanager::Get()->RegisterNomadTabSpawner(
StatusTabId,
FOnSpawnTab::CreateRaw(this, &FDTFluxAPIStatusModule::OnSpawnTab)
)
.SetDisplayName(StatusTabDisplayName)
.SetTooltipText(FText::FromString(TEXT("Status of DTFlux API external connections")));
}
TSharedRef<SDockTab> DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::OnSpawnTab(const FSpawnTabArgs& SpawnTabArgs)
{
return
SNew(
SDockTab
)
.TabRole(ETabRole::NomadTab)
// .ShouldAutosize(true)
[
SNew(SDTFluxStatusWidget)
];
}
#pragma endregion
void DTFLUXAPISTATUS_API FDTFluxAPIStatusModule::ShutdownModule()
{
FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(StatusTabId);
FDTFluxStatusStyle::UnregisterStyle();
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(FDTFluxAPIStatusModule, DTFluxAPIStatus)

View File

@ -0,0 +1,367 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "widgets/DTFluxStatusWidget.h"
#include "SlateOptMacros.h"
#include "DTFluxAPIStatusModule.h"
#include "EditorStyleSet.h"
#include "ISettingsCategory.h"
#include "ISettingsContainer.h"
#include "ISettingsModule.h"
#include "ISettingsSection.h"
#include "Styling/SlateIconFinder.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()
{
DTFlux->SendRequest(EDTFluxRequestType::RaceData);
return FReply::Handled();
}
FReply SDTFluxStatusWidget::OnTeamListClicked()
{
DTFlux->SendRequest(EDTFluxRequestType::TeamList);
return FReply::Handled();
}
void SDTFluxStatusWidget::Construct(const FArguments& InArgs)
{
DTFlux =
GEngine->GetEngineSubsystem<UDTFluxNetworkSubsystem>();
ConnectionActionButtonText.Set(
DTFlux->WsStatus != EDTFluxConnectionStatus::Connected ?
FText::FromString("Connect") :
FText::FromString("Disconnect")
);
bCanSupportFocus = true;
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
[
#pragma region ToolBarSection
SNew(SVerticalBox)
+SVerticalBox::Slot()
.AutoHeight()
[
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
#pragma region WebsocketStatusSection
// Main VerticalBox
+SVerticalBox::Slot()
.AutoHeight()
[
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
#pragma region DataModelControlSection
+SVerticalBox::Slot()
.VAlign(VAlign_Fill)
.HAlign(HAlign_Fill)
.AutoHeight()
[
SNew(SBox)
[
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
#pragma region HTTPStatusSection
// +SVerticalBox::Slot()
// .AutoHeight()
// [
// SNew(SHorizontalBox)
// +SHorizontalBox::Slot()
// [
// SNew(STextBlock)
// .Text(FText::FromString(TEXT("HTTP connection :")))
// .Justification(ETextJustify::Left)
// ]
// +SHorizontalBox::Slot()
// [
// SNew(STextBlock)
// .Text(FText::FromString(TEXT("invalid")))
// .Justification(ETextJustify::Center)
// .ColorAndOpacity(FColor::Red)
// ]
// +SHorizontalBox::Slot()
// [
// SNew(SButton)
// .Text(FText::FromString(TEXT("Connection test")))
// ]
// ]
#pragma endregion
#pragma region ContestsDataSection
// +SVerticalBox::Slot()
// .AutoHeight()
// .VAlign(VAlign_Fill)
// .HAlign(HAlign_Fill)
// [
// SNew(SBorder)
// .Padding(1.5f)
// .VAlign(VAlign_Fill)
// .HAlign(HAlign_Fill)
// [
// SNew(STextBlock)
// .Justification(ETextJustify::Left)
// .Text(FText::FromString("Contest :"))
// .ColorAndOpacity(FColor::White)
// ]
// ]
// +SVerticalBox::Slot()
// .AutoHeight()
// .VAlign(VAlign_Center)
// .HAlign(HAlign_Fill)
// [
// SNew(SBorder)
// .Padding(1.0f)
// .VAlign(VAlign_Center)
// .HAlign(HAlign_Fill)
// [
// SNew(SDatastorageView, DTFlux)
// ]
// ]
#pragma endregion
#pragma region ParticipantsDataSection
// +SVerticalBox::Slot()
// .AutoHeight()
// [
// SNew(SHorizontalBox)
// +SHorizontalBox::Slot()
// [
// SNew(STextBlock)
// .Text(FText::FromString(TEXT("Participants")))
// .Justification(ETextJustify::Left)
// ]
// +SHorizontalBox::Slot()
// [
// SNew(SButton)
// .Text(FText::FromString(TEXT("Show")))
// ]
// ]
#pragma endregion
#pragma region EventsSection
// +SVerticalBox::Slot()
// .AutoHeight()
// [
// SNew(SHorizontalBox)
// +SHorizontalBox::Slot()
// [
// SNew(STextBlock)
// .Text(FText::FromString(TEXT("Future Events")))
// .Justification(ETextJustify::Left)
// ]
// +SHorizontalBox::Slot()
// [
// SNew(SButton)
// .Text(FText::FromString(TEXT("Show")))
// ]
// ]
#pragma endregion
#pragma region SequencesSection
// +SVerticalBox::Slot()
// .AutoHeight()
// [
// SNew(SHorizontalBox)
// +SHorizontalBox::Slot()
// [
// SNew(STextBlock)
// .Text(FText::FromString(TEXT("Sequence On Air")))
// .Justification(ETextJustify::Left)
// ]
// +SHorizontalBox::Slot()
// [
// SNew(SButton)
// .Text(FText::FromString(TEXT("Show")))
// ]
// ]
#pragma endregion
];
}
FText SDTFluxStatusWidget::GetWebSocketStatusText() const
{
FString Status =
UEnum::GetDisplayValueAsText(DTFlux->WsStatus).ToString();
return
FText::FromString(Status);
// FText::FromString("Unknown");
}
FText SDTFluxStatusWidget::GetWebConnectActionButtonText() const
{
switch (DTFlux->WsStatus)
{
case EDTFluxConnectionStatus::Connected:
return FText::FromString("Disconnect");
default:
return FText::FromString("Connect");
}
}
FReply SDTFluxStatusWidget::OnConnectionActionButtonClicked()
{
if(DTFlux)
{
switch (DTFlux->WsStatus)
{
case EDTFluxConnectionStatus::Connected:
DTFlux->Reconnect();
break;
default:
DTFlux->Connect();
break;
}
}
return FReply::Handled();
}
FSlateColor SDTFluxStatusWidget::GetWebSocketStatusColor() const
{
FColor Color;
switch (DTFlux->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 (DTFlux->WsStatus)
{
case EDTFluxConnectionStatus::Connected:
Color = FColor::Red;
break;
default:
Color = FColor::Green;
break;
}
return FSlateColor(Color);
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

View File

@ -0,0 +1,46 @@
// 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;
}

View File

@ -0,0 +1,31 @@
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
DTFLUXAPISTATUS_API DECLARE_LOG_CATEGORY_EXTERN(logDTFluxStatus, All, All);
class DTFLUXAPISTATUS_API FDTFluxAPIStatusModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
#pragma region MenuExtention
void InitMenuExtension();
void AddMenu(FMenuBarBuilder& MenuBarBuilder);
void FillMenu(FMenuBuilder& MenuBuilder);
void OnButtonClicked();
// void OnWsEvent(TEnumAsByte<EDTFluxWsStatus> WsResponseEvent) const;
#pragma endregion
#pragma region EditorTab
void RegisterStatusTab();
TSharedRef<SDockTab> OnSpawnTab(const FSpawnTabArgs& SpawnTabArgs);
private:
static FName StatusTabId;
static FText StatusTabDisplayName;
TSharedPtr<class SDTFluxStatusWidget> StatusWidget;
#pragma endregion
};

View File

@ -0,0 +1,44 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class UDTFluxNetworkSubsystem;
class SSuperListView;
class DTFLUXAPISTATUS_API SDTFluxStatusWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SDTFluxStatusWidget)
{
}
SLATE_END_ARGS()
void OnOpenSettingsClicked();
FReply OnRaceDatasClicked();
FReply OnTeamListClicked();
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
TAttribute<FText> ConnectionActionButtonText;
FReply OnConnectionActionButtonClicked();
private:
UDTFluxNetworkSubsystem* DTFlux = nullptr;
// // TODO make a struct
FText GetWebSocketStatusText() const;
FText GetWebConnectActionButtonText() const;
FSlateColor GetWebSocketStatusColor() const;
FSlateColor GetWebConnectActionButtonColor() const;
TSharedPtr<STextBlock> WsStatusText;
TSharedPtr<SButton> ConnectionActionButton;
};

View File

@ -0,0 +1,35 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Styling/ISlateStyle.h"
/**
*
*/
class DTFLUXAPISTATUS_API FDTFluxStatusStyle
{
public:
static void RegisterStyle();
static void UnregisterStyle();
static void ReloadTextures();
static const ISlateStyle& Get()
{
return *StyleSet;
}
static const FName& GetStyleSetName()
{
return StyleSet->GetStyleSetName();
}
private:
static TSharedPtr<ISlateStyle> Create();
static TSharedPtr<ISlateStyle> StyleSet;
};