public static object DrawAndGetNewValue(Type type, object value, DrawInfo draw, FieldInfo field) { for (int i = 0; i < drawers.Count; i++) { if (drawers[i].TypeEquals(type)) { int index = i; IObjectDrawer d = drawers[index]; if (usingDrawerIndexs.Contains(index)) { d = GetOtherDrawer(d.GetType()); } else { usingDrawerIndexs.Add(index); } value = d.DrawAndGetNewValue(type, value, draw, field); if (!usingDrawerIndexs.Remove(index)) { ReturnOtherDrawer(d); } return(value); } } ShowUnrecognized(draw.ShowName); return(value); }
private static object DrawAndGetNewValue(Type type, FieldInfo field, object value, bool needDelayed) { bool changeable = true; bool staticField = field.IsStatic; string name = field.Name; //属性会带这个字符 if (name.Contains("k__BackingField")) { changeable = false; name = "P:" + name.Replace("k__BackingField", "").Trim().TrimStart('<').TrimEnd('>').Trim(); } if (staticField) { name = $"Static:{name}"; } var draw = new DrawInfo() { Changeable = changeable, NeedDelayed = needDelayed, ShowName = name, ShowNameWidth = -1, IsStatic = staticField, FieldName = field.Name }; for (int i = 0; i < drawers.Count; i++) { if (drawers[i].TypeEquals(type)) { int index = i; IObjectDrawer d = drawers[index]; if (usingDrawerIndexs.Contains(index)) { d = GetOtherDrawer(d.GetType()); } else { usingDrawerIndexs.Add(index); } value = d.DrawAndGetNewValue(type, value, draw, field); if (!usingDrawerIndexs.Remove(index)) { ReturnOtherDrawer(d); } return(value); } } ShowUnrecognized(name); return(value); }
///Begin GUI public object DrawGUI(IObjectDrawer objectDrawer, GUIContent content, object instance, FieldInfo fieldInfo, object context, DrawerAttribute attribute) { this.objectDrawer = objectDrawer; this.content = content; this.instance = instance; this.fieldInfo = fieldInfo; this.context = context; this.attribute = (T)attribute; return(OnGUI(content, instance)); }
///Return an object drawer instance of target inspected type public static IObjectDrawer GetObjectDrawer(Type objectType) { IObjectDrawer result = null; if (objectDrawers.TryGetValue(objectType, out result)) { return(result); } // look for specific drawer first Type fallbackDrawerType = null; foreach (var drawerType in ReflectionTools.GetImplementationsOf(typeof(IObjectDrawer))) { if (drawerType != typeof(DefaultObjectDrawer)) { var args = drawerType.BaseType.RTGetGenericArguments(); if (args.Length == 1) { if (args[0].IsEquivalentTo(objectType)) { return(objectDrawers[objectType] = Activator.CreateInstance(drawerType) as IObjectDrawer); } if (args[0].IsAssignableFrom(objectType)) { fallbackDrawerType = drawerType; } } } } if (fallbackDrawerType != null) { return(objectDrawers[objectType] = Activator.CreateInstance(fallbackDrawerType) as IObjectDrawer); } // foreach ( var drawerType in ReflectionTools.GetImplementationsOf(typeof(IObjectDrawer)) ) { // if ( drawerType != typeof(DefaultObjectDrawer) ) { // var args = drawerType.BaseType.RTGetGenericArguments(); // if ( args.Length == 1 && args[0].IsAssignableFrom(objectType) ) { // return objectDrawers[objectType] = Activator.CreateInstance(drawerType) as IObjectDrawer; // } // } // } return(objectDrawers[objectType] = new DefaultObjectDrawer(objectType)); }
private static void ReturnOtherDrawer(IObjectDrawer drawer) { Type type = drawer.GetType(); if (otherDrawers.ContainsKey(type)) { otherDrawers[type].Add(drawer); } else { otherDrawers.Add(type, new List <IObjectDrawer>() { drawer }); } }
///Begin GUI object IAttributeDrawer.DrawGUI(IObjectDrawer objectDrawer, GUIContent content, object instance, DrawerAttribute attribute, InspectedFieldInfo info) { this.objectDrawer = objectDrawer; this.content = content; this.instance = instance; this.attribute = (T)attribute; this.info = info; var result = OnGUI(content, instance); //flush references this.info = default(InspectedFieldInfo); this.content = null; this.instance = null; this.attribute = null; this.objectDrawer = null; return(result); }
public ConsoleDrawer( IDrawManager drawManager, IKeyboardManager keyboardManager, IPhraseProvider phraseProvider, IObjectDrawer canvasDrawer, IObjectDrawer dotDarwer, IObjectDrawer verticalLineDrawer, IObjectDrawer horizontalLineDrawer, IObjectDrawer gooseDrawer, IBoard board) { this.drawManager = drawManager; this.keyboardManager = keyboardManager; this.phraseProvider = phraseProvider; this.canvasDrawer = canvasDrawer; this.dotDrawer = dotDarwer; this.verticalLineDrawer = verticalLineDrawer; this.horizontalLineDrawer = horizontalLineDrawer; this.gooseDrawer = gooseDrawer; this.board = board; }
private static IObjectDrawer GetOtherDrawer(Type type) { IObjectDrawer drawer = null; if (otherDrawers.ContainsKey(type)) { drawer = otherDrawers[type][0]; otherDrawers[type].RemoveAt(0); if (otherDrawers[type].Count < 1) { otherDrawers.Remove(type); } } else { Debug.Log($"创建一个额外的Drawer:{type}"); drawer = (IObjectDrawer)Activator.CreateInstance(type); } return(drawer); }
private static void ReturnDrawer(IObjectDrawer drawer) { var t = drawer.GetType(); if (drawerPool.ContainsKey(t)) { if (drawerPool[t] == null) { drawerPool[t] = new List <IObjectDrawer>(); } drawerPool[t].Add(drawer); } else { drawerPool.Add(t, new List <IObjectDrawer>() { drawer }); } }
///Return an object drawer instance of target inspected type public static IObjectDrawer GetObjectDrawer(Type objectType) { IObjectDrawer result = null; if (objectDrawers.TryGetValue(objectType, out result)) { return(result); } foreach (var drawerType in ReflectionTools.GetImplementationsOf(typeof(IObjectDrawer))) { if (drawerType != typeof(DefaultObjectDrawer)) { var args = drawerType.BaseType.GetGenericArguments(); if (args.Length == 1 && args[0].IsAssignableFrom(objectType)) { return(objectDrawers[objectType] = Activator.CreateInstance(drawerType) as IObjectDrawer); } } } return(objectDrawers[objectType] = new DefaultObjectDrawer(objectType)); }
static ObjectDrawerHelper() { List <IObjectDrawer> list = new List <IObjectDrawer>(); Assembly assembly = typeof(ObjectDrawerHelper).Assembly; foreach (Type type in assembly.GetTypes()) { if (!type.IsDefined(typeof(ObjectDrawerAttribute))) { continue; } IObjectDrawer drawer = (IObjectDrawer)Activator.CreateInstance(type); list.Add(drawer); } if (list.Count > 2) { drawers = new List <IObjectDrawer>() { list[0] }; for (int i = 1; i < list.Count; i++) { var p = list[i].Priority; bool inserted = false; for (int j = 0; j < drawers.Count; j++) { if (p <= drawers[j].Priority) { drawers.Insert(j, list[i]); inserted = true; break; } } if (!inserted) { drawers.Add(list[i]); } } } else { drawers = new List <IObjectDrawer>(list); } var types = CollectTypes(); selectTypes = new List <Type> { null, typeof(string), typeof(int), typeof(float), typeof(bool), typeof(long), typeof(double), typeof(byte), typeof(char), typeof(decimal), typeof(sbyte), typeof(short), typeof(uint), typeof(ulong), typeof(ushort) }; for (int i = 0; i < types.Length; i++) { if (!selectTypes.Contains(types[i])) { selectTypes.Add(types[i]); } } SelectTypeNames = new string[selectTypes.Count]; SelectTypeNames[0] = "null"; for (int i = 1; i < selectTypes.Count; i++) { SelectTypeNames[i] = selectTypes[i].Name; } }