A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DlgConfigWriter.h
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
2#pragma once
3
4#include <functional>
5#include "Logging/LogMacros.h"
6#include "UObject/UnrealType.h"
7#include "Misc/FileHelper.h"
8#include "UObject/TextProperty.h"
9
10#include "IDlgWriter.h"
11#include "NYReflectionHelper.h"
12
13DECLARE_LOG_CATEGORY_EXTERN(LogDlgConfigWriter, Log, All);
14
16
22class DLGSYSTEM_API FDlgConfigWriter : public IDlgWriter
23{
24
25public:
26
43 FDlgConfigWriter(const FString InComplexNamePrefix = "",
44 bool bInDontWriteEmptyContainer = true);
45
46 // IDlgWriter Interface
47
49 void Write(const UStruct* StructDefinition, const void* Object) override;
50
55 bool ExportToFile(const FString& FileName) override
56 {
57 return FFileHelper::SaveStringToFile(ConfigText, *FileName, FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);
58 }
59
60 const FString& GetAsString() const override
61 {
62 return ConfigText;
63 }
64
65protected:
66
67 void WriteComplexToString(const UStruct* StructDefinition,
68 const FNYProperty* Property,
69 const void* Object,
70 const FString& PreString,
71 const FString& PostString,
72 bool bContainerElement,
73 bool bWriteType,
74 FString& Target);
75
76 void WriteComplexMembersToString(const UStruct* StructDefinition,
77 const void* Object,
78 const FString& PreString,
79 const FString& PostString,
80 FString& Target);
81
82 bool WritePropertyToString(const FNYProperty* Property,
83 const void* Object,
84 bool bContainerElement,
85 const FString& PreString,
86 const FString& PostString,
87 bool bPointerAsRef,
88 FString& Target);
89
90 // object is pointer to the owner
91 bool WritePrimitiveElementToString(const FNYProperty* Property,
92 const void* Object,
93 bool bContainerElement,
94 const FString& PreString,
95 const FString& PostString,
96 FString& Target);
97
98 bool WritePrimitiveArrayToString(const FNYProperty* Property,
99 const void* Object,
100 const FString& PreString,
101 const FString& PostString,
102 FString& Target);
103
104 bool WriteComplexElementToString(const FNYProperty* Property,
105 const void* Object,
106 bool bContainerElement,
107 const FString& PreString,
108 const FString& PostString,
109 bool bPointerAsRef,
110 FString& Target);
111
112 bool WriteComplexArrayToString(const FNYProperty* Property,
113 const void* Object,
114 const FString& PreString,
115 const FString& PostString,
116 FString& Target);
117
118 bool WriteMapToString(const FNYProperty* Property,
119 const void* Object,
120 const FString& PreString,
121 const FString& PostString,
122 FString& Target);
123
124 bool WriteSetToString(const FNYProperty* Property,
125 const void* Object,
126 const FString& PreString,
127 const FString& PostString,
128 FString& Target);
129
130 bool IsPrimitive(const FNYProperty* Property);
131 bool IsContainer(const FNYProperty* Property);
132 bool IsPrimitiveContainer(const FNYProperty* Property);
133
134 bool WouldWriteNonPrimitive(const UStruct* StructDefinition, const void* Owner);
135
136 const UStruct* GetComplexType(const FNYProperty* Property);
137
138
139 // expects object or struct property, returns empty string otherwise
140 FString GetNameWithoutPrefix(const FNYProperty* StructDefinition, const UObject* ObjectPtr = nullptr);
141 FString GetStringWithoutPrefix(const FString& String);
142
143
145 template <typename PropertyType, typename VariableType>
147 const void* Object,
148 bool bContainerElement,
149 std::function<FString(const VariableType&)> GetAsString,
150 const FString& PreString,
151 const FString& PostString,
152 FString& Target)
153 {
154 const PropertyType* CastedProperty = FNYReflectionHelper::CastProperty<PropertyType>(Property);
155 if (CastedProperty != nullptr)
156 {
157 Target += PreString +
158 (bContainerElement ? "" : (CastedProperty->GetName() + " ")) +
159 GetAsString(CastedProperty->GetPropertyValue_InContainer(Object, 0)) +
160 PostString;
161 return true;
162 }
163
164 return false;
165 }
166
168 template <typename PropertyType, typename VariableType>
170 const void* Object,
171 std::function<FString(const VariableType&)> ToString,
172 const FString& PreString,
173 const FString& PostString,
174 FString& Target)
175 {
176 if (FNYReflectionHelper::CastProperty<PropertyType>(ArrayProp->Inner) == nullptr)
177 {
178 return false;
179 }
180
181 const TArray<VariableType>* ArrayPtr = ArrayProp->ContainerPtrToValuePtr<TArray<VariableType>>(Object);
182 if (ArrayPtr == nullptr)
183 {
184 return false;
185 }
186 const bool bLinePerItem = CanWriteOneLinePerItem(ArrayProp);
187
188 // Empty array
189 const TArray<VariableType> Array = *ArrayPtr;
190 if (Array.Num() == 0 && bDontWriteEmptyContainer)
191 {
192 return true;
193 }
194
195 // Establish indentation to be the same as the ArrayName.len + 3 spaces
196 FString SubPreString = PreString;
197 for (int32 i = 0; i < ArrayProp->GetName().Len() + 3; ++i)
198 {
199 SubPreString += " ";
200 }
201
202 // ArrayName {
203 Target += PreString + ArrayProp->GetName() + " {" + (bLinePerItem ? EOL_String : " ");
204
205 // Array content
206 for (int32 i = 0; i < Array.Num(); ++i)
207 {
208 if (bLinePerItem)
209 {
210 Target += SubPreString + ToString(Array[i]) + EOL;
211 }
212 else
213 {
214 Target += ToString(Array[i]) + " ";
215 }
216 }
217
218 // }
219 Target += (bLinePerItem ? PreString : "") + "}" + PostString;
220
221 return true;
222 }
223
225 template <typename PropertyType, typename VariableType>
227 const void* Object,
228 bool bContainerElement,
229 std::function<FString(const VariableType&)> GetAsString,
230 const FString& PreString,
231 const FString& PostString,
232 FString& Target)
233 {
234 const PropertyType* CastedProperty = FNYReflectionHelper::CastProperty<PropertyType>(Property);
235 if (CastedProperty != nullptr)
236 {
237 Target += PreString +
238 (bContainerElement ? "" : (CastedProperty->GetName() + " ")) +
239 GetAsString(*((VariableType*)(Object))) +
240 PostString;
241 return true;
242 }
243
244 return false;
245 }
246
248 static FString NormalizeEndlines(const FString& Original)
249 {
250 return Original.Replace(EOL_CRLF, EOL_LF, ESearchCase::IgnoreCase);
251 }
252
253private:
254 // End of line
255 static const TCHAR* EOL_LF;
256 static const TCHAR* EOL_CRLF;
257 static const TCHAR* EOL;
258
259 // Helper strings
260 static const FString EOL_String;
261
262 FString ConfigText = "";
263
264 const void* TopLevelObjectPtr = nullptr;
265 const FString ComplexNamePrefix;
267
268 // Conversion to string functions
269 const std::function<FString(const bool&)> BoolToString = [](const bool& bBool) -> FString
270 {
271 return bBool ? "True" : "False";
272 };
273
274 const std::function<FString(const int64&)> IntToString = [](const int64& IntVal) -> FString
275 {
276 return FString::Printf(TEXT("%lld"), IntVal);
277 };
278
279 const std::function<FString(const float&)> FloatToString = [](const float& FloatVal) -> FString
280 {
281 return FString::SanitizeFloat(FloatVal);
282 };
283
284 const std::function<FString(const FString&)> StringToString = [](const FString& String) -> FString
285 {
286 return FString("\"") + NormalizeEndlines(String) + "\"";
287 };
288
289 const std::function<FString(const FName&)> NameToString = [](const FName& Name) -> FString
290 {
291 return FString("\"") + NormalizeEndlines(Name.ToString()) + "\"";
292 };
293
294 const std::function<FString(const FText&)> TextToString = [](const FText& Text) -> FString
295 {
296 return FString("\"") + NormalizeEndlines(Text.ToString()) + "\"";
297 };
298};
DECLARE_LOG_CATEGORY_EXTERN(LogDlgConfigWriter, Log, All)
UProperty FNYProperty
UArrayProperty FNYArrayProperty
static FString NormalizeEndlines(const FString &Original)
bool WritePrimitiveToStringTemplated(const FNYProperty *Property, const void *Object, bool bContainerElement, std::function< FString(const VariableType &)> GetAsString, const FString &PreString, const FString &PostString, FString &Target)
const bool bDontWriteEmptyContainer
bool ExportToFile(const FString &FileName) override
static const TCHAR * EOL
static const TCHAR * EOL_LF
bool WritePrimitiveElementToStringTemplated(const FNYProperty *Property, const void *Object, bool bContainerElement, std::function< FString(const VariableType &)> GetAsString, const FString &PreString, const FString &PostString, FString &Target)
const FString & GetAsString() const override
const FString ComplexNamePrefix
static const TCHAR * EOL_CRLF
bool WritePrimitiveArrayToStringTemplated(const FNYArrayProperty *ArrayProp, const void *Object, std::function< FString(const VariableType &)> ToString, const FString &PreString, const FString &PostString, FString &Target)
virtual const FString & GetAsString() const =0
virtual void Write(const UStruct *StructDefinition, const void *Object)=0
static bool CanWriteOneLinePerItem(const FNYProperty *Property)
Definition IDlgWriter.h:63