Example #1
0
        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>()));
        }