public override void OnGUI(Rect rect) { EditorGUILayout.Space(); float msgHeight = commitMessageStyle.CalcHeight(new GUIContent(commit.Message), rect.width); EditorGUILayout.LabelField(new GUIContent(commit.Message), commitMessageStyle, GUILayout.Height(msgHeight)); scroll = EditorGUILayout.BeginScrollView(scroll); EditorGUILayout.Space(); if (changes != null) { foreach (var change in changes) { //EditorGUILayout.BeginHorizontal(); //GUILayout.Label(change.Status.ToString(), "AssetLabel"); EditorGUILayout.BeginHorizontal("ProjectBrowserHeaderBgTop"); GUILayout.Label(new GUIContent(GitManager.GetDiffTypeIcon(change.Status, true)), GUILayout.Width(16)); GUILayout.Label(new GUIContent("(" + change.Status + ")"), "AboutWIndowLicenseLabel"); GUILayout.Space(8); foreach (var chunk in change.Path.Split('\\')) { GUILayout.Label(new GUIContent(chunk), "GUIEditor.BreadcrumbMid"); } //GUILayout.Label(new GUIContent(" (" + change.Status + ") " + change.Path)); EditorGUILayout.EndHorizontal(); Rect r = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.ContextClick) { GenericMenu menu = new GenericMenu(); if (commit.Parents.Count() == 1) { menu.AddItem(new GUIContent("Difference with previous commit"), false, () => { Commit parent = commit.Parents.Single(); GitManager.ShowDiff(change.Path, parent, commit); }); } else { menu.AddDisabledItem(new GUIContent(new GUIContent("Difference with previous commit"))); } menu.AddItem(new GUIContent("Difference with HEAD"), false, () => { GitManager.ShowDiff(change.Path, commit, GitManager.Repository.Head.Tip); }); menu.ShowAsContext(); } //EditorGUILayout.EndHorizontal(); } } else { DrawTreeEntry(commitTree, 0); } EditorGUILayout.Space(); EditorGUILayout.EndScrollView(); }
private void DoFileDiff(Rect rect, StatusListEntry info) { Event current = Event.current; if (rect.y > DiffRect.height + diffScroll.y || rect.y + rect.height < diffScroll.y) { return; } Rect stageToggleRect = new Rect(rect.x + rect.width - rect.height, rect.y + 14, rect.height, rect.height); if (current.type == EventType.Repaint) { string filePath = info.Path; string fileName = Path.GetFileName(filePath); Object asset = null; if (filePath.EndsWith(".meta")) { asset = AssetDatabase.LoadAssetAtPath(AssetDatabase.GetAssetPathFromTextMetaFilePath(filePath), typeof(Object)); } else { asset = AssetDatabase.LoadAssetAtPath(filePath, typeof(Object)); } GUI.SetNextControlName(info.Path); GUI.Box(rect, GUIContent.none, info.Selected ? "TL LogicBar 1" : styles.diffElement); bool canUnstage = GitManager.CanUnstage(info.State); bool canStage = GitManager.CanStage(info.State); if (canUnstage) { GUIContent content = EditorGUIUtility.IconContent("toggle on act@2x"); GUI.Box(new Rect(rect.x + rect.width - rect.height, rect.y + 14, rect.height, rect.height), content, GUIStyle.none); } else if (canStage) { GUIContent content = EditorGUIUtility.IconContent("toggle act@2x"); GUI.Box(stageToggleRect, content, GUIStyle.none); } GUIContent iconContent = null; string extension = Path.GetExtension(filePath); if (string.IsNullOrEmpty(extension)) { iconContent = EditorGUIUtility.IconContent("Folder Icon"); } if (iconContent == null) { if (asset != null) { iconContent = new GUIContent(AssetPreview.GetMiniThumbnail(asset)); iconContent.tooltip = asset.GetType().Name; } else { iconContent = EditorGUIUtility.IconContent("DefaultAsset Icon"); iconContent.tooltip = "Unknown Type"; } } float x = rect.x + elementSideMargin; GUI.Box(new Rect(x, rect.y + elementTopBottomMargin, iconSize, iconSize), iconContent, styles.assetIcon); x += iconSize + 8; styles.diffElementName.Draw(new Rect(x, rect.y + elementTopBottomMargin + 2, rect.width - elementSideMargin - iconSize - rect.height, EditorGUIUtility.singleLineHeight), new GUIContent(fileName), false, info.Selected, info.Selected, false); x = rect.x + elementSideMargin + iconSize + 8; GUI.Box(new Rect(x, rect.y + elementTopBottomMargin + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitManager.GetDiffTypeIcon(info.State, false), GUIStyle.none); x += 25; if (info.MetaChange.IsFlagSet(MetaChangeEnum.Meta)) { GUIContent metaIconContent = EditorGUIUtility.IconContent("UniGit/meta"); metaIconContent.tooltip = ".meta file changed"; GUI.Box(new Rect(x, rect.y + elementTopBottomMargin + EditorGUIUtility.singleLineHeight + 4, 21, 21), metaIconContent, GUIStyle.none); x += 25; } styles.diffElementPath.Draw(new Rect(x, rect.y + elementTopBottomMargin + EditorGUIUtility.singleLineHeight + 7, rect.width - elementSideMargin - iconSize - rect.height * 2, EditorGUIUtility.singleLineHeight), new GUIContent(filePath), false, info.Selected, info.Selected, false); } else if (current.type == EventType.MouseDown) { if (current.button == 0 && stageToggleRect.Contains(current.mousePosition)) { bool updateFlag = false; if (GitManager.CanStage(info.State)) { GitManager.Repository.Stage(info.Path); updateFlag = true; } else if (GitManager.CanUnstage(info.State)) { GitManager.Repository.Unstage(info.Path); updateFlag = true; } if (updateFlag) { Repaint(); current.Use(); UpdateStatusList(); } } } }
private void DoDiffScroll(Event current) { float totalTypesCount = statusList.Select(i => GetMergedStatus(i.State)).Distinct().Count(); float elementsTotalHeight = (statusList.Count(i => settings.MinimizedFileStatus.IsFlagSet(i.State)) + totalTypesCount) * elementHeight; GUILayout.BeginArea(DiffToolbarRect, GUIContent.none, "Toolbar"); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(new GUIContent("Edit"), "TE ToolbarDropDown", GUILayout.MinWidth(64))) { GenericMenu editMenu = new GenericMenu(); DoDiffElementContex(editMenu); editMenu.ShowAsContext(); } if (GUILayout.Button(new GUIContent("Filter"), "TE ToolbarDropDown", GUILayout.MinWidth(64))) { GenericMenu genericMenu = new GenericMenu(); FileStatus[] fileStatuses = (FileStatus[])Enum.GetValues(typeof(FileStatus)); genericMenu.AddItem(new GUIContent("Show All"), settings.showFileStatusTypeFilter == (FileStatus)(-1), () => { settings.showFileStatusTypeFilter = (FileStatus)(-1); UpdateStatusList(); }); genericMenu.AddItem(new GUIContent("Show None"), settings.showFileStatusTypeFilter == 0, () => { settings.showFileStatusTypeFilter = 0; UpdateStatusList(); }); for (int i = 0; i < fileStatuses.Length; i++) { FileStatus flag = fileStatuses[i]; genericMenu.AddItem(new GUIContent(flag.ToString()), settings.showFileStatusTypeFilter != (FileStatus)(-1) && settings.showFileStatusTypeFilter.IsFlagSet(flag), () => { settings.showFileStatusTypeFilter = settings.showFileStatusTypeFilter.SetFlags(flag, !settings.showFileStatusTypeFilter.IsFlagSet(flag)); UpdateStatusList(); }); } genericMenu.ShowAsContext(); } GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); GUILayout.EndArea(); diffScrollContentRect = new Rect(0, 0, Mathf.Max(DiffRect.width - 16, 512), elementsTotalHeight); diffScroll = GUI.BeginScrollView(DiffRect, diffScroll, diffScrollContentRect); int index = 0; FileStatus?lastFileStatus = null; float infoX = 0; foreach (var info in statusList) { FileStatus mergedStatus = GetMergedStatus(info.State); bool isExpanded = settings.MinimizedFileStatus.IsFlagSet(mergedStatus); Rect elementRect; if (!lastFileStatus.HasValue || lastFileStatus != mergedStatus) { elementRect = new Rect(0, infoX, diffScrollContentRect.width, elementHeight); lastFileStatus = mergedStatus; FileStatus newState = lastFileStatus.Value; if (current.type == EventType.Repaint) { styles.diffScrollHeader.Draw(elementRect, new GUIContent(mergedStatus.ToString()), false, false, false, false); GUI.Box(new Rect(elementRect.x + 12, elementRect.y + 14, elementRect.width - 12, elementRect.height - 24), new GUIContent(GitManager.GetDiffTypeIcon(info.State, false)), GUIStyle.none); ((GUIStyle)"ProjectBrowserSubAssetExpandBtn").Draw(new Rect(elementRect.x + elementRect.width + 32, elementRect.y, 24, 24), GUIContent.none, false, isExpanded, isExpanded, false); } if (elementRect.Contains(current.mousePosition)) { if (current.type == EventType.ContextClick) { GenericMenu selectAllMenu = new GenericMenu(); DoDiffStatusContex(newState, selectAllMenu); selectAllMenu.ShowAsContext(); current.Use(); } else if (current.type == EventType.MouseDown && current.button == 0) { settings.MinimizedFileStatus = settings.MinimizedFileStatus.SetFlags(mergedStatus, !isExpanded); if (!isExpanded) { statusList.SelectAll(e => e.State == newState, false); } Repaint(); current.Use(); } } infoX += elementRect.height; } if (!isExpanded) { continue; } elementRect = new Rect(0, infoX, diffScrollContentRect.width, elementHeight); DoFileDiff(elementRect, info); DoFileDiffSelection(elementRect, info, index); infoX += elementRect.height; index++; } GUI.EndScrollView(); if (Event.current.type == EventType.mouseDrag && DiffRect.Contains(Event.current.mousePosition)) { diffScroll.y -= Event.current.delta.y; Repaint(); } }
public override void OnGUI(Rect rect) { EditorGUILayout.Space(); float msgHeight = commitMessageStyle.CalcHeight(GitGUI.GetTempContent(commit.Message), rect.width); scroll = EditorGUILayout.BeginScrollView(scroll); EditorGUILayout.LabelField(GitGUI.GetTempContent(commit.Message), commitMessageStyle, GUILayout.Height(msgHeight)); if (changes != null) { foreach (var change in changes) { //EditorGUILayout.BeginHorizontal(); //GUILayout.Label(change.Status.ToString(), "AssetLabel"); EditorGUILayout.BeginHorizontal("ProjectBrowserHeaderBgTop"); GUILayout.Label(new GUIContent(GitManager.GetDiffTypeIcon(change.Status, true)) { tooltip = change.Status.ToString() }, GUILayout.Width(16)); GUILayout.Space(8); string[] pathChunks = change.Path.Split('\\'); for (int i = 0; i < pathChunks.Length; i++) { string chunk = pathChunks[i]; if (GUILayout.Button(GitGUI.GetTempContent(chunk), "GUIEditor.BreadcrumbMid")) { string assetPath = string.Join("/", pathChunks, 0, i + 1); if (assetPath.EndsWith(".meta")) { assetPath = AssetDatabase.GetAssetPathFromTextMetaFilePath(assetPath); } var asset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Object)); if (asset != null) { Selection.activeObject = asset; } } } //GUILayout.Label(new GUIContent(" (" + change.Status + ") " + change.Path)); EditorGUILayout.EndHorizontal(); Rect r = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.ContextClick && r.Contains(Event.current.mousePosition)) { string path = change.Path; GenericMenu menu = new GenericMenu(); if (commit.Parents.Count() == 1) { menu.AddItem(new GUIContent("Difference with previous commit"), false, () => { Commit parent = commit.Parents.Single(); GitManager.ShowDiff(path, parent, commit); }); } else { menu.AddDisabledItem(new GUIContent(new GUIContent("Difference with previous commit"))); } menu.AddItem(new GUIContent("Difference with HEAD"), false, () => { GitManager.ShowDiff(path, commit, GitManager.Repository.Head.Tip); }); menu.ShowAsContext(); } //EditorGUILayout.EndHorizontal(); } } else { DrawTreeEntry(commitTree, 0); } EditorGUILayout.Space(); EditorGUILayout.EndScrollView(); }