public Texture2D GetGitStatusIcon() { if (!initializer.IsValidRepo) { return(GitGUI.Textures.CollabNew); } if (Repository == null) { return(GitGUI.Textures.Collab); } if (isUpdating) { return(GitGUI.GetTempSpinAnimatedTexture()); } if (gitData.RepositoryStatus.Any(e => e.Status.IsFlagSet(FileStatus.Conflicted))) { return(GitGUI.Textures.CollabConflict); } int?behindBy = Repository.Head.TrackingDetails.BehindBy; int?aheadBy = Repository.Head.TrackingDetails.AheadBy; if (behindBy.GetValueOrDefault(0) > 0) { return(GitGUI.Textures.CollabPull); } if (aheadBy.GetValueOrDefault(0) > 0) { return(GitGUI.Textures.CollabPush); } return(GitGUI.Textures.Collab); }
internal void DoFileDiff(Rect rect, StatusListEntry info, bool enabled, bool selected, GitDiffWindow window) { RectOffset elementPadding = GetElementStyle().padding; float iconSize = GetElementStyle().fixedHeight - elementPadding.vertical; float toggleSize = styles.toggle.fixedHeight; Event current = Event.current; string projectPath = gitManager.ToProjectPath(info.LocalPath); string fileName = info.Name; GitGUI.StartEnable(enabled); Rect stageToggleRect = new Rect(rect.x + rect.width - toggleSize * 2, rect.y + (rect.height - toggleSize) * 0.5f, toggleSize, toggleSize); bool canUnstage = GitManager.CanUnstage(info.State); bool canStage = GitManager.CanStage(info.State); float maxPathSize = rect.width - stageToggleRect.width - toggleSize - 21; if (current.type == EventType.Repaint) { (selected ? styles.diffElementSelected : GetElementStyle()).Draw(rect, false, false, false, false); } if (canStage && canUnstage) { maxPathSize -= stageToggleRect.width - 4; Rect stageWarnningRect = new Rect(stageToggleRect.x - stageToggleRect.width - 4, stageToggleRect.y, stageToggleRect.width, stageToggleRect.height); EditorGUIUtility.AddCursorRect(stageWarnningRect, MouseCursor.Link); if (GUI.Button(stageWarnningRect, GitGUI.IconContent("console.warnicon", "", "Unstaged changed pending. Stage to update index."), GUIStyle.none)) { string[] localPaths = gitManager.GetPathWithMeta(info.LocalPath).ToArray(); if (gitManager.Threading.IsFlagSet(GitSettingsJson.ThreadingType.Stage)) { gitManager.AsyncStage(localPaths).onComplete += (o) => { window.Repaint(); }; } else { GitCommands.Stage(gitManager.Repository, localPaths); gitManager.MarkDirtyAuto(localPaths); } window.Repaint(); } } if (current.type == EventType.Repaint) { Object asset = null; if (UniGitPathHelper.IsPathInAssetFolder(projectPath)) { asset = AssetDatabase.LoadAssetAtPath(UniGitPathHelper.IsMetaPath(projectPath) ? GitManager.AssetPathFromMeta(projectPath) : projectPath, typeof(Object)); } string extension = Path.GetExtension(projectPath); GUIContent tmpContent = GUIContent.none; if (string.IsNullOrEmpty(extension)) { tmpContent = GitGUI.GetTempContent(styles.folderIcon, "Folder"); } if (tmpContent.image == null) { if (asset != null) { tmpContent = GitGUI.GetTempContent(string.Empty, AssetDatabase.GetCachedIcon(projectPath), asset.GetType().Name); } else { tmpContent = GitGUI.GetTempContent(styles.defaultAssetIcon, "Unknown Type"); } } float x = rect.x + elementPadding.left; GUI.Box(new Rect(x, rect.y + elementPadding.top, iconSize, iconSize), tmpContent, styles.assetIcon); x += iconSize + 8; styles.diffElementName.Draw(new Rect(x, rect.y + elementPadding.top + 2, rect.width - elementPadding.right - iconSize - rect.height, EditorGUIUtility.singleLineHeight), GitGUI.GetTempContent(fileName), false, selected, selected, false); x = rect.x + elementPadding.left + iconSize + 8; foreach (var diffTypeIcon in gitOverlay.GetDiffTypeIcons(info.State, false)) { GUI.Box(new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight + 4, 21, 21), diffTypeIcon, GUIStyle.none); x += 25; } if (info.MetaChange == (MetaChangeEnum.Object | MetaChangeEnum.Meta)) { GUI.Box(new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitGUI.GetTempContent(gitOverlay.icons.objectIconSmall.image, "main asset file changed"), GUIStyle.none); x += 25; } if (info.MetaChange.IsFlagSet(MetaChangeEnum.Meta)) { GUI.Box(new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitGUI.GetTempContent(gitOverlay.icons.metaIconSmall.image, ".meta file changed"), GUIStyle.none); x += 25; } if (info.Flags.IsFlagSet(StatusEntryFlags.IsLfs)) { GUI.Box(new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitGUI.GetTempContent(gitOverlay.icons.lfsObjectIconSmall.image, "Lfs Object"), GUIStyle.none); x += 25; } if (info.Flags.IsFlagSet(StatusEntryFlags.IsSubModule)) { GUI.Box(new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitGUI.GetTempContent(gitOverlay.icons.submoduleTagIconSmall.image, "Sub Module"), GUIStyle.none); x += 25; } Vector2 pathSize = styles.diffElementPath.CalcSize(GitGUI.GetTempContent(projectPath)); pathSize.x = Mathf.Min(pathSize.x, maxPathSize - x); Rect pathRect = new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight, pathSize.x, EditorGUIUtility.singleLineHeight * 2); styles.diffElementPath.Draw(pathRect, GitGUI.GetTempContent(projectPath), false, selected, selected, false); x += pathRect.width + 4; if (!enabled) { GUI.Box(new Rect(x, rect.y + elementPadding.top + EditorGUIUtility.singleLineHeight + 4, 21, 21), GitGUI.GetTempSpinAnimatedTexture(), GUIStyle.none); //spinning animation needs constant repaint if (gitSettings.AnimationType.HasFlag(GitSettingsJson.AnimationTypeEnum.Loading)) { window.Repaint(); } } } if (canUnstage || canStage) { EditorGUI.BeginChangeCheck(); EditorGUIUtility.AddCursorRect(stageToggleRect, MouseCursor.Link); EditorGUI.Toggle(stageToggleRect, canUnstage, styles.toggle); if (EditorGUI.EndChangeCheck()) { bool updateFlag = false; if (GitManager.CanStage(info.State)) { string[] paths = gitManager.GetPathWithMeta(info.LocalPath).ToArray(); if (gitManager.Threading.IsFlagSet(GitSettingsJson.ThreadingType.Stage)) { gitManager.AsyncStage(paths).onComplete += (o) => { window.Repaint(); }; } else { GitCommands.Stage(gitManager.Repository, paths); gitManager.MarkDirtyAuto(paths); } updateFlag = true; } else if (GitManager.CanUnstage(info.State)) { string[] paths = gitManager.GetPathWithMeta(info.LocalPath).ToArray(); if (gitManager.Threading.IsFlagSet(GitSettingsJson.ThreadingType.Unstage)) { gitManager.AsyncUnstage(paths).onComplete += (o) => { window.Repaint(); }; } else { GitCommands.Unstage(gitManager.Repository, paths); gitManager.MarkDirtyAuto(paths); } updateFlag = true; } if (updateFlag) { window.Repaint(); current.Use(); } } } GitGUI.EndEnable(); }
internal void DoDiffToolbar(Rect rect, GitDiffWindow window, ref string filter) { var settings = window.GitDiffSettings; GUILayout.BeginArea(rect, GUIContent.none, EditorStyles.toolbar); EditorGUILayout.BeginHorizontal(); Rect btRect = GUILayoutUtility.GetRect(GitGUI.GetTempContent("Edit"), EditorStyles.toolbarDropDown, GUILayout.MinWidth(64)); if (GUI.Button(btRect, GitGUI.GetTempContent("Edit"), EditorStyles.toolbarDropDown)) { GenericMenuWrapper editMenu = new GenericMenuWrapper(new GenericMenu()); contextFactory.Build(editMenu, window); editMenu.GenericMenu.DropDown(btRect); } btRect = GUILayoutUtility.GetRect(GitGUI.GetTempContent("View"), EditorStyles.toolbarDropDown, GUILayout.MinWidth(64)); if (GUI.Button(btRect, GitGUI.GetTempContent("View"), EditorStyles.toolbarDropDown)) { GenericMenuWrapper viewMenu = new GenericMenuWrapper(new GenericMenu()); viewMenu.AddItem(new GUIContent("Small Elements"), prefs.GetBool(GitDiffWindowDiffElementRenderer.SmallElementsKey, false), () => { prefs.SetBool(GitDiffWindowDiffElementRenderer.SmallElementsKey, !prefs.GetBool(GitDiffWindowDiffElementRenderer.SmallElementsKey, false)); }); viewMenu.GenericMenu.DropDown(btRect); } btRect = GUILayoutUtility.GetRect(GitGUI.GetTempContent("Filter"), EditorStyles.toolbarDropDown, GUILayout.MinWidth(64)); if (GUI.Button(btRect, GitGUI.GetTempContent("Filter"), EditorStyles.toolbarDropDown)) { 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); window.UpdateStatusList(); }); genericMenu.AddItem(new GUIContent("Show None"), settings.showFileStatusTypeFilter == 0, () => { settings.showFileStatusTypeFilter = 0; window.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)); window.UpdateStatusList(); }); } genericMenu.DropDown(btRect); } btRect = GUILayoutUtility.GetRect(GitGUI.GetTempContent("Sort"), EditorStyles.toolbarDropDown, GUILayout.MinWidth(64)); if (GUI.Button(btRect, GitGUI.GetTempContent("Sort"), EditorStyles.toolbarDropDown)) { GenericMenu genericMenu = new GenericMenu(); foreach (GitDiffWindow.SortType type in Enum.GetValues(typeof(GitDiffWindow.SortType))) { GitDiffWindow.SortType t = type; genericMenu.AddItem(new GUIContent(type.GetDescription()), type == settings.sortType, () => { settings.sortType = t; window.UpdateStatusList(); }); } genericMenu.AddSeparator(""); foreach (GitDiffWindow.SortDir dir in Enum.GetValues(typeof(GitDiffWindow.SortDir))) { GitDiffWindow.SortDir d = dir; genericMenu.AddItem(new GUIContent(dir.GetDescription()), dir == settings.sortDir, () => { settings.sortDir = d; window.UpdateStatusList(); }); } genericMenu.AddSeparator(""); genericMenu.AddItem(new GUIContent("Group"), settings.merge, () => { settings.merge = !settings.merge; window.UpdateStatusList(); }); genericMenu.AddItem(new GUIContent("Prioritize Unstaged Changes"), settings.unstagedChangesPriority, () => { settings.unstagedChangesPriority = !settings.unstagedChangesPriority; window.UpdateStatusList(); }); genericMenu.DropDown(btRect); } GUIContent modulesContent = GitGUI.GetTempContent("Modules"); foreach (var subModule in data.RepositoryStatus.SubModuleEntries) { if (subModule.Status == SubmoduleStatus.InConfig) { modulesContent.image = GitGUI.Textures.WarrningIconSmall; modulesContent.tooltip = "Some modules are in config only"; break; } if (subModule.Status.HasFlag(SubmoduleStatus.WorkDirUninitialized)) { modulesContent.image = GitGUI.Textures.WarrningIconSmall; modulesContent.tooltip = "Uninitialized modules"; break; } if (subModule.Status.HasFlag(SubmoduleStatus.WorkDirModified)) { modulesContent.image = GitGUI.Textures.CollabPush; break; } if (subModule.Status.HasFlag(SubmoduleStatus.WorkDirModified)) { modulesContent.image = gitOverlay.icons.modifiedIconSmall.image; break; } if (subModule.Status.HasFlag(SubmoduleStatus.WorkDirFilesUntracked)) { modulesContent.image = gitOverlay.icons.untrackedIconSmall.image; break; } } btRect = GUILayoutUtility.GetRect(modulesContent, EditorStyles.toolbarDropDown, GUILayout.MinWidth(86)); if (GUI.Button(btRect, modulesContent, EditorStyles.toolbarDropDown)) { PopupWindow.Show(btRect, injectionHelper.CreateInstance <GitSubModulesPopup>()); } EditorGUILayout.Space(); if (!gitManager.InSubModule) { GUILayout.Toggle(true, GitGUI.GetTempContent("Main"), "GUIEditor.BreadcrumbLeft", GUILayout.MinWidth(86)); } else { if (GUILayout.Button(GitGUI.GetTempContent("Main"), "GUIEditor.BreadcrumbLeft", GUILayout.MinWidth(86))) { gitManager.SwitchToMainRepository(); } GUILayout.Toggle(true, GitGUI.GetTempContent(Path.GetFileName(gitSettings.ActiveSubModule), gitOverlay.icons.submoduleIconSmall.image), "GUIEditor.BreadcrumbMid", GUILayout.MinWidth(86)); } bool isUpdating = gitManager.IsUpdating; bool isStaging = gitManager.IsAsyncStaging; bool isDirty = gitManager.IsDirty; bool statusListUpdate = window.GetStatusListUpdateOperation() != null && !window.GetStatusListUpdateOperation().IsDone; GUIContent statusContent = null; if (isUpdating) { statusContent = GitGUI.GetTempContent("Updating...", GitGUI.GetTempSpinAnimatedTexture()); } else if (isStaging) { statusContent = GitGUI.GetTempContent("Staging...", GitGUI.GetTempSpinAnimatedTexture()); } else if (isDirty) { string updateStatus = GetUpdateStatusMessage(gitManager.GetUpdateStatus()); statusContent = GitGUI.GetTempContent(updateStatus + "... ", GitGUI.GetTempSpinAnimatedTexture()); } else if (statusListUpdate) { statusContent = GitGUI.GetTempContent(window.GetStatusBuildingState(), GitGUI.GetTempSpinAnimatedTexture()); } GUILayout.FlexibleSpace(); if (statusContent != null) { GUILayout.Label(statusContent, EditorStyles.toolbarButton); if (gitSettings.AnimationType.HasFlag(GitSettingsJson.AnimationTypeEnum.Loading)) { window.Repaint(); } } filter = searchField.OnToolbarGUI(filter); EditorGUILayout.EndHorizontal(); GUILayout.EndArea(); }