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); } }
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); }
public void Awake() { if (component) { Instances[component.GetType()] = component; if (Init) { ReflecTool.InvokeMethod(component, "Init", null); } } }
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); }
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(); }
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); }
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(); }
/// <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); }
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); }
/// <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); } }