BITKit/Src/Unity/Scripts/UX/Library/TabContainer.cs

85 lines
1.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
namespace BITKit.UX
{
public class TabContainer : VisualElement
{
public new class UxmlTraits:VisualElement.UxmlTraits
{
private readonly UxmlStringAttributeDescription _mTabPath = new ()
{
name = "TabPath",
};
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
{
base.Init(ve, bag, cc);
var container = (TabContainer)ve;
container.TabPath = _mTabPath.GetValueFromBag(bag, cc);
}
}
public new class UxmlFactory : UxmlFactory<TabContainer, UxmlTraits> { }
public TabContainer()
{
RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
RegisterCallback<GeometryChangedEvent>(OnGeometryChanged);
}
private void OnGeometryChanged(GeometryChangedEvent evt)
{
Rebuild();
}
public string TabPath
{
get=>_tabPath;
set
{
_tabPath = value;
}
}
private string _tabPath;
private TabBar _tabBar;
private int _index;
private void OnDetachFromPanel(DetachFromPanelEvent evt)
{
Rebuild();
}
private void OnAttachToPanel(AttachToPanelEvent evt)
{
Rebuild();
}
private void Rebuild()
{
if (_tabBar is not null)
{
_tabBar.OnTabChanged -= OnTabChanged;
}
_tabBar = panel.visualTree.Q<TabBar>(TabPath);
if (_tabBar is not null)
{
_tabBar.OnTabChanged += OnTabChanged;
}
OnTabChanged(_index);
}
private void OnTabChanged(int obj)
{
_index = obj;
if (childCount <= 0) return;
for (var i = 0; i < childCount; i++)
{
var visualElement = this[i];
visualElement.SetActive(i == _index);
}
}
}
}