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

85 lines
1.7 KiB
C#
Raw Normal View History

2023-10-06 23:43:19 +08:00
using System;
2023-09-01 14:35:05 +08:00
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
namespace BITKit.UX
{
public class TabContainer : VisualElement
{
2024-08-13 18:42:51 +08:00
public new class UxmlTraits:VisualElement.UxmlTraits
2023-09-01 14:35:05 +08:00
{
2024-08-13 18:42:51 +08:00
private readonly UxmlStringAttributeDescription _mTabPath = new ()
2023-09-01 14:35:05 +08:00
{
2024-08-13 18:42:51 +08:00
name = "TabPath",
2023-09-01 14:35:05 +08:00
};
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
{
base.Init(ve, bag, cc);
2024-08-13 18:42:51 +08:00
var container = (TabContainer)ve;
container.TabPath = _mTabPath.GetValueFromBag(bag, cc);
2023-09-01 14:35:05 +08:00
}
}
public new class UxmlFactory : UxmlFactory<TabContainer, UxmlTraits> { }
public TabContainer()
{
RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);
RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);
2024-12-09 16:40:42 +08:00
RegisterCallback<GeometryChangedEvent>(OnGeometryChanged);
}
private void OnGeometryChanged(GeometryChangedEvent evt)
{
Rebuild();
2023-09-01 14:35:05 +08:00
}
2024-07-06 16:14:29 +08:00
2024-08-13 18:42:51 +08:00
public string TabPath
2024-07-06 16:14:29 +08:00
{
2024-08-13 18:42:51 +08:00
get=>_tabPath;
2023-09-01 14:35:05 +08:00
set
{
2024-08-13 18:42:51 +08:00
_tabPath = value;
2023-09-01 14:35:05 +08:00
}
}
2024-08-13 18:42:51 +08:00
private string _tabPath;
private TabBar _tabBar;
private int _index;
2023-09-01 14:35:05 +08:00
private void OnDetachFromPanel(DetachFromPanelEvent evt)
{
2024-08-13 18:42:51 +08:00
Rebuild();
2023-09-01 14:35:05 +08:00
}
private void OnAttachToPanel(AttachToPanelEvent evt)
{
2024-08-13 18:42:51 +08:00
Rebuild();
2023-09-01 14:35:05 +08:00
}
2024-08-13 18:42:51 +08:00
private void Rebuild()
2023-09-01 14:35:05 +08:00
{
2024-08-13 18:42:51 +08:00
if (_tabBar is not null)
2023-09-01 14:35:05 +08:00
{
2024-08-13 18:42:51 +08:00
_tabBar.OnTabChanged -= OnTabChanged;
2023-09-01 14:35:05 +08:00
}
2024-08-13 18:42:51 +08:00
_tabBar = panel.visualTree.Q<TabBar>(TabPath);
if (_tabBar is not null)
2024-08-08 23:07:50 +08:00
{
2024-08-13 18:42:51 +08:00
_tabBar.OnTabChanged += OnTabChanged;
2024-08-08 23:07:50 +08:00
}
2024-08-13 18:42:51 +08:00
OnTabChanged(_index);
}
2024-08-08 23:07:50 +08:00
2024-08-13 18:42:51 +08:00
private void OnTabChanged(int obj)
{
_index = obj;
if (childCount <= 0) return;
for (var i = 0; i < childCount; i++)
2024-08-08 23:07:50 +08:00
{
2024-08-13 18:42:51 +08:00
var visualElement = this[i];
visualElement.SetActive(i == _index);
2024-08-08 23:07:50 +08:00
}
2023-09-01 14:35:05 +08:00
}
}
}