Fix interview step being passed by reference instead of by value when getting them from the definitions, breaking selectors for instance

This commit is contained in:
Toastie 2025-02-04 20:07:37 +13:00
parent 0984f50fff
commit 91652eb8fb
Signed by: toastie_t0ast
GPG key ID: 0861BE54AD481DC7

View file

@ -52,14 +52,30 @@ public class ReferencedInterviewStep
[JsonProperty("after-reference-step")] [JsonProperty("after-reference-step")]
public InterviewStep afterReferenceStep; public InterviewStep afterReferenceStep;
public ReferencedInterviewStep() { }
public ReferencedInterviewStep(ReferencedInterviewStep other)
{
id = other.id;
buttonStyle = other.buttonStyle;
selectorDescription = other.selectorDescription;
if (other.afterReferenceStep != null)
{
afterReferenceStep = new InterviewStep(other.afterReferenceStep);
}
}
public bool TryGetReferencedStep(Dictionary<string, InterviewStep> definitions, out InterviewStep step, bool ignoreReferenceParameters = false) public bool TryGetReferencedStep(Dictionary<string, InterviewStep> definitions, out InterviewStep step, bool ignoreReferenceParameters = false)
{ {
if (!definitions.TryGetValue(id, out step)) if (!definitions.TryGetValue(id, out InterviewStep tempStep))
{ {
Logger.Error("Could not find referenced step '" + id + "' in interview."); Logger.Error("Could not find referenced step '" + id + "' in interview.");
step = null;
return false; return false;
} }
step = new InterviewStep(tempStep);
if (!ignoreReferenceParameters) if (!ignoreReferenceParameters)
{ {
step.buttonStyle = buttonStyle; step.buttonStyle = buttonStyle;
@ -159,6 +175,39 @@ public class InterviewStep
[JsonProperty("after-reference-step")] [JsonProperty("after-reference-step")]
public InterviewStep afterReferenceStep = null; public InterviewStep afterReferenceStep = null;
public InterviewStep() { }
public InterviewStep(InterviewStep other)
{
heading = other.heading;
message = other.message;
stepType = other.stepType;
color = other.color;
summaryField = other.summaryField;
buttonStyle = other.buttonStyle;
selectorPlaceholder = other.selectorPlaceholder;
selectorDescription = other.selectorDescription;
maxLength = other.maxLength;
minLength = other.minLength;
addSummary = other.addSummary;
answerDelimiter = other.answerDelimiter;
messageID = other.messageID;
answer = other.answer;
answerID = other.answerID;
relatedMessageIDs = other.relatedMessageIDs;
afterReferenceStep = other.afterReferenceStep;
foreach (KeyValuePair<string, InterviewStep> childStep in other.steps ?? [])
{
steps.Add(childStep.Key, new InterviewStep(childStep.Value));
}
foreach (KeyValuePair<string, ReferencedInterviewStep> reference in other.references ?? [])
{
references.Add(reference.Key, new ReferencedInterviewStep(reference.Value));
}
}
public bool TryGetCurrentStep(out InterviewStep currentStep) public bool TryGetCurrentStep(out InterviewStep currentStep)
{ {
bool result = TryGetTakenSteps(out List<InterviewStep> previousSteps); bool result = TryGetTakenSteps(out List<InterviewStep> previousSteps);