Exemple #1
0
        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();
            }
        }
Exemple #4
0
        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();
        }