private void DrawNode(Node node, int depth, bool collapse) { ToggleState expanded = (ToggleState)node.CustomFlags; if (depth >= _skipLevels && !(collapse && depth > 0)) { _nodesCount++; if (_nodesCount > _startIndex && _nodesCount <= _startIndex + MaxRows) { using (new GUILayout.HorizontalScope()) { if (!node.hasChildren) { expanded = ToggleState.None; } else if (node.CustomFlags == (int)ToggleState.None) { expanded = ToggleState.Off; } node.CustomFlags = (int)expanded; // title GUILayout.Space(DepthDelta * (depth - _skipLevels)); GUIHelper.ToggleButton(ref expanded, GetPrefix(node.NodeType).Color(RGBA.grey) + node.Name + " : " + node.Type.Name.Color( node.IsBaseType ? RGBA.grey : node.IsGameObject ? RGBA.magenta : node.IsEnumerable ? RGBA.cyan : RGBA.orange), () => node.CustomFlags = (int)ToggleState.On, () => node.CustomFlags = (int)ToggleState.Off, _buttonStyle, GUILayout.ExpandWidth(false), GUILayout.MinWidth(TitleMinWidth)); ; // value Color originalColor = GUI.contentColor; GUI.contentColor = node.IsException ? Color.red : node.IsNull ? Color.grey : originalColor; GUILayout.TextArea(node.ValueText); GUI.contentColor = originalColor; // instance type if (node.InstType != null && node.InstType != node.Type) { GUILayout.Label(node.InstType.Name.Color(RGBA.yellow), _buttonStyle, GUILayout.ExpandWidth(false)); } } } } if (collapse) { node.CustomFlags = (int)ToggleState.Off; } // children if (expanded.IsOn()) { DrawChildren(node, depth + 1, collapse); } string GetPrefix(NodeType nodeType) { switch (nodeType) { case NodeType.Component: return("[c] "); case NodeType.Item: return("[i] "); case NodeType.Field: return("[f] "); case NodeType.Property: return("[p] "); default: return(string.Empty); } } }