private static void SaveThreeStateItemContainerOrdered <T>(XContainer xRoot, string containerName, string entryName, ThreeStateItemContainerOrdered <T> container) where T : Def { if (container.IsInDefaultState()) { return; } var xContainerElement = new XElement(containerName); xRoot.Add(xContainerElement); xContainerElement.Add(new XElement("FilterBooleanState", container.FilterBooleanState)); xContainerElement.Add(new XElement("OffPartialNoSelect", container.OffPartialNoSelect)); xContainerElement.Add(new XElement("OrderedFiltering", container.OrderedFiltering)); foreach (var def in container.OrderedItems) { if (!container.TryGetValue(def, out var threeStateItem)) { // shouldn't happen, but just a defensive check Log.Error($"[PrepareLanding] The def '{def.defName}' doesn't exit in the given dictionary."); continue; } var xEntry = new XElement(entryName); xEntry.Add(new XElement(DefNameNode, def.defName)); xEntry.Add(new XElement(StateNode, threeStateItem.State.ToString())); xContainerElement.Add(xEntry); } }
private void LoadThreeStateItemContainerOrdered <T>(XContainer xParent, string elementName, string entryName, ThreeStateItemContainerOrdered <T> container) where T : Def { var xFoundElement = xParent.Element(elementName); if (xFoundElement == null) { return; } container.FilterBooleanState = LoadEnum <FilterBoolean>(xFoundElement, "FilterBooleanState"); LoadBoolean(xFoundElement, "OffPartialNoSelect", b => container.OffPartialNoSelect = b); LoadBoolean(xFoundElement, "OrderedFiltering", b => container.OrderedFiltering = b); var orderedList = new List <T>(); foreach (var xElement in xFoundElement.Elements(entryName)) { var xDefName = xElement.Element(DefNameNode); if (xDefName == null) { goto EnsureAllEntriesPresent; } var def = LoadDef <T>(xElement, DefNameNode) as T; if (def == null) { goto EnsureAllEntriesPresent; } orderedList.Add(def); if (!container.TryGetValue(def, out var threeStateItem)) { goto EnsureAllEntriesPresent; } var state = LoadEnum <MultiCheckboxState>(xElement, StateNode); threeStateItem.State = state; } EnsureAllEntriesPresent: foreach (var entry in container) { if (orderedList.Contains(entry.Key)) { continue; } orderedList.Add(entry.Key); } container.SetNewOrder(orderedList); }