List <ProjectHistory.SourceInfo> currentSourceInfo; //List will be copied void DrawInfo(Rect area, int index) { ProjectHistory.RecordInfo info = Utility.CurrentHistory[index]; GUILayout.BeginArea(area); EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); if (removeCurrentDoubleCheck) { if (GUILayout.Button("Sure?")) { Utility.CurrentHistory.RemoveAt(index); Utility.WriteCurrent(); DebugHelper.Log("Last selected information removed."); CloseCurrent(); return; } removeCurrentDoubleCheck &= !GUILayout.Button("Cancel"); } else { removeCurrentDoubleCheck |= GUILayout.Button("Remove Current Information"); } GUILayout.FlexibleSpace(); //Navigation arrows MinMaxInt range = new MinMaxInt(0, Utility.CurrentHistory.Count - 1); if (GUILayout.Button("<")) { currentIndex = range.Clamp(currentIndex - 1); currentSourceInfo = null; return; } if (GUILayout.Button(">")) { currentIndex = range.Clamp(currentIndex + 1); currentSourceInfo = null; return; } GUILayout.FlexibleSpace(); if (GUILayout.Button("Close")) { CloseCurrent(); return; } EditorGUILayout.EndHorizontal(); GUILayout.Label($"Time : {info.RecordTime.ToLocalTime():MM/dd/yyyy H:mm}"); GUILayout.Label($"Source File Count : {info.sourceFileCount}"); EditorGUILayout.Space(); GUILayout.Label($"Total Line Count : {info.codeLineCount}"); GUILayout.Label($"Line Count Without CodeHelpers : {info.codeWithoutCodeHelperCount}"); EditorGUILayout.Space(); GUILayout.Label($"Class Count (Not Accurate) : {info.classCount}"); GUILayout.Label($"Struct Count (Not Accurate) : {info.structCount}"); EditorGUILayout.Space(); EditorGUILayout.Space(); //Source files currentSourceInfo ??= new List <ProjectHistory.SourceInfo>(info.sourceInfos); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Sort By Name") && currentSourceInfo != null) { currentSourceInfo = currentSourceInfo.OrderBy(thisInfo => thisInfo.name).ToList(); currentSourceIndex = -1; } if (GUILayout.Button("Sort By Line Count") && currentSourceInfo != null) { currentSourceInfo = currentSourceInfo.OrderByDescending(thisInfo => thisInfo.lineCount).ToList(); currentSourceIndex = -1; } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); //Source info currentScrollPosition = EditorGUILayout.BeginScrollView(currentScrollPosition); for (int i = 0; i < currentSourceInfo.Count; i++) { EditorGUILayout.BeginHorizontal(); GUILayout.Label($"{currentSourceInfo[i].name} : {currentSourceInfo[i].lineCount}"); GUILayout.FlexibleSpace(); if (GUILayout.Button("Detail")) { currentSourceIndex = i; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); GUILayout.EndArea(); //Single source file info if (currentSourceIndex != -1) { var source = currentSourceInfo[currentSourceIndex]; GUILayout.BeginArea(new Rect(area.width + 100f, area.y, position.width - area.width, area.height)); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Close")) { currentSourceIndex = -1; return; } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); GUILayout.Label(source.name); EditorGUILayout.Space(); GUILayout.Label($"Source Line Count : {source.lineCount}"); GUILayout.Label($"Source Is CodeHelpers : {source.isCodeHelper}"); EditorGUILayout.Space(); GUILayout.Label($"Class Contained (Not Accurate) : {source.classContains}"); GUILayout.Label($"Struct Contained (Not Accurate) : {source.structContains}"); GUILayout.EndArea(); } }
void DrawGraph(Rect target) { Color32 backgroundColor = new Color32(45, 45, 45); Color32 textColor = new Color32(185, 185, 185); Color32 highlightColor = new Color32(250, 20, 20); EditorGUI.DrawRect(new Rect(target.position, Vector2.Scale(target.size, new Vector2(1f, -1f))), backgroundColor); Vector2 sideSpacing = new Vector2(100f, -30f); int recordCount = Utility.CurrentHistory.Count; if (recordCount == 0) { return; } MinMaxInt yRange = new MinMaxInt(Utility.CurrentHistory.Min(info => info.codeLineCount), Utility.CurrentHistory.Max(info => info.codeLineCount)); float xSpacing = recordCount == 1 ? 0f : (target.width - sideSpacing.x * 2f) / (recordCount - 1); float ySize = target.height + sideSpacing.y * 2f; Handles.color = textColor; GUI.color = textColor; int infoCount = Mathf.Clamp(graphInfoDisplayCount, 1, recordCount - 1); for (int i = 0; i < recordCount; i++) { ProjectHistory.RecordInfo info = Utility.CurrentHistory[i]; bool showingInfo = Math.Abs(GetPercent(i) * infoCount % 1f) < Math.Abs(GetPercent(i + 1) * infoCount % 1f) && Math.Abs(GetPercent(i) * infoCount % 1f) < Math.Abs(GetPercent(i - 1) * infoCount % 1f); float GetPercent(int index) => (float)index / (recordCount - 1); if (showingInfo) { GUI.Label(new Rect(target.position + sideSpacing + Vector2.right * xSpacing * i, new Vector2(100f, 100f)), info.RecordTime.ToLocalTime().ToString("MM/dd/yyyy\nH:mm")); GUILayout.BeginArea(new Rect(target.position + sideSpacing + Vector2.up * 30f + Vector2.right * xSpacing * i, new Vector2(40f, 20f))); GUI.color = Color.white; if (GUILayout.Button("Detail")) { currentIndex = i; currentSourceInfo = null; } GUI.color = textColor; GUILayout.EndArea(); } Vector2 position1 = target.position + sideSpacing + new Vector2(xSpacing * i, -yRange.InverseLerp(info.codeLineCount) * ySize); //Line if (i != recordCount - 1) { Vector2 position2 = target.position + sideSpacing + new Vector2(xSpacing * (i + 1), -yRange.InverseLerp(Utility.CurrentHistory[i + 1].codeLineCount) * ySize); Handles.DrawLine(position1, position2); } //Point if (showingInfo) { Handles.color = highlightColor; Handles.DrawWireDisc(position1, Vector3.back, 2f); Handles.color = textColor; } else { Handles.DrawWireDisc(position1, Vector3.back, 2f); } } int yLabelCount = Mathf.Clamp(yRange.Range, 2, 10); var style = new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter, normal = { textColor = Color.white } }; for (int i = 0; i < yLabelCount; i++) { float percent = i / (yLabelCount - 1f); Vector2 position = target.position + Vector2.Scale(sideSpacing, new Vector2(0.3f, 2f)) - ySize * percent * Vector2.up; GUI.Label(new Rect(position, new Vector2(50f, 50f)), Mathf.RoundToInt(yRange.Lerp(percent)).ToString(), style); } }