123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using UnityEngine;
- namespace UnityEditor.SettingsManagement
- {
- /// <summary>
- /// A collection of utilities for working with settings.
- /// </summary>
- static class UserSettings
- {
- internal const string packageName = "com.unity.settings-manager";
- internal static string GetSettingsString(IEnumerable<Assembly> assemblies, params SettingsScope[] scopes)
- {
- var settings = FindUserSettings(assemblies, SettingVisibility.All);
- if (scopes != null && scopes.Length > 0)
- settings = settings.Where(x => scopes.Contains(x.scope));
- var sb = new System.Text.StringBuilder();
- Type t = null;
- foreach (var pref in settings.OrderBy(x => x.type.ToString()))
- {
- if (pref.type != t)
- {
- if (t != null)
- sb.AppendLine();
- t = pref.type;
- sb.AppendLine(pref.type.ToString());
- }
- var val = pref.GetValue();
- sb.AppendLine(string.Format("{0,-4}{1,-24}{2,-64}{3}", "", pref.scope, pref.key, val != null ? val.ToString() : "null"));
- }
- return sb.ToString();
- }
- /// <summary>
- /// Collect all registered UserSetting and HiddenSetting attributes.
- /// </summary>
- /// <returns></returns>
- public static IEnumerable<IUserSetting> FindUserSettings(IEnumerable<Assembly> assemblies, SettingVisibility visibility, BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)
- {
- var loadedTypes = assemblies.SelectMany(x => x.GetTypes());
- var loadedFields = loadedTypes.SelectMany(x => x.GetFields(flags));
- var settings = new List<IUserSetting>();
- if ((visibility & (SettingVisibility.Visible | SettingVisibility.Unlisted)) > 0)
- {
- var attributes = loadedFields.Where(prop => Attribute.IsDefined(prop, typeof(UserSettingAttribute)));
- foreach (var field in attributes)
- {
- var userSetting = (UserSettingAttribute)Attribute.GetCustomAttribute(field, typeof(UserSettingAttribute));
- if (!field.IsStatic || !typeof(IUserSetting).IsAssignableFrom(field.FieldType))
- {
- Debug.LogError("[UserSetting] is only valid on static fields of a type implementing `interface IUserSetting`. \"" + field.Name + "\" (" + field.FieldType + ")\n" + field.DeclaringType);
- continue;
- }
- bool visible = userSetting.visibleInSettingsProvider;
- if (visible && (visibility & SettingVisibility.Visible) == SettingVisibility.Visible)
- settings.Add((IUserSetting)field.GetValue(null));
- else if (!visible && (visibility & SettingVisibility.Hidden) == SettingVisibility.Hidden)
- settings.Add((IUserSetting)field.GetValue(null));
- }
- }
- if ((visibility & SettingVisibility.Unlisted) == SettingVisibility.Unlisted)
- {
- var settingsKeys = loadedFields.Where(y => Attribute.IsDefined(y, typeof(SettingsKeyAttribute)));
- foreach (var field in settingsKeys)
- {
- if (field.IsStatic)
- {
- settings.Add((IUserSetting)field.GetValue(null));
- }
- else
- {
- var settingAttribute = (SettingsKeyAttribute)Attribute.GetCustomAttribute(field, typeof(SettingsKeyAttribute));
- var pref = CreateGenericPref(settingAttribute.key, settingAttribute.scope, field);
- if (pref != null)
- settings.Add(pref);
- else
- Debug.LogWarning("Failed adding [SettingsKey] " + field.FieldType + "\"" + settingAttribute.key + "\" in " + field.DeclaringType);
- }
- }
- }
- if ((visibility & SettingVisibility.Unregistered) == SettingVisibility.Unregistered)
- {
- var unregisterd = loadedFields.Where(y => typeof(IUserSetting).IsAssignableFrom(y.FieldType)
- && !Attribute.IsDefined(y, typeof(SettingsKeyAttribute))
- && !Attribute.IsDefined(y, typeof(UserSettingAttribute)));
- foreach (var field in unregisterd)
- {
- if (field.IsStatic)
- {
- settings.Add((IUserSetting)field.GetValue(null));
- }
- else
- {
- #if PB_DEBUG
- Log.Warning("Found unregistered instance field: "
- + field.FieldType
- + " "
- + field.Name
- + " in " + field.DeclaringType);
- #endif
- }
- }
- }
- return settings;
- }
- static IUserSetting CreateGenericPref(string key, SettingsScope scope, FieldInfo field)
- {
- try
- {
- var type = field.FieldType;
- if (typeof(IUserSetting).IsAssignableFrom(type) && type.IsGenericType)
- type = type.GetGenericArguments().FirstOrDefault();
- var genericPrefClass = typeof(UserSetting<>).MakeGenericType(type);
- var defaultValue = type.IsValueType ? Activator.CreateInstance(type) : null;
- return (IUserSetting)Activator.CreateInstance(genericPrefClass, new object[] { key, defaultValue, scope });
- }
- catch
- {
- return null;
- }
- }
- }
- }
|