diff --git a/Source/StudyFrameworkPlugin/Private/Help/SFUtils.cpp b/Source/StudyFrameworkPlugin/Private/Help/SFUtils.cpp index f3f8f9b0869c2a01231c9efddc78797848bbbf47..ba1644085c08be7123da9f2cdbbb0458651a6d8e 100644 --- a/Source/StudyFrameworkPlugin/Private/Help/SFUtils.cpp +++ b/Source/StudyFrameworkPlugin/Private/Help/SFUtils.cpp @@ -49,20 +49,14 @@ TSharedPtr<FJsonObject> FSFUtils::StringToJson(FString String) void FSFUtils::WriteJsonToFile(TSharedPtr<FJsonObject> Json, FString FilePath) { - if (FPaths::IsRelative(GetStudyFrameworkPath())) - { - FilePath = GetStudyFrameworkPath() + FilePath; - } + FilePath = GetStudyFrameworkPath() + FilePath; FFileHelper::SaveStringToFile(JsonToString(Json), *(FilePath)); } TSharedPtr<FJsonObject> FSFUtils::ReadJsonFromFile(FString FilePath) { FString JsonString; - if (FPaths::IsRelative(GetStudyFrameworkPath())) - { - FilePath = GetStudyFrameworkPath() + FilePath; - } + FilePath = GetStudyFrameworkPath() + FilePath; if(!FFileHelper::LoadFileToString(JsonString, *(FilePath))) { return nullptr; diff --git a/Source/StudyFrameworkPlugin/Private/SFStudySetup.cpp b/Source/StudyFrameworkPlugin/Private/SFStudySetup.cpp index 4c1eed0f879ed134824b9df1ec85cf4566581ab7..062d09c8d057c9785469f13ccf52c1c34f1698a0 100644 --- a/Source/StudyFrameworkPlugin/Private/SFStudySetup.cpp +++ b/Source/StudyFrameworkPlugin/Private/SFStudySetup.cpp @@ -7,6 +7,7 @@ #include "Logging/SFLoggingUtils.h" #include "Developer/DesktopPlatform/Public/IDesktopPlatform.h" #include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h" +#include "Kismet/KismetStringLibrary.h" ASFStudySetup::ASFStudySetup() { @@ -28,6 +29,51 @@ ASFStudySetup::ASFStudySetup() #endif // WITH_EDITORONLY_DATA } +void ASFStudySetup::PostActorCreated() +{ + Super::PostActorCreated(); + + // PostActorCreated() is called twice when actor is drag-'n'-dropped into level because: + // First a preview actor with transient values is created when dragging out of list + // Then the final actor is created once dropped into map. + // We only want to execute the code for the latter actor -> Workaround: + if (!HasAllFlags(RF_Transient)) + { + int uniqueFileExtension = 0; + int NumOfDigitsExtension; + while (FPaths::FileExists(FSFUtils::GetStudyFrameworkPath() + JsonFile)) + { + NumOfDigitsExtension = FString::FromInt(uniqueFileExtension).Len(); + JsonFile.RemoveFromEnd(".json"); + + // Filename ends with number to iterate + if (JsonFile.Right(NumOfDigitsExtension).IsNumeric()) + { + uniqueFileExtension = UKismetStringLibrary::Conv_StringToInt(JsonFile.Right(NumOfDigitsExtension)); + } + + // Filename ends with number but with fewer digits, e.g. file9.json exists but not file10.json + else if (NumOfDigitsExtension > 1) + { + uniqueFileExtension = UKismetStringLibrary::Conv_StringToInt(JsonFile.Right(NumOfDigitsExtension - 1)); + } + + // There is no number at the end that should be removed before adding larger number + else + { + JsonFile = JsonFile + "1" + ".json"; + continue; + } + + JsonFile.RemoveFromEnd(FString::FromInt(uniqueFileExtension)); + JsonFile.AppendInt(uniqueFileExtension + 1); + JsonFile.Append(".json"); + FSFLoggingUtils::Log("Attempting to use " + JsonFile); + } + SaveToJson(); + } +} + void ASFStudySetup::BeginPlay() { Super::BeginPlay(); diff --git a/Source/StudyFrameworkPlugin/Public/SFStudySetup.h b/Source/StudyFrameworkPlugin/Public/SFStudySetup.h index fdad39e6951ac19cadf63e949d2723c298580fb2..13eb9042fd9354f2237d7458f2bee63147e806f6 100644 --- a/Source/StudyFrameworkPlugin/Public/SFStudySetup.h +++ b/Source/StudyFrameworkPlugin/Public/SFStudySetup.h @@ -22,6 +22,8 @@ class STUDYFRAMEWORKPLUGIN_API ASFStudySetup : public AActor public: ASFStudySetup(); + virtual void PostActorCreated() override; + virtual void BeginPlay() override; virtual void PostLoad() override;