public override void OnGUI(Rect rect) { if (Event.current.type == EventType.MouseMove) { editorWindow.Repaint(); } EditorGUILayout.Space(); scroll = EditorGUILayout.BeginScrollView(scroll); foreach (var entry in data.RepositoryStatus.SubModuleEntries) { string path = entry.Path; float elementTextHeight = EditorStyles.label.CalcHeight(GitGUI.GetTempContent(path), rect.width); Rect elementRect = GUILayoutUtility.GetRect(GUIContent.none, moduleStyle, GUILayout.MinHeight(elementTextHeight + EditorGUIUtility.singleLineHeight + 24)); if (Event.current.type == EventType.Repaint) { moduleStyle.Draw(elementRect, GUIContent.none, 0); } var innerRect = new Rect(elementRect.x + 4, elementRect.y + 2, elementRect.width - 8, elementRect.height - 4); Rect nameRect = new Rect(innerRect.x, innerRect.y, innerRect.width - 24, elementTextHeight); GUI.Label(nameRect, GitGUI.GetTempContent(path)); Rect hashRect = new Rect(innerRect.x, innerRect.y + elementTextHeight, innerRect.width - 24, EditorGUIUtility.singleLineHeight); GUI.Label(hashRect, GitGUI.GetTempContent(entry.WorkDirId), EditorStyles.miniLabel); Rect iconRect = new Rect(innerRect.x, innerRect.y + elementTextHeight + EditorGUIUtility.singleLineHeight, 21, 21); bool initActive = false; if (entry.Status == SubmoduleStatus.InConfig) { GUI.Label(iconRect, GitGUI.GetTempContent(GitGUI.Textures.WarrningIconSmall, "Module is only in config."), GitGUI.Styles.IconButton); initActive = true; iconRect.x += EditorGUIUtility.singleLineHeight; } else if (entry.Status.HasFlag(SubmoduleStatus.WorkDirUninitialized)) { GUI.Label(iconRect, GitGUI.GetTempContent(GitGUI.Textures.WarrningIconSmall, "Module is uninitialized."), GitGUI.Styles.IconButton); initActive = true; iconRect.x += EditorGUIUtility.singleLineHeight; } else if (entry.Status.HasFlag(SubmoduleStatus.IndexAdded)) { GUI.Label(iconRect, GitGUI.GetTempContent(gitOverlay.icons.addedIconSmall.image, "Sub Module is in index but not in head. Commit changes to add module to head."), GitGUI.Styles.IconButton); iconRect.x += EditorGUIUtility.singleLineHeight; } else if (entry.Status.HasFlag(SubmoduleStatus.WorkDirModified)) { GUI.Label(iconRect, GitGUI.GetTempContent(GitGUI.Textures.CollabPush, "Sub Module in index and in working directory don't match. Stage module or update it."), GitGUI.Styles.IconButton); iconRect.x += EditorGUIUtility.singleLineHeight; } if (entry.Status.HasFlag(SubmoduleStatus.WorkDirFilesModified)) { GUI.Label(iconRect, GitGUI.GetTempContent(gitOverlay.icons.modifiedIconSmall.image, "Sub Module has modified files."), GitGUI.Styles.IconButton); iconRect.x += EditorGUIUtility.singleLineHeight; } if (entry.Status.HasFlag(SubmoduleStatus.WorkDirFilesUntracked)) { GUI.Label(iconRect, GitGUI.GetTempContent(gitOverlay.icons.untrackedIconSmall.image, "Sub Module has untracked files."), GitGUI.Styles.IconButton); iconRect.x += EditorGUIUtility.singleLineHeight; } if (entry.Status.HasFlag(SubmoduleStatus.WorkDirFilesIndexDirty)) { GUI.Label(iconRect, GitGUI.GetTempContent(gitOverlay.icons.addedIconSmall.image, "Sub Module has added files to index."), GitGUI.Styles.IconButton); iconRect.x += EditorGUIUtility.singleLineHeight; } GUIContent switchContent = GitGUI.GetTempContent(GitGUI.Textures.OrbitTool, "Explore"); Rect switchRect = new Rect(innerRect.x + innerRect.width - 24, innerRect.y, 24, 24); EditorGUIUtility.AddCursorRect(switchRect, MouseCursor.Link); if (GUI.Button(switchRect, switchContent, GitGUI.Styles.IconButton)) { gitManager.SwitchToSubModule(entry.Path); editorWindow.Close(); } Rect optionsRect = new Rect(innerRect.x + innerRect.width - 24, innerRect.y + 24, 24, 24); EditorGUIUtility.AddCursorRect(optionsRect, MouseCursor.Link); if (GUI.Button(optionsRect, GitGUI.IconContent("UnityEditor.SceneHierarchyWindow", string.Empty, "Options"), GitGUI.Styles.IconButton)) { GenericMenu menu = new GenericMenu(); BuildOptions(menu, path, initActive); menu.DropDown(optionsRect); } if (Event.current.type == EventType.ContextClick && elementRect.Contains(Event.current.mousePosition)) { GenericMenu menu = new GenericMenu(); BuildOptions(menu, path, initActive); menu.ShowAsContext(); } } EditorGUILayout.EndScrollView(); if (gitManager.InSubModule) { if (GUILayout.Button(GitGUI.GetTempContent("Return"))) { gitManager.SwitchToMainRepository(); } } }
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(); }