public SettingsPropertyDefinition Clone(bool keepRefs = true) { var localPropValue = PropertyReference.Value; return(new SettingsPropertyDefinition( SettingsUtils.GetPropertyDefinitionWrappers(this), new PropertyGroupDefinitionWrapper(this), keepRefs ? PropertyReference : new StorageRef(localPropValue), SubGroupDelimiter)); }
private static IEnumerable <ISettingsPropertyDefinition> GetPropertiesInternal(object @object) { var type = @object.GetType(); var subGroupDelimiter = AccessTools2.Property(type, "SubGroupDelimiter")?.GetValue(@object) as char? ?? '/'; foreach (var property in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) { if (property.Name == nameof(BaseSettings.Id)) { continue; } if (property.Name == nameof(BaseSettings.DisplayName)) { continue; } if (property.Name == nameof(BaseSettings.FolderName)) { continue; } if (property.Name == nameof(BaseSettings.FormatType)) { continue; } if (property.Name == nameof(BaseSettings.SubFolder)) { continue; } if (property.Name == nameof(BaseSettings.UIVersion)) { continue; } var attributes = property.GetCustomAttributes().ToList(); object?groupAttrObj = attributes.SingleOrDefault(a => a is IPropertyGroupDefinition); var groupDefinition = groupAttrObj is not null ? new PropertyGroupDefinitionWrapper(groupAttrObj) : SettingPropertyGroupAttribute.Default; var propertyDefinitions = SettingsUtils.GetPropertyDefinitionWrappers(attributes).ToList(); if (propertyDefinitions.Count > 0) { yield return(new SettingsPropertyDefinition(propertyDefinitions, groupDefinition, new PropertyRef(property, @object), subGroupDelimiter)); } } }
public static ExternalPerSaveSettings?CreateFromXmlStream(Stream xmlStream, Func <IPropertyDefinitionBase, IRef> assignRefDelegate, PropertyChangedEventHandler?propertyChanged = null) { using var reader = XmlReader.Create(xmlStream, new XmlReaderSettings { IgnoreComments = true, IgnoreWhitespace = true }); var serializer = new XmlSerializer(typeof(SettingsXmlModel)); if (!serializer.CanDeserialize(reader) || serializer.Deserialize(reader) is not SettingsXmlModel settingsXmlModel) { return(null); } var subGroupDelimiter = settingsXmlModel.SubGroupDelimiter[0]; var props = settingsXmlModel.Groups .SelectMany(g => g.Properties.Select(p => new SettingsPropertyDefinition(SettingsUtils.GetPropertyDefinitionWrappers(p), g, assignRefDelegate(p), subGroupDelimiter))) .Concat(settingsXmlModel.Properties.Select(p => new SettingsPropertyDefinition(SettingsUtils.GetPropertyDefinitionWrappers(p), SettingsPropertyGroupDefinition.DefaultGroup, assignRefDelegate(p), subGroupDelimiter))); var propGroups = SettingsUtils.GetSettingsPropertyGroups(subGroupDelimiter, props); return(new ExternalPerSaveSettings( settingsXmlModel.Id, settingsXmlModel.DisplayName, settingsXmlModel.FolderName, settingsXmlModel.SubFolder, settingsXmlModel.UIVersion, subGroupDelimiter, propertyChanged, propGroups, new Dictionary <string, ISettingsPresetBuilder>())); }