Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 ///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));
 }
Ejemplo n.º 4
0
        ///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));
        }
Ejemplo n.º 5
0
        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
                });
            }
        }
Ejemplo n.º 6
0
        ///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);
        }
Ejemplo n.º 7
0
 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;
 }
Ejemplo n.º 8
0
        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
                });
            }
        }
Ejemplo n.º 10
0
        ///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));
        }
Ejemplo n.º 11
0
        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;
            }
        }