@@ -145,7 +145,7 @@ public void Load(IEnumerable<ITreeData> data, string title)
145145 }
146146 }
147147
148- public Rect Render ( Rect rect , Vector2 scroll , Action < TreeNode > singleClick = null , Action < TreeNode > doubleClick = null , Action < TreeNode > rightClick = null )
148+ public Rect Render ( Rect containingRect , Rect rect , Vector2 scroll , Action < TreeNode > singleClick = null , Action < TreeNode > doubleClick = null , Action < TreeNode > rightClick = null )
149149 {
150150 if ( Event . current . type != EventType . Repaint )
151151 {
@@ -157,15 +157,20 @@ public Rect Render(Rect rect, Vector2 scroll, Action<TreeNode> singleClick = nul
157157 }
158158 }
159159
160- Profiler . BeginSample ( "TreeControl" ) ;
161- bool visible = true ;
162- var availableHeight = rect . y + rect . height ;
160+ var startDisplay = scroll . y ;
161+ var endDisplay = scroll . y + containingRect . height ;
163162
164163 RequiresRepaint = false ;
165164 rect = new Rect ( 0f , rect . y , rect . width , ItemHeight ) ;
166165
167166 var titleNode = nodes [ 0 ] ;
168- bool selectionChanged = titleNode . Render ( rect , 0f , selectedNode == titleNode , FolderStyle , TreeNodeStyle , ActiveTreeNodeStyle ) ;
167+ var selectionChanged = false ;
168+
169+ var titleDisplay = ! ( rect . y > endDisplay || rect . yMax < startDisplay ) ;
170+ if ( titleDisplay )
171+ {
172+ selectionChanged = titleNode . Render ( rect , Styles . TreeIndentation , selectedNode == titleNode , FolderStyle , TreeNodeStyle , ActiveTreeNodeStyle ) ;
173+ }
169174
170175 if ( selectionChanged )
171176 {
@@ -187,15 +192,18 @@ public Rect Render(Rect rect, Vector2 scroll, Action<TreeNode> singleClick = nul
187192 Indent ( ) ;
188193 }
189194
190- if ( visible )
195+ var changed = false ;
196+
197+ var display = ! ( rect . y > endDisplay || rect . yMax < startDisplay ) ;
198+ if ( display )
191199 {
192- var changed = node . Render ( rect , Styles . TreeIndentation , selectedNode == node , FolderStyle , TreeNodeStyle , ActiveTreeNodeStyle ) ;
200+ changed = node . Render ( rect , Styles . TreeIndentation , selectedNode == node , FolderStyle , TreeNodeStyle , ActiveTreeNodeStyle ) ;
201+ }
193202
194- if ( node . IsFolder && changed )
195- {
196- // toggle visibility for all the nodes under this one
197- ToggleNodeVisibility ( i , node ) ;
198- }
203+ if ( node . IsFolder && changed )
204+ {
205+ // toggle visibility for all the nodes under this one
206+ ToggleNodeVisibility ( i , node ) ;
199207 }
200208
201209 if ( node . Level < level )
@@ -209,10 +217,7 @@ public Rect Render(Rect rect, Vector2 scroll, Action<TreeNode> singleClick = nul
209217
210218 if ( ! node . IsHidden )
211219 {
212- if ( visible )
213- {
214- RequiresRepaint = HandleInput ( rect , node , i , singleClick , doubleClick , rightClick ) ;
215- }
220+ RequiresRepaint = HandleInput ( rect , node , i , singleClick , doubleClick , rightClick ) ;
216221 rect . y += ItemHeight + ItemSpacing ;
217222 }
218223 }
0 commit comments