/// <summary> /// Recursive method to save the Option's value and its variants' /// and children's values to the node. /// </summary> private void SaveNode(ValueStore.Node node, Option option, bool isDefaultNode = false) { if (!isDefaultNode && option.IsDefaultVariant) { var defaultVariant = node.GetOrCreateVariant(option.VariantDefaultParameter); SaveNode(defaultVariant, option, isDefaultNode: true); for (int i = node.variants.Count - 1; i >= 0; i--) { if (option.GetVariant(node.variants[i].name, create:false) == null) { node.RemoveVariant(i); } } foreach (var variantOption in option.Variants) { var variantNode = node.GetOrCreateVariant(variantOption.VariantParameter); SaveNode(variantNode, variantOption); } } else { node.Value = option.Save(); foreach (var childOption in option.Children) { var childNode = node.GetOrCreateChild(childOption.Name); SaveNode(childNode, childOption); } } }
protected void CleanStoreRecursive(ValueStore.Node node, Option option, bool isDefaultNode = false) { if (!isDefaultNode && option.IsDefaultVariant) { // Value and children are stored in the default parameter sub-node node.Value = null; node.ClearChildren(); if (node.VariantCount > 0) { foreach (var variant in node.Variants.ToArray()) { if (variant.Name.EqualsIgnoringCase(option.VariantDefaultParameter)) { CleanStoreRecursive(variant, option, isDefaultNode: true); continue; } var variantOption = option.GetVariant(variant.Name, create: false); if (variantOption == null) { node.RemoveVariant(variant.Name); } else { CleanStoreRecursive(variant, variantOption); } } } } else { node.ClearVariants(); } if (node.ChildCount > 0) { foreach (var child in node.Children.ToArray()) { var childOption = option.GetChild(child.Name); if (childOption == null) { node.RemoveChild(child.Name); } else { CleanStoreRecursive(child, childOption); } } } }