Files
2026-06-04 11:42:34 +02:00

217 lines
6.7 KiB
C#

using System;
using System.Collections.Generic;
namespace UnityEngine.Experimental.UIElements
{
// Token: 0x0200035F RID: 863
internal class VisualTreeBuilder
{
// Token: 0x060034FF RID: 13567 RVA: 0x00056AE4 File Offset: 0x00054CE4
public VisualTreeBuilder(Recycler r)
{
this.m_ElementPool = r;
this.m_ViewStates = new Stack<VisualTreeBuilder.ViewState>();
this.m_CurrentContainer = null;
this.m_CurrentViewState = new VisualTreeBuilder.ViewState(0);
this.topLevelVisualContainer = null;
this.verbose = false;
this.currentScrollView = null;
}
// Token: 0x17000C34 RID: 3124
// (get) Token: 0x06003500 RID: 13568 RVA: 0x00056B34 File Offset: 0x00054D34
// (set) Token: 0x06003501 RID: 13569 RVA: 0x00056B50 File Offset: 0x00054D50
public VisualContainer topLevelVisualContainer { get; private set; }
// Token: 0x17000C35 RID: 3125
// (get) Token: 0x06003502 RID: 13570 RVA: 0x00056B5C File Offset: 0x00054D5C
// (set) Token: 0x06003503 RID: 13571 RVA: 0x00056B78 File Offset: 0x00054D78
public bool verbose { get; set; }
// Token: 0x17000C36 RID: 3126
// (get) Token: 0x06003504 RID: 13572 RVA: 0x00056B84 File Offset: 0x00054D84
// (set) Token: 0x06003505 RID: 13573 RVA: 0x00056BA0 File Offset: 0x00054DA0
public IMScrollView currentScrollView { get; private set; }
// Token: 0x06003506 RID: 13574 RVA: 0x00056BAC File Offset: 0x00054DAC
public void NextView<TType>(out TType view) where TType : IMContainer, new()
{
this.NextElement<TType>(out view);
this.m_CurrentContainer = view;
this.m_ViewStates.Push(this.m_CurrentViewState);
this.m_CurrentViewState = new VisualTreeBuilder.ViewState(0);
IMScrollView imscrollView = this.m_CurrentContainer as IMScrollView;
if (imscrollView != null)
{
this.currentScrollView = imscrollView;
}
}
// Token: 0x06003507 RID: 13575 RVA: 0x00056C0C File Offset: 0x00054E0C
public void EndView()
{
if (this.m_ViewStates.Count < 1)
{
Debug.Assert(this.m_CurrentContainer == this.topLevelVisualContainer);
if (this.verbose)
{
Debug.LogError("Unexpected call to EndView()");
}
}
else
{
if (this.m_CurrentContainer.childrenCount > this.m_CurrentViewState.childIndex)
{
this.RecycleDescendants(this.m_CurrentContainer, this.m_CurrentViewState.childIndex);
}
Debug.Assert(this.m_CurrentContainer.parent != null);
if (this.m_CurrentContainer is IMScrollView)
{
VisualContainer visualContainer = this.m_CurrentContainer.parent;
IMScrollView imscrollView = visualContainer as IMScrollView;
while (visualContainer != null && imscrollView == null)
{
visualContainer = visualContainer.parent;
imscrollView = visualContainer as IMScrollView;
}
this.currentScrollView = imscrollView;
}
this.m_CurrentViewState = this.m_ViewStates.Pop();
this.m_CurrentContainer = this.m_CurrentContainer.parent;
}
}
// Token: 0x06003508 RID: 13576 RVA: 0x00056D14 File Offset: 0x00054F14
public void BeginGUI(VisualContainer container)
{
this.topLevelVisualContainer = container;
this.m_CurrentContainer = this.topLevelVisualContainer;
this.m_CurrentViewState = new VisualTreeBuilder.ViewState(0);
this.m_ViewStates.Clear();
}
// Token: 0x06003509 RID: 13577 RVA: 0x00056D44 File Offset: 0x00054F44
public void EndGUI()
{
if (this.topLevelVisualContainer == null)
{
Debug.Log("topLevelVisualContainer == null");
}
else
{
if (this.m_CurrentContainer != this.topLevelVisualContainer)
{
if (this.verbose)
{
Debug.LogWarning("Non-symmetrical VisualContainer calls to GUI");
}
while (this.m_CurrentContainer != this.topLevelVisualContainer)
{
this.EndView();
}
}
if (this.topLevelVisualContainer.childrenCount > this.m_CurrentViewState.childIndex)
{
this.RecycleDescendants(this.topLevelVisualContainer, this.m_CurrentViewState.childIndex);
}
this.topLevelVisualContainer = null;
this.m_CurrentContainer = null;
}
}
// Token: 0x0600350A RID: 13578 RVA: 0x00056DF8 File Offset: 0x00054FF8
public void NextElement<TType>(out TType widget) where TType : VisualElement, IOnGUIHandler, new()
{
Type typeFromHandle = typeof(TType);
widget = (TType)((object)null);
if (this.m_CurrentViewState.childIndex >= this.m_CurrentContainer.childrenCount)
{
TType ttype;
if ((ttype = this.m_ElementPool.TryReuse<TType>()) == null)
{
ttype = new TType();
}
widget = ttype;
this.m_CurrentContainer.AddChild(widget);
}
else
{
VisualElement childAt = this.m_CurrentContainer.GetChildAt(this.m_CurrentViewState.childIndex);
if (childAt.GetType() == typeFromHandle)
{
widget = childAt as TType;
}
else
{
IOnGUIHandler onGUIHandler = childAt as IOnGUIHandler;
if (onGUIHandler != null && onGUIHandler.id == 0 && !(onGUIHandler is VisualContainer))
{
this.m_CurrentContainer.RemoveChildAt(this.m_CurrentViewState.childIndex);
this.m_ElementPool.Trash(onGUIHandler);
this.NextElement<TType>(out widget);
return;
}
TType ttype2;
if ((ttype2 = this.m_ElementPool.TryReuse<TType>()) == null)
{
ttype2 = new TType();
}
widget = ttype2;
this.m_CurrentContainer.InsertChild(this.m_CurrentViewState.childIndex, widget);
}
}
Debug.Assert(widget != null);
this.m_CurrentViewState = new VisualTreeBuilder.ViewState(this.m_CurrentViewState.childIndex + 1);
}
// Token: 0x0600350B RID: 13579 RVA: 0x00056F7C File Offset: 0x0005517C
private void RecycleDescendants(VisualContainer parent, int startAtIndex)
{
while (parent.childrenCount > startAtIndex)
{
VisualElement childAt = parent.GetChildAt(startAtIndex);
VisualContainer visualContainer = childAt as VisualContainer;
if (visualContainer != null)
{
this.RecycleDescendants(visualContainer, 0);
}
IOnGUIHandler onGUIHandler = childAt as IOnGUIHandler;
if (onGUIHandler != null)
{
this.m_ElementPool.Trash(onGUIHandler);
parent.RemoveChild(childAt);
}
else
{
startAtIndex++;
}
}
}
// Token: 0x04000B36 RID: 2870
private Recycler m_ElementPool;
// Token: 0x04000B37 RID: 2871
private VisualContainer m_CurrentContainer;
// Token: 0x04000B38 RID: 2872
private VisualTreeBuilder.ViewState m_CurrentViewState;
// Token: 0x04000B39 RID: 2873
private Stack<VisualTreeBuilder.ViewState> m_ViewStates;
// Token: 0x02000360 RID: 864
private struct ViewState
{
// Token: 0x0600350C RID: 13580 RVA: 0x00056FEC File Offset: 0x000551EC
public ViewState(int childIndex)
{
this.childIndex = childIndex;
}
// Token: 0x04000B3D RID: 2877
public readonly int childIndex;
}
}
}