Exemplo n.º 1
0
    void DrawButton()
    {
        Type type = target.GetType();

        MethodInfo[] ms = type.GetMethods();
        foreach (var item in ms)
        {
            InspectorPlus.Button att_button = ReflecTool.GetAttribute <InspectorPlus.Button>(item);
            if (att_button != null)
            {
                if (att_button.Playing && Application.isPlaying)
                {
                }
                else if (att_button.Editor && !Application.isPlaying)
                {
                }
                else
                {
                    OnGUIUtility.Vision.GUIEnabled(false);
                }
                Button(item, att_button);

                OnGUIUtility.Vision.GUIEnabled(true);
            }
        }
    }
        private static void Init()
        {
            if (inspectorFieldParsers != null && inspectorTypeParsers != null)
            {
                return;
            }

            inspectorFieldParsers = new Dictionary <string, FieldInspectorParser>();
            List <Type> parserTypes = AssemblyTool.FindTypesInCurrentDomainWhereExtend <FieldInspectorParser>();

            foreach (var parserType in parserTypes)
            {
                var obj = ReflecTool.Instantiate(parserType);
                Debug.Log(parserType.ToString() + "   " + (obj == null));
                FieldInspectorParser fieldInspectorParser = obj as FieldInspectorParser;
                Debug.Log(parserType.ToString() + "   " + (fieldInspectorParser == null));
                inspectorFieldParsers.Add(fieldInspectorParser.Name, fieldInspectorParser);
            }

            inspectorTypeParsers = new Dictionary <Type, DefaultTypeInspector>();
            parserTypes          = AssemblyTool.FindTypesInCurrentDomainWhereExtend <DefaultTypeInspector>();
            foreach (var parserType in parserTypes)
            {
                DefaultTypeInspector defaultTypeInspector = ReflecTool.Instantiate(parserType) as DefaultTypeInspector;
                inspectorTypeParsers.Add(defaultTypeInspector.GetInspectorType(), defaultTypeInspector);
            }
        }
Exemplo n.º 3
0
        protected override TreeViewItem BuildRoot()
        {
            var root = new SeanLibIndexItem {
                id = 0, depth = -1, displayName = "SeanLib"
            };
            List <List <SeanLibIndexItem> > Map = new List <List <SeanLibIndexItem> >();
            int id = 1;

            foreach (var editor in editors)
            {
                CustomSeanLibEditor att    = ReflecTool.GetAttribute <CustomSeanLibEditor>(editor.GetType());
                string[]            pathes = att.Path.Split('/');
                if (Map.Count < pathes.Length)
                {
                    int c = pathes.Length - Map.Count;
                    for (int i = 0; i < c; i++)
                    {
                        Map.Add(new List <SeanLibIndexItem>());
                    }
                }
                SeanLibIndexItem parent = root;
                for (int i = 0; i < pathes.Length; i++)
                {
                    string node      = pathes[i];
                    var    existItem = Map[i].Find(e => e.displayName == node && e.parent == parent);
                    if (existItem == null)
                    {
                        existItem = new SeanLibIndexItem {
                            id = id++, displayName = node
                        };
                        Map[i].Add(existItem);
                        if (i == 0)
                        {
                            root.AddChild(existItem);
                        }
                        else
                        {
                            var parentItem = Map[i - 1].Find(e => e.displayName == pathes[i - 1]);
                            parentItem.AddChild(existItem);
                        }
                        if (i == pathes.Length - 1)
                        {
                            existItem.editor = editor;
                        }
                    }
                    else
                    {
                        if (i == pathes.Length - 1)
                        {
                            existItem.editor = editor;
                        }
                    }
                    parent = existItem;
                }
            }
            SetupDepthsFromParentsAndChildren(root);
            return(root);
        }
Exemplo n.º 4
0
        public void Awake()
        {
            if (component)
            {
                Instances[component.GetType()] = component;

                if (Init)
                {
                    ReflecTool.InvokeMethod(component, "Init", null);
                }
            }
        }
Exemplo n.º 5
0
        protected virtual List <ItemDetailPartInspector <T> > CreatePartInspector()
        {
            List <ItemDetailPartInspector <T> > partInspectors = new List <ItemDetailPartInspector <T> >();
            List <Type> partInspectorTypeSet = AssemblyTool.FindTypesInCurrentDomainWhereExtend <ItemDetailPartInspector <T> >();

            foreach (var partInspector in partInspectorTypeSet)
            {
                ItemDetailPartInspector <T> itemDetailPartInspector = ReflecTool.Instantiate(partInspector) as ItemDetailPartInspector <T>;
                partInspectors.Add(itemDetailPartInspector);
            }
            return(partInspectors);
        }
Exemplo n.º 6
0
    static FieldDrawerUtil()
    {
        fieldDrawers = new Dictionary <Type, FieldDrawer>();
        List <Type> drawers = AssemblyTool.FindTypesInCurrentDomainWhereAttributeIs <CustomFieldDrawer>();

        foreach (var item in drawers)
        {
            if (item.IsSubclassOf(typeof(FieldDrawer)))
            {
                CustomFieldDrawer att = item.GetAttribute <CustomFieldDrawer>();
                fieldDrawers[att.m_type] = ReflecTool.Instantiate(item) as FieldDrawer;
            }
        }
    }
 private void Init()
 {
     if (inited == null)
     {
         List <Type> partInspectors = AssemblyTool.FindTypesInCurrentDomainWhereExtend <ItemDetailPartInspector <T> >();
         foreach (var partInspector in partInspectors)
         {
             ItemDetailPartInspector <T> itemDetailPartInspector = ReflecTool.Instantiate(partInspector) as ItemDetailPartInspector <T>;
             itemDetailPartInspectors.Add(itemDetailPartInspector);
         }
         itemDetailPartInspectors.Sort(
             (l, r) =>
             { return(l.Order - r.Order); });
         OnInit();
         inited = new object();
     }
 }
    private object parentRoot(object obj)
    {
        object parent = ReflecTool.GetPrivateField <object>(obj, "m_Parent");

        if (parent == null)
        {
            parent = ReflecTool.GetPrivateProperty(obj, "parent");
        }
        if (parent == null)
        {
            return(obj);
        }
        else
        {
            return(parentRoot(parent));
        }
    }
        public void Draw(
            List <T> datas,
            Func <T, string> getDataName,
            Action <T> onSelect = null,
            Action <T> onAdd    = null)
        {
            if (datas == null)
            {
                return;
            }
            GUILayout.BeginVertical();

            for (int i = 0; i < datas.Count; i++)
            {
                GUILayout.BeginHorizontal();
                var data     = datas[i];
                var dataName = getDataName(data);
                if (GUILayout.Button(dataName))
                {
                    if (onSelect != null)
                    {
                        onSelect(data);
                    }
                }

                if (GUILayout.Button("X", GUILayout.Width(20)))
                {
                    datas.RemoveAt(i);
                    i--;
                }
                GUILayout.EndHorizontal();
            }

            if (GUILayout.Button("Add"))
            {
                var instantiate = ReflecTool.Instantiate <T>();
                if (onAdd != null)
                {
                    onAdd(instantiate);
                }
                datas.Add(instantiate);
            }

            GUILayout.EndVertical();
        }
Exemplo n.º 10
0
        public PluginImporterGroup Use(Type importType)
        {
            if (!this.importers.ContainsKey(importType))
            {
                this.importers.Add(importType, null);
                var pluginImporter = ReflecTool.Instantiate(importType) as PluginImporter;

                //引用导入插件的依赖插件
                foreach (var dependency in pluginImporter.Dependencies)
                {
                    this.Use(dependency);
                }

                this.importers[importType] = pluginImporter;
                this.importerList.Add(pluginImporter);
            }
            return(this);
        }
Exemplo n.º 11
0
        public void RefreshTreeData(SeanLibManager drawer)
        {
            var editorTypes = AssemblyTool.FindTypesInCurrentDomainWhereAttributeIs <CustomSeanLibEditor>();

            editorTypes.RemoveAll(e => ReflecTool.GetAttribute <CustomSeanLibEditor>(e).IsDoc != isdoc);
            editorTypes.Sort((l, r) =>
            {
                return(ReflecTool.GetAttribute <CustomSeanLibEditor>(l).order - ReflecTool.GetAttribute <CustomSeanLibEditor>(r).order);
            });
            editors = new List <SeanLibEditor>(editorTypes.Count);
            foreach (var item in editorTypes)
            {
                SeanLibEditor editor = ReflecTool.Instantiate(item) as SeanLibEditor;
                //editor.OnEnable(drawer);
                editors.Add(editor);
            }
            Reload();
        }
Exemplo n.º 12
0
    /// <summary>
    /// 获得目标window停靠在一起的其他window
    /// </summary>
    /// <param name="window"></param>
    /// <returns></returns>
    public List <EditorWindow> GetDockWindows(EditorWindow window)
    {
        List <EditorWindow> resultList = new List <EditorWindow>();
        object root = parentRoot(window);
        //  object dockArea = ReflecTool.GetPrivateField<object>(window, "m_Parent");
        // object splitView = ReflecTool.GetPrivateProperty(dockArea, "parent");
        //   Array panes = (Array)ReflecTool.GetPrivateProperty(splitView, "children");
        Array panes = (Array)ReflecTool.GetPrivateProperty(root, "allChildren");

        foreach (var pane in panes)
        {
            List <EditorWindow> windows = ReflecTool.GetPrivateField <List <EditorWindow> >(pane, "m_Panes");
            if (windows != null)
            {
                resultList.AddRange(windows);
            }
        }
        return(resultList);
    }
Exemplo n.º 13
0
    public static T GetLoader <T>(DownLoadAgent config) where T : UrlLoader
    {
        UrlLoader loader = null;

        if (Loaders.TryGetValue(config.GUID, out loader))
        {
            if (loader is T)
            {
                return(loader as T);
            }
            else
            {
                DebugConsole.Warning("LoaderFactory", "GetLoader", "同一个资源文件被不同的类型请求");
                return(null);
            }
        }
        loader = ReflecTool.Instantiate <T>(new Type[] { typeof(DownLoadAgent) }, new object[] { config });
        Loaders[config.GUID] = loader;
        return(loader as T);
    }
        public static IList ListEditor(string prefix, IList list, Type listType)
        {
            if (list == null)
            {
                list = ReflecTool.Instantiate(listType) as IList;
            }
            var argType = listType.IsArray ? listType.GetElementType() : listType.GetGenericArguments()[0];

            //register foldout
            if (!registeredEditorFoldouts.ContainsKey(list))
            {
                registeredEditorFoldouts[list] = false;
            }

            GUILayout.BeginVertical();

            var foldout = registeredEditorFoldouts[list];

            foldout = EditorGUILayout.Foldout(foldout, prefix);
            registeredEditorFoldouts[list] = foldout;

            if (!foldout)
            {
                GUILayout.EndVertical();
                return(list);
            }

            if (list.Equals(null))
            {
                GUILayout.Label("Null List");
                GUILayout.EndVertical();
                return(list);
            }
            GUILayout.BeginHorizontal();
            GUILayout.Space(20);
            GUILayout.BeginVertical();
            if (GUILayout.Button("Add Element"))
            {
                if (listType.IsArray)
                {
                    list = ResizeArray((Array)list, list.Count + 1);
                    registeredEditorFoldouts[list] = true;
                }
                else
                {
                    object newElement = null;
                    if (argType.IsValueType)
                    {
                        newElement = Activator.CreateInstance(argType);
                    }
                    if (!argType.IsInterface && !argType.IsAbstract && AssemblyTool.FindTypesInCurrentDomainWhereExtend(argType).Count == 1)
                    {
                        try
                        {
                            newElement = Activator.CreateInstance(argType);
                        }
                        catch (Exception)
                        {
                        }
                    }
                    list.Add(newElement);
                }
                GUI.FocusControl("");
            }

            //            EditorGUI.indentLevel++;

            for (var i = 0; i < list.Count; i++)
            {
                GUILayout.BeginVertical(GUITool.GetAreaGUIStyle(new Color(Color.grey.r, Color.grey.g, Color.grey.b, 0.3f)));
                GUILayout.BeginHorizontal();
                GUILayout.BeginVertical();
                ShowObject(list[i]);
                GUILayout.EndVertical();
                //                list[i] = GenericField("Element " + i, list[i], argType, null, null, false);
                if (GUILayout.Button("X", GUILayout.Width(18)))
                {
                    if (listType.IsArray)
                    {
                        list = ResizeArray((Array)list, list.Count - 1);
                        registeredEditorFoldouts[list] = true;
                    }
                    else
                    {
                        list.RemoveAt(i);
                    }
                    GUI.FocusControl("");
                }
                GUILayout.EndHorizontal();
                GUITool.Line(2);
                GUILayout.EndVertical();
            }
            GUILayout.EndVertical();
            GUILayout.EndHorizontal();
            //            EditorGUI.indentLevel--;
            Separator();

            GUILayout.EndVertical();
            return(list);
        }
        public static object GenericField(
            string name,
            object value,
            Type t,
            FieldInfo fieldInfo,
            object instance,
            bool withName = true)
        {
            if (t == null)
            {
                return(value);
            }

            Init();

            if (fieldInfo != null)
            {
                //检查是否有字段解析支持
                InspectorStyle       inspectorStyle = fieldInfo.GetAttribute <InspectorStyle>();
                FieldInspectorParser parser         = null;

                if (inspectorStyle != null)
                {
                    name = inspectorStyle.Name;
                    if (inspectorStyle.ParserName != null)
                    {
                        inspectorFieldParsers.TryGetValue(inspectorStyle.ParserName, out parser);
                    }
                }

                if (parser != null)
                {
                    return(parser.ParserFiled(inspectorStyle, value, t, fieldInfo, instance, withName));
                }
            }

            //检查是否有默认类型解析
            if (inspectorTypeParsers.ContainsKey(t))
            {
                return(inspectorTypeParsers[t].Show(name, value, t, fieldInfo, instance, withName));
            }

            //默认显示
            if (t == typeof(string))
            {
                if (withName)
                {
                    return(EditorGUILayout.TextField(name, (string)value));
                }
                return(EditorGUILayout.TextField((string)value));
            }

            if (t == typeof(bool))
            {
                if (withName)
                {
                    return(EditorGUILayout.Toggle(name, (bool)value));
                }
                return(EditorGUILayout.Toggle((bool)value));
            }

            if (t == typeof(int))
            {
                if (withName)
                {
                    return(EditorGUILayout.IntField(name, (int)value));
                }
                return(EditorGUILayout.IntField((int)value));
            }

            if (t == typeof(uint))
            {
                if (withName)
                {
                    return((uint)EditorGUILayout.IntField(name, Convert.ToInt32((uint)value)));
                }
                return((uint)EditorGUILayout.IntField(Convert.ToInt32((uint)value)));
            }

            if (t == typeof(float))
            {
                if (withName)
                {
                    return(EditorGUILayout.FloatField(name, (float)value));
                }
                return(EditorGUILayout.FloatField((float)value));
            }

            if (t == typeof(Vector2))
            {
                if (withName)
                {
                    return(EditorGUILayout.Vector2Field(name, (Vector2)value));
                }
                return(EditorGUILayout.Vector2Field("", (Vector2)value));
            }

            if (t == typeof(Vector3))
            {
                if (withName)
                {
                    return(EditorGUILayout.Vector3Field(name, (Vector3)value));
                }
                return(EditorGUILayout.Vector3Field("", (Vector3)value));
            }

            if (t == typeof(Vector4))
            {
                if (withName)
                {
                    return(EditorGUILayout.Vector4Field(name, (Vector4)value));
                }
                return(EditorGUILayout.Vector4Field("", (Vector4)value));
            }


            if (t == typeof(Quaternion))
            {
                var quat = (Quaternion)value;
                var vec4 = new Vector4(quat.x, quat.y, quat.z, quat.w);
                if (withName)
                {
                    vec4 = EditorGUILayout.Vector4Field(name, vec4);
                }
                else
                {
                    vec4 = EditorGUILayout.Vector4Field("", vec4);
                }

                return(new Quaternion(vec4.x, vec4.y, vec4.z, vec4.w));
            }

            if (t == typeof(Color))
            {
                if (withName)
                {
                    return(EditorGUILayout.ColorField(name, (Color)value));
                }
                return(EditorGUILayout.ColorField((Color)value));
            }

            if (t == typeof(Rect))
            {
                if (withName)
                {
                    return(EditorGUILayout.RectField(name, (Rect)value));
                }
                return(EditorGUILayout.RectField((Rect)value));
            }

            if (t == typeof(AnimationCurve))
            {
                if (withName)
                {
                    return(EditorGUILayout.CurveField(name, (AnimationCurve)value));
                }
                return(EditorGUILayout.CurveField((AnimationCurve)value));
            }

            if (t == typeof(Bounds))
            {
                if (withName)
                {
                    return(EditorGUILayout.BoundsField(name, (Bounds)value));
                }
                return(EditorGUILayout.BoundsField((Bounds)value));
            }

            if (typeof(IList).IsAssignableFrom(t))
            {
                return(ListEditor(name, (IList)value, t));
            }

            if (t.IsSubclassOf(typeof(System.Enum)))
            {
                bool hasAttribute = t.HasAttribute <FlagsAttribute>();
                if (hasAttribute)
                {
                    if (withName)
                    {
                        GUILayout.BeginHorizontal();
                        GUILayout.Label(name, GUILayout.Width(150));
                        FlagsEnumEditor(value, fieldInfo, instance);
                        GUILayout.EndHorizontal();
                    }
                    else
                    {
                        FlagsEnumEditor(value, fieldInfo, instance);
                    }
                    return(fieldInfo.GetValue(instance));
                }
                else
                {
                    if (withName)
                    {
                        return(EditorGUILayout.EnumPopup(name, (System.Enum)value));
                    }
                    return(EditorGUILayout.EnumPopup((System.Enum)value));
                }
            }
            if (typeof(UnityEngine.Object).IsAssignableFrom(t))
            {
                if (withName)
                {
                    return(EditorGUILayout.ObjectField(name, (UnityEngine.Object)value, t, true));
                }
                return(EditorGUILayout.ObjectField((UnityEngine.Object)value, t, true));
            }

            if (value == null)
            {
                try
                {
                    value = ReflecTool.Instantiate(fieldInfo.FieldType);
                    fieldInfo.SetValue(instance, value);
                }
                catch (Exception e)
                {
                    // ignored
                }
            }

            if (value != null)
            {
                GUILayout.BeginVertical();
                if (withName)
                {
                    GUILayout.Label(name);
                }
                GUILayout.BeginHorizontal();
                GUILayout.Space(20);
                GUILayout.BeginVertical();
                ShowObject(value);
                GUILayout.EndVertical();
                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
            }

            return(value);
        }
Exemplo n.º 16
0
    /// <summary>
    /// 将childwindow停靠在parentwindow中
    /// </summary>
    /// <param name="dockPosition"></param>
    /// <param name="parent"></param>
    /// <param name="child"></param>
    /// <returns></returns>
    public bool Dock(DockPosition dockPosition, EditorWindow parent, EditorWindow child)
    {
        Vector2 mouseScreenPosition = Vector2.zero;
        //获得目标窗体的父容器 需要是一个dockarea 即可停靠的区域
        object dockArea = ReflecTool.GetPrivateField <object>(parent, "m_Parent");
        //DockArea 子窗体区域
        //   object dockArea_child = ReflecTool.GetPrivateField<object>(child, "m_Parent");
        //获取可停靠容器的分屏视图
        object splitView = ReflecTool.GetPrivateProperty(dockArea, "parent");
        //获得视图在屏幕中的位置
        Rect  screenPosition = parent.position;// (Rect)ReflecTool.GetPrivateProperty(splitView, "screenPosition");
        float ZoneWidth      = Mathf.Round(Mathf.Min(1f + screenPosition.width / 4f, 260f));
        float ZoneHeight     = Mathf.Round(Mathf.Min(1f + screenPosition.height / 4f, 260f));

        //switch (dockPosition)
        //{
        //    case DockPosition.Left:
        //        {
        //            mouseScreenPosition = screenPosition.TopLeft() + new Vector2(ZoneWidth, 40f);
        //        } break;
        //    case DockPosition.Right:
        //        {
        //            mouseScreenPosition = screenPosition.TopRight() + new Vector2(-ZoneWidth, 40f); ;
        //        }
        //        break;
        //    case DockPosition.Bottom:
        //        {
        //            mouseScreenPosition = screenPosition.BottomLeft().DeltaXNew(screenPosition.width * 0.5f).DeltaY(-ZoneHeight);
        //        }
        //        break;
        //}

        /*   判断是否已经在分频视图内
         * Array panes = (Array)ReflecTool.GetPrivateProperty(splitView, "children");
         * foreach (var pane in panes)
         * {
         *    if (pane == dockArea_child)
         *        return false;
         * }*/
        //生成提取tab和目标区域的放置信息
        //object dropInfo = InvokeMethod(area, "DragOver", new object[] { child, ((Rect)GetPrivateProperty(area, "screenPosition")).position });
        object dropInfo = ReflecTool.InvokeMethod(splitView, "DragOver", new object[] { child, mouseScreenPosition });

        #region 注释 内部分屏的具体算法

        /*
         * object test = ReflecTool.InvokeMethod(splitView, "CheckRootWindowDropZones", new object[] { mouseScreenPosition }, BindingFlags.NonPublic | BindingFlags.Instance);
         * Array panes = (Array)ReflecTool.GetPrivateProperty(splitView, "children");
         * foreach (var pane in panes)
         * {
         *  screenPosition = (Rect)ReflecTool.GetPrivateProperty(splitView, "screenPosition");
         *  int num = 0;
         *  float num2 = Mathf.Round(Mathf.Min(screenPosition.width / 3f, 300f));
         *  float num3 = Mathf.Round(Mathf.Min(screenPosition.height / 3f, 300f));
         *  Rect rect = new Rect(screenPosition.x, screenPosition.y + 39f, num2, screenPosition.height - 39f);
         *  if (rect.Contains(mouseScreenPosition))
         *  {
         *      num |= 1;
         *  }
         *  Rect rect2 = new Rect(screenPosition.x, screenPosition.yMax - num3, screenPosition.width, num3);
         *  if (rect2.Contains(mouseScreenPosition))
         *  {
         *      num |= 2;
         *  }
         *  Rect rect3 = new Rect(screenPosition.xMax - num2, screenPosition.y + 39f, num2, screenPosition.height - 39f);
         *  if (rect3.Contains(mouseScreenPosition))
         *  {
         *      num |= 4;
         *  }
         *  if (num == 3)
         *  {
         *      Vector2 vector = new Vector2(screenPosition.x, screenPosition.yMax) - mouseScreenPosition;
         *      Vector2 vector2 = new Vector2(num2, -num3);
         *      if (vector.x * vector2.y - vector.y * vector2.x < 0f)
         *      {
         *          num = 1;
         *      }
         *      else
         *      {
         *          num = 2;
         *      }
         *  }
         *  else if (num == 6)
         *  {
         *      Vector2 vector3 = new Vector2(screenPosition.xMax, screenPosition.yMax) - mouseScreenPosition;
         *      Vector2 vector4 = new Vector2(-num2, -num3);
         *      if (vector3.x * vector4.y - vector3.y * vector4.x < 0f)
         *      {
         *          num = 2;
         *      }
         *      else
         *      {
         *          num = 4;
         *      }
         *  }
         *  float num4 = Mathf.Round(Mathf.Max(screenPosition.width / 3f, 100f));
         *  float num5 = Mathf.Round(Mathf.Max(screenPosition.height / 3f, 100f));
         * }*/
        #endregion

        if (dropInfo != null)
        {
            ReflecTool.SetPrivateFiled(
                dockArea,
                "s_OriginalDragSource",
                ReflecTool.GetPrivateField <object>(child, "m_Parent"),
                BindingFlags.NonPublic | BindingFlags.Static);
            try
            {
                ReflecTool.InvokeMethod(splitView, "PerformDrop", new object[] { child, dropInfo, mouseScreenPosition });
            }
            catch (Exception exception)
            {
                //Debug.LogError("放置区域错误 只能放置目标窗体左边或者右边 或者下面" + exception);
            }
            return(true);
        }
        else
        {
            return(false);
        }
    }