From 5c64267716273315304047eff508b1e5135dab57 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Malte=20K=C3=B6gel?= <koegel@vr.rwth-aachen.de>
Date: Thu, 5 Oct 2023 11:28:14 +0200
Subject: [PATCH] When jumping into a condition directly from the HUD, also
 call StartStudy. Made StartCondition const for this, but this should be fine.
 closes #92

---
 Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp | 6 ++++++
 Source/StudyFrameworkPlugin/Private/SFParticipant.cpp  | 6 +++---
 Source/StudyFrameworkPlugin/Public/SFGameInstance.h    | 4 +++-
 Source/StudyFrameworkPlugin/Public/SFParticipant.h     | 6 +++---
 4 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp b/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp
index 04fc398..86d6b01 100644
--- a/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp
+++ b/Source/StudyFrameworkPlugin/Private/SFGameInstance.cpp
@@ -455,6 +455,12 @@ bool USFGameInstance::GoToCondition(const USFCondition* Condition, bool bForced
 		FSFLoggingUtils::Log("[USFGameInstance::GoToCondition()]: Could not load next condition.", true);
 		return false;
 	}
+
+	if (!bStudyStarted && !bIsStarting) {
+		StartCondition = Condition; //Start at this condition
+		bIsStarting = true; //To avoid infinite loops, when StartStudy calls GoToCondition(StartCondition)
+		return StartStudy();
+	}
 	GoToConditionSynced(Condition->UniqueName, bForced, Fade);
 	return true;
 }
diff --git a/Source/StudyFrameworkPlugin/Private/SFParticipant.cpp b/Source/StudyFrameworkPlugin/Private/SFParticipant.cpp
index 35cfcee..bc88b18 100644
--- a/Source/StudyFrameworkPlugin/Private/SFParticipant.cpp
+++ b/Source/StudyFrameworkPlugin/Private/SFParticipant.cpp
@@ -307,19 +307,19 @@ void USFParticipant::StoreInIndependentVarLongTable() const
 	}
 }
 
-void USFParticipant::DeleteStoredDataForConditionFromLongTable(USFCondition* Condition)
+void USFParticipant::DeleteStoredDataForConditionFromLongTable(const USFCondition* Condition)
 {
 	const FString Filename = FPaths::ProjectDir() + "StudyFramework/StudyLogs/Phase_" + Condition->PhaseName + ".csv";
 	RemoveLinesOfConditionAndWriteToFile(Condition, Filename);
 }
 
-void USFParticipant::DeleteStoredTrialDataForCondition(USFCondition* Condition, USFMultipleTrialDependentVariable* DependentVariable)
+void USFParticipant::DeleteStoredTrialDataForCondition(const USFCondition* Condition, USFMultipleTrialDependentVariable* DependentVariable)
 {
 	const FString Filename = FPaths::ProjectDir() + "StudyFramework/StudyLogs/Phase_" + Condition->PhaseName + "_" + DependentVariable->Name + ".csv";
 	RemoveLinesOfConditionAndWriteToFile(Condition, Filename);
 }
 
-void USFParticipant::RemoveLinesOfConditionAndWriteToFile(USFCondition* Condition, const FString Filename)
+void USFParticipant::RemoveLinesOfConditionAndWriteToFile(const USFCondition* Condition, const FString Filename)
 {
 	TArray<FString> Lines;
 	TArray<FString> CleanedLines;
diff --git a/Source/StudyFrameworkPlugin/Public/SFGameInstance.h b/Source/StudyFrameworkPlugin/Public/SFGameInstance.h
index 2a3836f..9032efc 100644
--- a/Source/StudyFrameworkPlugin/Public/SFGameInstance.h
+++ b/Source/StudyFrameworkPlugin/Public/SFGameInstance.h
@@ -218,12 +218,14 @@ protected:
 	// this is used if the study should not be started from the beginning
 	// e.g., when starting a map directly for debugging in the editor
 	// or when continuing a crashed study run
-	USFCondition* StartCondition;
+	const USFCondition* StartCondition;
 
 	// State of Study / GameInstance
 	UPROPERTY(BlueprintReadOnly)
 	bool bStudyStarted = false;
 
+	bool bIsStarting = false;
+
 	UPROPERTY(BlueprintReadOnly)
 	bool bStudyEnded = false;
 
diff --git a/Source/StudyFrameworkPlugin/Public/SFParticipant.h b/Source/StudyFrameworkPlugin/Public/SFParticipant.h
index 0c39bce..c88de85 100644
--- a/Source/StudyFrameworkPlugin/Public/SFParticipant.h
+++ b/Source/StudyFrameworkPlugin/Public/SFParticipant.h
@@ -82,8 +82,8 @@ public:
 	// recycling bin file name
 	void CreateLongTableBackUp(const FString PathToSrcFile) const;
 	void StoreTrialInTrialDVLongTable(USFMultipleTrialDependentVariable* DependentVariable, TArray<FString> Values) const;
-	void DeleteStoredDataForConditionFromLongTable(USFCondition* Condition);
-	void DeleteStoredTrialDataForCondition(USFCondition* Condition, USFMultipleTrialDependentVariable* DependentVariable);
+	void DeleteStoredDataForConditionFromLongTable(const USFCondition* Condition);
+	void DeleteStoredTrialDataForCondition(const USFCondition* Condition, USFMultipleTrialDependentVariable* DependentVariable);
 	void SetCurrentBackUpFolderName(FString BackUpFolderName);
 
 protected:
@@ -98,7 +98,7 @@ protected:
 
 	void StoreInPhaseLongTable() const;
 	void StoreInIndependentVarLongTable() const;
-	void RemoveLinesOfConditionAndWriteToFile(USFCondition* Condition, FString Filename);
+	void RemoveLinesOfConditionAndWriteToFile(const USFCondition* Condition, FString Filename);
 
 	// This is the parent folder within RecyclingBin, where backups
 	// of the current operation will be stored.
-- 
GitLab