diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BranchesView.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BranchesView.cs index d71a59c8c..da903033d 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BranchesView.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/BranchesView.cs @@ -317,7 +317,7 @@ private void OnTreeGUI(Rect rect) var initialRect = rect; var treeHadFocus = treeLocals.SelectedNode != null; - rect = treeLocals.Render(rect, scroll, + rect = treeLocals.Render(initialRect, rect, scroll, node =>{ }, node => { if (node.IsFolder) @@ -348,7 +348,7 @@ private void OnTreeGUI(Rect rect) rect.y += Styles.TreePadding; - rect = treeRemotes.Render(rect, scroll, + rect = treeRemotes.Render(initialRect, rect, scroll, node => { }, node => { if (node.IsFolder) @@ -358,7 +358,7 @@ private void OnTreeGUI(Rect rect) }, node => { if (node.IsFolder) - return; + return; var menu = CreateContextMenuForRemoteBranchNode(node); menu.ShowAsContext(); diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/TreeControl.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/TreeControl.cs index 5f5f505bc..09a066402 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/TreeControl.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/UI/TreeControl.cs @@ -145,7 +145,7 @@ public void Load(IEnumerable data, string title) } } - public Rect Render(Rect rect, Vector2 scroll, Action singleClick = null, Action doubleClick = null, Action rightClick = null) + public Rect Render(Rect containingRect, Rect rect, Vector2 scroll, Action singleClick = null, Action doubleClick = null, Action rightClick = null) { if (Event.current.type != EventType.Repaint) { @@ -157,15 +157,20 @@ public Rect Render(Rect rect, Vector2 scroll, Action singleClick = nul } } - Profiler.BeginSample("TreeControl"); - bool visible = true; - var availableHeight = rect.y + rect.height; + var startDisplay = scroll.y; + var endDisplay = scroll.y + containingRect.height; RequiresRepaint = false; rect = new Rect(0f, rect.y, rect.width, ItemHeight); var titleNode = nodes[0]; - bool selectionChanged = titleNode.Render(rect, 0f, selectedNode == titleNode, FolderStyle, TreeNodeStyle, ActiveTreeNodeStyle); + var selectionChanged = false; + + var titleDisplay = !(rect.y > endDisplay || rect.yMax < startDisplay); + if (titleDisplay) + { + selectionChanged = titleNode.Render(rect, Styles.TreeIndentation, selectedNode == titleNode, FolderStyle, TreeNodeStyle, ActiveTreeNodeStyle); + } if (selectionChanged) { @@ -187,15 +192,18 @@ public Rect Render(Rect rect, Vector2 scroll, Action singleClick = nul Indent(); } - if (visible) + var changed = false; + + var display = !(rect.y > endDisplay || rect.yMax < startDisplay); + if (display) { - var changed = node.Render(rect, Styles.TreeIndentation, selectedNode == node, FolderStyle, TreeNodeStyle, ActiveTreeNodeStyle); + changed = node.Render(rect, Styles.TreeIndentation, selectedNode == node, FolderStyle, TreeNodeStyle, ActiveTreeNodeStyle); + } - if (node.IsFolder && changed) - { - // toggle visibility for all the nodes under this one - ToggleNodeVisibility(i, node); - } + if (node.IsFolder && changed) + { + // toggle visibility for all the nodes under this one + ToggleNodeVisibility(i, node); } if (node.Level < level) @@ -209,10 +217,7 @@ public Rect Render(Rect rect, Vector2 scroll, Action singleClick = nul if (!node.IsHidden) { - if (visible) - { - RequiresRepaint = HandleInput(rect, node, i, singleClick, doubleClick, rightClick); - } + RequiresRepaint = HandleInput(rect, node, i, singleClick, doubleClick, rightClick); rect.y += ItemHeight + ItemSpacing; } }