Skip to content
Snippets Groups Projects
Commit fb857965 authored by Ehret's avatar Ehret
Browse files

add a list of all conditions of this run to the HUD

parent ff530059
No related branches found
No related tags found
No related merge requests found
No preview for this file type
...@@ -3,7 +3,133 @@ ...@@ -3,7 +3,133 @@
#include "HUD/SFConditionListEntry.h" #include "HUD/SFConditionListEntry.h"
#include "Help/SFUtils.h"
#include "SFGameInstance.h"
void USFConditionListEntry::FillWithCondition(const USFCondition* InCondition)
{
Condition = InCondition;
TArray<FString> Data;
Data.Add(Condition->PhaseName);
Data.Add(FPaths::GetBaseFilename(Condition->Map));
Data.Add(Condition->TimeTaken <= 0.0 ? "-" : FString::FromInt(Condition->TimeTaken));
for (auto Factor : Condition->FactorLevels)
{
Data.Add(Factor.Value);
}
TextBlockIdToDependentVar.Empty();
for (auto DependentVar : Condition->DependentVariablesValues)
{
TextBlockIdToDependentVar.Add(Data.Num() - 3, DependentVar.Key);
//-3 since the first three elements of Data or not mapped to the text fields
Data.Add(DependentVar.Value == "" ? "-" : DependentVar.Value);
}
FillTextsHelper(Data);
IsHeader = false;
}
void USFConditionListEntry::FillAsPhaseHeader(const USFCondition* InCondition)
{
Condition = InCondition;
TArray<FString> Data;
Data.Add("Phase");
Data.Add("Map");
Data.Add("Duration");
for (auto Factor : Condition->FactorLevels)
{
Data.Add(Factor.Key);
}
for (auto DependentVar : Condition->DependentVariablesValues)
{
Data.Add(DependentVar.Key->Name);
}
FillTextsHelper(Data);
GoToButton->SetVisibility(ESlateVisibility::Hidden);
IsHeader = true;
}
void USFConditionListEntry::FillTextsHelper(const TArray<FString>& Data)
{
Phase->SetText(FText::FromString(Data[0]));
Map->SetText(FText::FromString(Data[1]));
Time->SetText(FText::FromString(Data[2]));
int UsedTexts = 0;
TArray<UTextBlock*> Texts = {Text0, Text1, Text2, Text3};
for (int i = 3; i < Data.Num(); ++i)
{
Texts[UsedTexts++]->SetText(FText::FromString(Data[i]));
if (UsedTexts >= Texts.Num())
{
FSFUtils::Log(
"[USFConditionListEntry::FillWithCondition] to few text fields to show everything, " + FString::FromInt(
Condition->FactorLevels.Num() + Condition->DependentVariablesValues.Num()) +
"text fields would be needed.", true);
return;
}
}
//hide unused texts
while (UsedTexts < Texts.Num())
{
Texts[UsedTexts++]->SetVisibility(ESlateVisibility::Collapsed);
}
}
void USFConditionListEntry::GoTo() void USFConditionListEntry::GoTo()
{ {
} }
void USFConditionListEntry::UpdateData()
{
IsActive = USFGameInstance::Get()->GetParticipant()->GetCurrentCondition() == Condition;
IsDone = Condition->bConditionFinished;
TArray<UTextBlock*> Texts = {Text0, Text1, Text2, Text3, Time};
for (int i = 0; i < Texts.Num(); ++i)
{
if (Texts[i]->Text.ToString() != "-")
{
continue;
}
FString NewValue = "";
//if it is "-" check whether we have new data?
if (i == Texts.Num() - 1) //Time
{
if (Condition->TimeTaken <= 0.0)
{
continue;
}
NewValue = FString::FromInt(Condition->TimeTaken);
}
else
{
FString Value = Condition->DependentVariablesValues[TextBlockIdToDependentVar[i]];
if (Value == "")
{
continue;
}
NewValue = Value;
}
Texts[i]->SetText(FText::FromString(NewValue));
}
if (IsHeader)
{
BackgroundColor->SetBrushColor(HeaderColor);
}
else if (IsDone)
{
BackgroundColor->SetBrushColor(DoneColor);
}
else if (IsActive)
{
BackgroundColor->SetBrushColor(ActiveColor);
}
else
{
BackgroundColor->SetBrushColor(DefaultColor);
}
}
...@@ -96,3 +96,8 @@ UButton* USFHUDWidget::GetShowConditionsButton() ...@@ -96,3 +96,8 @@ UButton* USFHUDWidget::GetShowConditionsButton()
{ {
return ShowConditionList; return ShowConditionList;
} }
UScrollBox* USFHUDWidget::GetConditionList()
{
return ConditionList;
}
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include "HUD/SFMasterHUD.h" #include "HUD/SFMasterHUD.h"
#include "HUD/SFConditionListEntry.h"
#include "SFGameInstance.h" #include "SFGameInstance.h"
#include "SFParticipant.h" #include "SFParticipant.h"
#include "SFPlugin.h" #include "SFPlugin.h"
...@@ -22,6 +23,7 @@ void ASFMasterHUD::DrawHUD() ...@@ -22,6 +23,7 @@ void ASFMasterHUD::DrawHUD()
void ASFMasterHUD::BeginPlay() void ASFMasterHUD::BeginPlay()
{ {
//is called also every time the map is changed (a new condition is loaded)
Super::BeginPlay(); Super::BeginPlay();
if (SFWidgetClass) if (SFWidgetClass)
{ {
...@@ -32,17 +34,26 @@ void ASFMasterHUD::BeginPlay() ...@@ -32,17 +34,26 @@ void ASFMasterHUD::BeginPlay()
HUDWidget->AddToViewport(); HUDWidget->AddToViewport();
} }
} }
FHUDSavedData& Data = Cast<USFGameInstance>(GetGameInstance())->HUDSavedData; FHUDSavedData& Data = USFGameInstance::Get()->HUDSavedData;
if (Data.bSet && HUDWidget) if (Data.bSet && HUDWidget)
{ {
HUDWidget->SetData(Data); HUDWidget->SetData(Data);
} }
else
{
HUDWidget->SetStatus("Wait for start");
}
if (USFGameInstance::Get()->IsStarted())
{
HUDWidget->GetStartButton()->SetVisibility(ESlateVisibility::Collapsed);
}
HUDWidget->GetConditionList()->SetVisibility(ESlateVisibility::Collapsed);
HUDWidget->GetStartButton()->OnClicked.AddDynamic(this, &ASFMasterHUD::OnStartButtonPressed); HUDWidget->GetStartButton()->OnClicked.AddDynamic(this, &ASFMasterHUD::OnStartButtonPressed);
HUDWidget->GetNextButton()->OnClicked.AddDynamic(this, &ASFMasterHUD::OnNextButtonPressed); HUDWidget->GetNextButton()->OnClicked.AddDynamic(this, &ASFMasterHUD::OnNextButtonPressed);
HUDWidget->GetShowConditionsButton()->OnClicked.AddDynamic(this, &ASFMasterHUD::OnShowConditionsButtonPressed); HUDWidget->GetShowConditionsButton()->OnClicked.AddDynamic(this, &ASFMasterHUD::OnShowConditionsButtonPressed);
HUDWidget->SetStatus("Wait for start");
} }
void ASFMasterHUD::EndPlay(const EEndPlayReason::Type EndPlayReason) void ASFMasterHUD::EndPlay(const EEndPlayReason::Type EndPlayReason)
...@@ -69,17 +80,14 @@ void ASFMasterHUD::UpdateHUD(USFParticipant* Participant, FString Status) ...@@ -69,17 +80,14 @@ void ASFMasterHUD::UpdateHUD(USFParticipant* Participant, FString Status)
HUDWidget->SetParticipant(Participant->GetID()); HUDWidget->SetParticipant(Participant->GetID());
USFStudyPhase* Phase = Participant->GetCurrentPhase(); const USFCondition* Condition = Participant->GetCurrentCondition();
HUDWidget->SetPhase(Phase->GetName()); HUDWidget->SetPhase(Condition->PhaseName);
USFCondition* Condition = Phase->GetCurrentCondition();
FString ConditionString = "("; FString ConditionString = "(";
ConditionString += FPaths::GetBaseFilename(Condition->Map); ConditionString += "Map: " + FPaths::GetBaseFilename(Condition->Map);
for (auto FactorLevel : Condition->FactorLevels) for (auto FactorLevel : Condition->FactorLevels)
{ {
ConditionString += FactorLevel.Key + ": " + FactorLevel.Value + " "; ConditionString += "; " + FactorLevel.Key + ": " + FactorLevel.Value;
} }
ConditionString += ")"; ConditionString += ")";
HUDWidget->SetCondition(ConditionString); HUDWidget->SetCondition(ConditionString);
...@@ -115,4 +123,39 @@ void ASFMasterHUD::OnNextButtonPressed() ...@@ -115,4 +123,39 @@ void ASFMasterHUD::OnNextButtonPressed()
void ASFMasterHUD::OnShowConditionsButtonPressed() void ASFMasterHUD::OnShowConditionsButtonPressed()
{ {
if (bShowConditionList)
{
HUDWidget->GetConditionList()->SetVisibility(ESlateVisibility::Collapsed);
Cast<UTextBlock>(HUDWidget->GetShowConditionsButton()->GetAllChildren()[0])->SetText(FText::FromString("Show Conditions"));
bShowConditionList = false;
}
else
{
bShowConditionList = true;
Cast<UTextBlock>(HUDWidget->GetShowConditionsButton()->GetAllChildren()[0])->SetText(FText::FromString("Hide Conditions"));
UScrollBox* ConditionList = HUDWidget->GetConditionList();
ConditionList->ClearChildren();
ConditionList->SetVisibility(ESlateVisibility::Visible);
FString LastPhase = "";
const TArray<USFCondition*> Conditions = USFGameInstance::Get()->GetParticipant()->GetAllConditions();
for (const USFCondition* Condition : Conditions)
{
if(LastPhase != Condition->PhaseName)
{
//add phase header first
USFConditionListEntry* Entry = CreateWidget<USFConditionListEntry>(
GetWorld()->GetFirstPlayerController(), SFConditionListEntryBP_Class);
Entry->FillAsPhaseHeader(Condition);
LastPhase = Condition->PhaseName;
ConditionList->AddChild(Entry);
}
USFConditionListEntry* Entry = CreateWidget<USFConditionListEntry>(
GetWorld()->GetFirstPlayerController(), SFConditionListEntryBP_Class);
Entry->FillWithCondition(Condition);
ConditionList->AddChild(Entry);
}
}
} }
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
#include "Blueprint/UserWidget.h" #include "Blueprint/UserWidget.h"
#include "Components/TextBlock.h" #include "Components/TextBlock.h"
#include "Components/Button.h" #include "Components/Button.h"
#include "SFCondition.h"
#include "Components/Border.h"
#include "SFConditionListEntry.generated.h" #include "SFConditionListEntry.generated.h"
/** /**
...@@ -18,16 +22,35 @@ class STUDYFRAMEWORKPLUGIN_API USFConditionListEntry : public UUserWidget ...@@ -18,16 +22,35 @@ class STUDYFRAMEWORKPLUGIN_API USFConditionListEntry : public UUserWidget
GENERATED_BODY() GENERATED_BODY()
public: public:
void FillWithCondition(const USFCondition* Condition);
void FillAsPhaseHeader(const USFCondition* Condition);
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UButton* GoToButton;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Phase; UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Phase;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Map; UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Map;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UButton* GoToButton; UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Text0;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) TArray<UTextBlock*> Factors; UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Text1;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) TArray<UTextBlock*> DependenVars; UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Text2;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Text3;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UTextBlock* Time;
UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) UBorder* BackgroundColor;
UPROPERTY(EditAnywhere) FLinearColor DefaultColor;
UPROPERTY(EditAnywhere) FLinearColor HeaderColor;
UPROPERTY(EditAnywhere) FLinearColor ActiveColor;
UPROPERTY(EditAnywhere) FLinearColor DoneColor;
UPROPERTY(BlueprintReadWrite) bool IsHeader = false; UPROPERTY(BlueprintReadWrite) bool IsHeader = false;
UPROPERTY(BlueprintReadWrite) bool IsDone = false; UPROPERTY(BlueprintReadWrite) bool IsDone = false;
UPROPERTY(BlueprintReadWrite) bool IsActive = false; UPROPERTY(BlueprintReadWrite) bool IsActive = false;
UFUNCTION(BlueprintCallable) void GoTo(); UFUNCTION(BlueprintCallable) void GoTo();
protected:
UFUNCTION(BlueprintCallable) void UpdateData();
private:
UPROPERTY() const USFCondition* Condition;
void FillTextsHelper(const TArray<FString>& Data);
TMap<int, USFDependentVariable*> TextBlockIdToDependentVar;
}; };
...@@ -55,6 +55,7 @@ public: ...@@ -55,6 +55,7 @@ public:
UButton* GetStartButton(); UButton* GetStartButton();
UButton* GetNextButton(); UButton* GetNextButton();
UButton* GetShowConditionsButton(); UButton* GetShowConditionsButton();
UScrollBox* GetConditionList();
private: private:
......
...@@ -7,7 +7,8 @@ ...@@ -7,7 +7,8 @@
#include "Components/WidgetComponent.h" #include "Components/WidgetComponent.h"
#include "SFHUDWidget.h" #include "HUD/SFHUDWidget.h"
#include "HUD/SFConditionListEntry.h"
#include "SFMasterHUD.generated.h" #include "SFMasterHUD.generated.h"
...@@ -42,6 +43,8 @@ public: ...@@ -42,6 +43,8 @@ public:
UPROPERTY(EditDefaultsOnly, Category = "Interactive") UPROPERTY(EditDefaultsOnly, Category = "Interactive")
TSubclassOf<USFHUDWidget> SFWidgetClass; TSubclassOf<USFHUDWidget> SFWidgetClass;
UPROPERTY(EditDefaultsOnly, Category = "Interactive")
TSubclassOf<USFConditionListEntry> SFConditionListEntryBP_Class;
UFUNCTION() UFUNCTION()
void OnStartButtonPressed(); void OnStartButtonPressed();
...@@ -51,9 +54,12 @@ public: ...@@ -51,9 +54,12 @@ public:
void OnShowConditionsButtonPressed(); void OnShowConditionsButtonPressed();
private: private:
UPROPERTY() UPROPERTY()
USFHUDWidget* HUDWidget; USFHUDWidget* HUDWidget;
UPROPERTY() UPROPERTY()
FLinearColor BackgroundColor = FLinearColor::Black; FLinearColor BackgroundColor = FLinearColor::Black;
void DrawBackground(); void DrawBackground();
UPROPERTY()
bool bShowConditionList = false;
}; };
...@@ -38,6 +38,12 @@ public: ...@@ -38,6 +38,12 @@ public:
UPROPERTY(BlueprintReadOnly) UPROPERTY(BlueprintReadOnly)
TMap<USFDependentVariable*,FString> DependentVariablesValues; TMap<USFDependentVariable*,FString> DependentVariablesValues;
UPROPERTY(BlueprintReadOnly)
float TimeTaken=0.0;
UPROPERTY(BlueprintReadOnly)
bool bConditionFinished=false;
UPROPERTY() UPROPERTY()
TArray<TSubclassOf<AActor>> SpawnInThisCondition; TArray<TSubclassOf<AActor>> SpawnInThisCondition;
}; };
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
"FriendlyName": "StudyFrameworkPlugin", "FriendlyName": "StudyFrameworkPlugin",
"Description": "A plugin to easily set up a study", "Description": "A plugin to easily set up a study",
"Category": "Other", "Category": "Other",
"CreatedBy": "Marius Schmeling", "CreatedBy": "Marius Schmeling, Jonathan Ehret",
"CreatedByURL": "", "CreatedByURL": "",
"DocsURL": "", "DocsURL": "",
"MarketplaceURL": "", "MarketplaceURL": "",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment