@@ -145,7 +145,7 @@ public void Load(IEnumerable<ITreeData> data, string title)
145
145
}
146
146
}
147
147
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 )
149
149
{
150
150
if ( Event . current . type != EventType . Repaint )
151
151
{
@@ -157,15 +157,20 @@ public Rect Render(Rect rect, Vector2 scroll, Action<TreeNode> singleClick = nul
157
157
}
158
158
}
159
159
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 ;
163
162
164
163
RequiresRepaint = false ;
165
164
rect = new Rect ( 0f , rect . y , rect . width , ItemHeight ) ;
166
165
167
166
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
+ }
169
174
170
175
if ( selectionChanged )
171
176
{
@@ -187,15 +192,18 @@ public Rect Render(Rect rect, Vector2 scroll, Action<TreeNode> singleClick = nul
187
192
Indent ( ) ;
188
193
}
189
194
190
- if ( visible )
195
+ var changed = false ;
196
+
197
+ var display = ! ( rect . y > endDisplay || rect . yMax < startDisplay ) ;
198
+ if ( display )
191
199
{
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
+ }
193
202
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 ) ;
199
207
}
200
208
201
209
if ( node . Level < level )
@@ -209,10 +217,7 @@ public Rect Render(Rect rect, Vector2 scroll, Action<TreeNode> singleClick = nul
209
217
210
218
if ( ! node . IsHidden )
211
219
{
212
- if ( visible )
213
- {
214
- RequiresRepaint = HandleInput ( rect , node , i , singleClick , doubleClick , rightClick ) ;
215
- }
220
+ RequiresRepaint = HandleInput ( rect , node , i , singleClick , doubleClick , rightClick ) ;
216
221
rect . y += ItemHeight + ItemSpacing ;
217
222
}
218
223
}
0 commit comments