//... void OnGUI() { if (targetType == null) { return; } var e = Event.current; if (e.type == EventType.ValidateCommand && e.commandName == "UndoRedoPerformed") { GUIUtility.hotControl = 0; GUIUtility.keyboardControl = 0; e.Use(); return; } GUILayout.Space(10); GUILayout.Label(string.Format("<size=14><b>{0}</b></size>", targetType.FriendlyName()), Styles.centerLabel); EditorUtils.Separator(); GUILayout.Space(10); scrollPos = GUILayout.BeginScrollView(scrollPos); var serializationInfo = new InspectedFieldInfo(unityObjectContext, null, null, null); var oldValue = read(); var newValue = EditorUtils.ReflectedFieldInspector(friendlyTitle, oldValue, targetType, serializationInfo); if (!Equals(oldValue, newValue) || GUI.changed) { write(newValue); } GUILayout.EndScrollView(); willRepaint = true; }
//THE TREE void DoTree(Rect treeRect, Event e) { if (treeGenerationThread != null) { return; } if (search != lastSearch) { lastSearch = search; hoveringIndex = -1; if (!string.IsNullOrEmpty(search)) { //provide null reference thread (thus no aborting) so that results update all the time searchGenerationThread = Threader.StartFunction(null, GenerateSearchResults, (resultNode) => { currentNode = resultNode; searchGenerationThread = null; if (current != null) { willRepaint = true; } }); } else { currentNode = rootNode; } } GUILayout.BeginArea(treeRect); scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false); GUILayout.BeginVertical(); ///---------------------------------------------------------------------------------------------- var i = 0; var itemAdded = false; string lastSearchCategory = null; var isSearch = !string.IsNullOrEmpty(search); foreach (var childPair in currentNode.children) { if (isSearch && i >= 200) { EditorGUILayout.HelpBox("There are more than 200 results. Please try refine your search input.", MessageType.Info); break; } var node = childPair.Value; var memberInfo = node.isLeaf ? node.item.userData as MemberInfo : null; var isDisabled = node.isLeaf && node.item.func == null && node.item.func2 == null; var icon = node.isLeaf ? node.item.content.image : Icons.folderIcon; if (icon == null && memberInfo != null) { icon = TypePrefs.GetTypeIcon(memberInfo); } //when within search, show category on top if (isSearch) { var searchCategory = lastSearchCategory; if (memberInfo == null || memberInfo is System.Type) { searchCategory = node.parent.fullPath != null?node.parent.fullPath.Split(new char[] { '/' }, System.StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() : null; } else { searchCategory = memberInfo.ReflectedType.FriendlyName(); } if (searchCategory != lastSearchCategory) { lastSearchCategory = searchCategory; GUI.color = EditorGUIUtility.isProSkin ? Color.black : Color.white; GUILayout.BeginHorizontal("box"); GUI.color = Color.white; GUILayout.Label(searchCategory, Styles.leftLabel, GUILayout.Height(16)); GUILayout.EndHorizontal(); } } // if (filterFavorites && !node.isFavorite && !node.HasAnyFavoriteChild()) { continue; } if (node.isLeaf && node.item.separator) { if (itemAdded) { EditorUtils.Separator(); } continue; } itemAdded = true; GUI.color = Color.clear; GUILayout.BeginHorizontal("box"); GUI.color = Color.white; //Prefix icon GUILayout.Label(icon, GUILayout.Width(22), GUILayout.Height(16)); GUI.enabled = !isDisabled; //Favorite if (currentKeyType != null) { GUI.color = node.isFavorite ? Color.white : (node.HasAnyFavoriteChild() ? new Color(1, 1, 1, 0.2f) : new Color(0f, 0f, 0f, 0.4f)); if (GUILayout.Button(Icons.favoriteIcon, GUIStyle.none, GUILayout.Width(16), GUILayout.Height(16))) { node.ToggleFavorite(); } GUI.color = Color.white; } //Content var label = node.name; var hexColor = EditorGUIUtility.isProSkin ? "#B8B8B8" : "#262626"; hexColor = isDisabled ? "#666666" : hexColor; var text = string.Format("<color={0}><size=11>{1}</size></color>", hexColor, (!node.isLeaf ? string.Format("<b>{0}</b>", label) : label)); GUILayout.Label(text, Styles.leftLabel, GUILayout.Width(0), GUILayout.ExpandWidth(true)); GUILayout.Label(node.isLeaf ? "●" : "►", Styles.leftLabel, GUILayout.Width(20)); GUILayout.EndHorizontal(); var elementRect = GUILayoutUtility.GetLastRect(); if (e.type == EventType.MouseDown && e.button == 0 && elementRect.Contains(e.mousePosition)) { e.Use(); if (node.isLeaf) { ExecuteItemFunc(node.item); break; } else { currentNode = node; hoveringIndex = 0; break; } } if (e.type == EventType.MouseMove && elementRect.Contains(e.mousePosition)) { hoveringIndex = i; } if (hoveringIndex == i) { GUI.color = hoverColor; GUI.DrawTexture(elementRect, EditorGUIUtility.whiteTexture); GUI.color = Color.white; } i++; GUI.enabled = true; } if (hoveringIndex != lastHoveringIndex) { willRepaint = true; lastHoveringIndex = hoveringIndex; } if (!itemAdded) { GUILayout.Label("No results to display with current search and filter combination"); } GUILayout.EndVertical(); EditorGUILayout.EndScrollView(); GUILayout.EndArea(); }
//THE TREE void DoTree(Rect treeRect, Event e) { GUILayout.BeginArea(treeRect); scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false); GUILayout.BeginVertical(); if (search != lastSearch) { hoveringIndex = 0; if (!string.IsNullOrEmpty(search)) { var results = new List <Node>(); foreach (var node in leafNodes) { if (filterFavorites && !node.isFavorite) { continue; } if (StringUtils.SearchMatch(search, node.name, node.category)) { results.Add(node); } } var searchRootNode = new Node() { name = "Search Root" }; //Remaks: scoring is done on category name instead of leaf name searchRootNode.children = results .OrderBy(r => StringUtils.ScoreSearchMatch(search, r.category, r.category) * (r.isFavorite? 0.5f : 1)) .ToDictionary(r => r.fullPath, r => r); currentNode = searchRootNode; } else { currentNode = rootNode; } lastSearch = search; } ///---------------------------------------------------------------------------------------------- var i = 0; var itemAdded = false; string lastSearchCategory = null; foreach (var childPair in currentNode.children) { var node = childPair.Value; var leafItem = node.item; var memberInfo = leafItem != null? leafItem.userData as MemberInfo : null; var isDisabled = leafItem != null && leafItem.func == null && leafItem.func2 == null; var icon = leafItem != null? leafItem.content.image : Icons.folderIcon; if (icon == null && memberInfo != null) { icon = UserTypePrefs.GetTypeIcon(memberInfo); } //when within search, show category on top if (!string.IsNullOrEmpty(search)) { var searchCategory = lastSearchCategory; if (memberInfo == null || memberInfo is System.Type) { searchCategory = node.parent.fullPath != null?node.parent.fullPath.Split(new char[] { '/' }, System.StringSplitOptions.RemoveEmptyEntries).FirstOrDefault() : null; } else { searchCategory = memberInfo.ReflectedType.FriendlyName(); } if (searchCategory != lastSearchCategory) { lastSearchCategory = searchCategory; GUI.color = EditorGUIUtility.isProSkin? Color.black : Color.white; GUILayout.BeginHorizontal("box"); GUI.color = Color.white; GUILayout.Label(searchCategory, Styles.leftLabel, GUILayout.Height(16)); GUILayout.EndHorizontal(); } } // if (filterFavorites && !node.isFavorite && !node.HasAnyFavoriteChild()) { continue; } if (leafItem != null && leafItem.separator) { EditorUtils.Separator(); continue; } itemAdded = true; GUI.color = EditorGUIUtility.isProSkin? Color.white : new Color(0.8f, 0.8f, 0.8f, 1); GUILayout.BeginHorizontal("box"); //Prefix icon GUI.color = Color.white; GUILayout.Label(icon, GUILayout.Width(32), GUILayout.Height(16)); GUI.enabled = !isDisabled; //Favorite if (currentKeyType != null) { GUI.color = node.isFavorite? Color.white : (node.HasAnyFavoriteChild()? new Color(1, 1, 1, 0.2f) : new Color(0f, 0f, 0f, 0.4f)); if (GUILayout.Button(Icons.favoriteIcon, GUIStyle.none, GUILayout.Width(16), GUILayout.Height(16))) { node.ToggleFavorite(); } GUI.color = Color.white; } //Content var label = node.name; var text = string.Format("<size=9>{0}</size>", (leafItem == null? string.Format("<b>{0}</b>", label) : label)); GUILayout.Box(text, (GUIStyle)"label", GUILayout.Width(0), GUILayout.ExpandWidth(true)); GUILayout.Label(leafItem != null? "●" : "►", GUILayout.Width(20)); GUILayout.EndHorizontal(); var elementRect = GUILayoutUtility.GetLastRect(); if (e.type == EventType.MouseDown && e.button == 0 && elementRect.Contains(e.mousePosition)) { e.Use(); if (leafItem != null) { ExecuteItemFunc(leafItem); break; } else { currentNode = node; hoveringIndex = 0; break; } } if (e.type == EventType.MouseMove && elementRect.Contains(e.mousePosition)) { hoveringIndex = i; } if (hoveringIndex == i) { GUI.color = hoverColor; GUI.DrawTexture(elementRect, EditorGUIUtility.whiteTexture); GUI.color = Color.white; } i++; GUI.enabled = true; } if (hoveringIndex != lastHoveringIndex) { base.editorWindow.Repaint(); lastHoveringIndex = hoveringIndex; } if (!itemAdded) { GUILayout.Label("No results to display with current search and filter combination"); } GUILayout.EndVertical(); EditorGUILayout.EndScrollView(); GUILayout.EndArea(); }
//THE TREE void DoTree(Rect treeRect, Event e) { GUILayout.BeginArea(treeRect); scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false); GUILayout.BeginVertical(); if (search != lastSearch) { hoveringIndex = 0; if (!string.IsNullOrEmpty(search)) { var searchRootNode = new Node() { name = "Search Root" }; foreach (var node in leafNodes) { if (filterFavorites && !node.isFavorite) { continue; } if (StringUtils.SearchMatch(search, node.fullPath)) { searchRootNode.children[node.fullPath] = node; } } currentNode = searchRootNode; } else { currentNode = rootNode; } lastSearch = search; } ///---------------------------------------------------------------------------------------------- var i = 0; var itemAdded = false; Node lastParent = null; foreach (var childPair in currentNode.children) { var node = childPair.Value; var leafItem = node.item; var icon = leafItem != null? leafItem.content.image : Icons.folderIcon; var isDisabled = leafItem != null && leafItem.func == null && leafItem.func2 == null; //when with search, show category on top if (!string.IsNullOrEmpty(search)) { var currentParent = node.parent; if (currentParent != lastParent) { lastParent = currentParent; GUI.color = Color.black; GUILayout.BeginHorizontal("box"); GUI.color = Color.white; var headerLabel = string.Format("<size=10><b>{0}{1}</b></size>", currentParent.unfolded? "▼" : "▶", currentParent.fullPath); if (GUILayout.Button(headerLabel, Styles.leftLabel, GUILayout.Height(16))) { currentParent.unfolded = !currentParent.unfolded; } GUILayout.EndHorizontal(); } if (!node.parent.unfolded) { continue; } } if (filterFavorites && !node.isFavorite && !node.HasAnyFavoriteChild()) { continue; } if (leafItem != null && leafItem.separator) { EditorUtils.Separator(); continue; } itemAdded = true; GUI.color = Color.white; GUILayout.BeginHorizontal("box"); GUI.color = Color.white; //Prefix icon if (icon != null) { var memberInfo = leafItem != null? leafItem.userData as MemberInfo : null; var typeInfo = memberInfo is System.Type? (System.Type)memberInfo : (memberInfo != null? memberInfo.DeclaringType : null); if (typeInfo != null && icon.name == UserTypePrefs.DEFAULT_TYPE_ICON_NAME) { GUI.color = UserTypePrefs.GetTypeColor(typeInfo); } } GUILayout.Label(icon, GUILayout.Width(32), GUILayout.Height(16)); GUI.color = Color.white; GUI.enabled = !isDisabled; //Favorite if (currentKeyType != null) { GUI.color = node.isFavorite? Color.white : (node.HasAnyFavoriteChild()? new Color(1, 1, 1, 0.2f) : new Color(0f, 0f, 0f, 0.4f)); if (GUILayout.Button(Icons.favoriteIcon, GUIStyle.none, GUILayout.Width(16), GUILayout.Height(16))) { node.ToggleFavorite(); } GUI.color = Color.white; } //Content var label = node.name; var text = string.Format("<size=9>{0}</size>", (leafItem == null? string.Format("<b>{0}</b>", label) : label)); GUILayout.Box(text, (GUIStyle)"label", GUILayout.Width(0), GUILayout.ExpandWidth(true)); GUILayout.Label(leafItem != null? "●" : "►", GUILayout.Width(20)); GUILayout.EndHorizontal(); var elementRect = GUILayoutUtility.GetLastRect(); if (e.type == EventType.MouseDown && e.button == 0 && elementRect.Contains(e.mousePosition)) { e.Use(); if (leafItem != null) { ExecuteItemFunc(leafItem); break; } else { currentNode = node; hoveringIndex = 0; break; } } if (e.type == EventType.MouseMove && elementRect.Contains(e.mousePosition)) { hoveringIndex = i; } if (hoveringIndex == i) { GUI.color = hoverColor; GUI.DrawTexture(elementRect, EditorGUIUtility.whiteTexture); GUI.color = Color.white; base.editorWindow.Repaint(); } i++; GUI.enabled = true; } if (!itemAdded) { GUILayout.Label("No results to display with current search and filter combination"); } GUILayout.EndVertical(); EditorGUILayout.EndScrollView(); GUILayout.EndArea(); }
//THE TREE void DoTree(Rect treeRect, Event e) { GUILayout.BeginArea(treeRect); ///TREE scrollPos = EditorGUILayout.BeginScrollView(scrollPos, false, false); GUILayout.BeginVertical(); if (search != lastSearch) { hoveringIndex = 0; if (!string.IsNullOrEmpty(search) && search.Length >= 2) { var searchRootNode = new Node() { name = "Search Root" }; var a = search.ToUpper(); foreach (var node in leafNodes) { var b = node.name.ToUpper(); var match = false; if (searchMode == SearchMode.Contains) { match = true; var words = a.Split(' '); foreach (var word in words) { if (!b.Contains(word)) { match = false; break; } } } if (searchMode == SearchMode.StartsWith && b.StartsWith(a)) { match = true; } if (match) { searchRootNode.children[node.name] = node; } } currentNode = searchRootNode; } else { currentNode = rootNode; } lastSearch = search; } var i = 0; var itemAdded = false; Node lastParent = null; foreach (var childPair in currentNode.children) { var node = childPair.Value; var leafItem = node.item; var icon = leafItem != null? leafItem.content.image : EditorUtils.folderIcon; var isDisabled = leafItem != null && leafItem.func == null && leafItem.func2 == null; if (leafItem != null && leafItem.separator) { EditorUtils.Separator(); continue; } if (search != null && search.Length >= 2) { var currentParent = node.parent; if (currentParent != lastParent) { lastParent = currentParent; GUI.color = EditorGUIUtility.isProSkin? Color.black : Color.white; GUILayout.BeginHorizontal("box"); GUI.color = Color.white; if (GUILayout.Button(currentParent.unfolded? "▼" : "▶", (GUIStyle)"label", GUILayout.Width(16))) { currentParent.unfolded = !currentParent.unfolded; } GUILayout.Label(string.Format("<size=12><b>{0}</b></size>", currentParent.fullPath)); GUILayout.EndHorizontal(); } if (!node.parent.unfolded) { continue; } } if (filterFavorites && !node.isFavorite && !node.HasAnyFavoriteChild()) { continue; } itemAdded = true; GUI.color = EditorGUIUtility.isProSkin? Color.white : new Color(0.8f, 0.8f, 0.8f, 1); GUILayout.BeginHorizontal("box"); GUI.color = Color.white; //Prefix icon if (icon != null) { var memberInfo = leafItem != null? leafItem.userData as MemberInfo : null; var typeInfo = memberInfo is System.Type? (System.Type)memberInfo : (memberInfo != null? memberInfo.DeclaringType : null); if (typeInfo != null && icon.name == UserTypePrefs.DEFAULT_TYPE_ICON_NAME) { GUI.color = UserTypePrefs.GetTypeColor(typeInfo); } } GUILayout.Label(icon, GUILayout.Width(32), GUILayout.Height(16)); GUI.color = Color.white; GUI.enabled = !isDisabled; //Favorite if (currentKeyType != null) { GUI.color = node.isFavorite? Color.white : (node.HasAnyFavoriteChild()? new Color(1, 1, 1, 0.2f) : new Color(0f, 0f, 0f, 0.4f)); if (GUILayout.Button(EditorUtils.favoriteIcon, GUIStyle.none, GUILayout.Width(16), GUILayout.Height(16))) { node.ToggleFavorite(); } GUI.color = Color.white; } //Content var label = node.name; if (search != null && search.Length >= 2) //simple highlight { label = Regex.Replace(label, search, "<b>$&</b>", RegexOptions.IgnoreCase); } var text = string.Format("<size=9>{0}</size>", (leafItem == null? string.Format("<b>{0}</b>", label) : label)); GUILayout.Box(text, (GUIStyle)"label", GUILayout.Width(0), GUILayout.ExpandWidth(true)); var buttonRect = GUILayoutUtility.GetLastRect(); if (e.type == EventType.MouseDown && e.button == 0 && buttonRect.Contains(e.mousePosition)) { e.Use(); if (leafItem != null) { ExecuteItemFunc(leafItem); break; } else { currentNode = node; hoveringIndex = 0; break; } } //Suffix icon GUILayout.Label(leafItem != null? "<b>+</b>" : "►", GUILayout.Width(20)); GUILayout.EndHorizontal(); var lastRect = GUILayoutUtility.GetLastRect(); if (lastRect.Contains(e.mousePosition) && e.type == EventType.MouseMove) { hoveringIndex = i; } if (hoveringIndex == i) { GUI.color = hoverColor; GUI.DrawTexture(lastRect, EditorGUIUtility.whiteTexture); GUI.color = Color.white; base.editorWindow.Repaint(); } i++; GUI.enabled = true; } if (!itemAdded) { GUILayout.Label("No results to display with current search and filter combination"); } GUILayout.EndVertical(); EditorGUILayout.EndScrollView(); GUILayout.EndArea(); }