You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.1 KiB
C#
160 lines
5.1 KiB
C#
1 month ago
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Assertions;
|
||
|
|
||
|
namespace WalletConnectUnity.UI
|
||
|
{
|
||
|
public class WCTabsBar : MonoBehaviour
|
||
|
{
|
||
|
[SerializeField] private RectTransform _activeTabSelectionBackground;
|
||
|
[SerializeField] private float _selectionBackgroundTransitionSeconds = .15f;
|
||
|
[SerializeField] private RectTransform _mainBackground;
|
||
|
|
||
|
[SerializeField] private WCTabButton[] _buttons;
|
||
|
|
||
|
[field: SerializeField] public RectTransform RootTransform { get; private set; }
|
||
|
|
||
|
private readonly Dictionary<WCTabButton, WCTabPage> _buttonToPageDictionary = new();
|
||
|
|
||
|
private bool _isInitialized;
|
||
|
private ITabsController _controller;
|
||
|
private WCTabButton _selectedTabButton;
|
||
|
|
||
|
private bool IsEnabled => RootTransform.gameObject.activeSelf;
|
||
|
|
||
|
public void Initialize(ITabsController controller)
|
||
|
{
|
||
|
if (_isInitialized) return;
|
||
|
|
||
|
_controller = controller;
|
||
|
_controller.PageSelected += OnPageSelected;
|
||
|
|
||
|
OrientationTracker.OrientationChanged += OnOrientationChanged;
|
||
|
|
||
|
foreach (var button in _buttons)
|
||
|
button.Clicked += OnButtonSelected;
|
||
|
|
||
|
_isInitialized = true;
|
||
|
}
|
||
|
|
||
|
public void Enable(List<WCTabPage> pages)
|
||
|
{
|
||
|
Assert.IsTrue(pages.Count <= _buttons.Length, "pages.Length <= _buttons.Length");
|
||
|
|
||
|
for (var i = 0; i < pages.Count; i++)
|
||
|
{
|
||
|
var page = pages[i];
|
||
|
var button = _buttons[i];
|
||
|
|
||
|
#if UNITY_IOS || UNITY_ANDROID
|
||
|
button.Label.text = page.MobileTabButtonLabel;
|
||
|
#else
|
||
|
button.Label.text = page.DesktopTabButtonLabel;
|
||
|
#endif
|
||
|
button.RootTransform.gameObject.SetActive(true);
|
||
|
|
||
|
_buttonToPageDictionary.Add(button, page);
|
||
|
}
|
||
|
|
||
|
RootTransform.gameObject.SetActive(true);
|
||
|
|
||
|
StartCoroutine(ResizeMainBackground());
|
||
|
}
|
||
|
|
||
|
public void Disable()
|
||
|
{
|
||
|
if (!IsEnabled) return;
|
||
|
|
||
|
StopAllCoroutines();
|
||
|
|
||
|
foreach (var button in _buttons)
|
||
|
{
|
||
|
button.RootTransform.gameObject.SetActive(false);
|
||
|
}
|
||
|
|
||
|
_buttonToPageDictionary.Clear();
|
||
|
|
||
|
RootTransform.gameObject.SetActive(false);
|
||
|
}
|
||
|
|
||
|
public void OnButtonSelected(object tabButtonObj, EventArgs _)
|
||
|
{
|
||
|
var tabButton = (WCTabButton)tabButtonObj;
|
||
|
if (_selectedTabButton == tabButton) return;
|
||
|
|
||
|
_controller.SelectPage(_buttonToPageDictionary[tabButton]);
|
||
|
}
|
||
|
|
||
|
public void OnPageSelected(object _, WCTabPage page)
|
||
|
{
|
||
|
if (!IsEnabled) return;
|
||
|
|
||
|
var tabButton = _buttonToPageDictionary
|
||
|
.FirstOrDefault(kvp => kvp.Value == page)
|
||
|
.Key;
|
||
|
|
||
|
if (_selectedTabButton == tabButton) return;
|
||
|
|
||
|
if (_selectedTabButton != null)
|
||
|
_selectedTabButton.Deselect();
|
||
|
|
||
|
_selectedTabButton = tabButton;
|
||
|
_selectedTabButton.Select();
|
||
|
|
||
|
StartCoroutine(AdjustSelectionBackgroundTransformRoutine(tabButton));
|
||
|
}
|
||
|
|
||
|
private IEnumerator ResizeMainBackground()
|
||
|
{
|
||
|
// Skip one frame to allow layout groups to update
|
||
|
yield return null;
|
||
|
|
||
|
var totalTabsWidth = _buttons
|
||
|
.Where(button => button.IsVisible)
|
||
|
.Sum(button => button.RootTransform.sizeDelta.x);
|
||
|
|
||
|
const float padding = 10;
|
||
|
|
||
|
_mainBackground.sizeDelta = new Vector2(totalTabsWidth + padding, _mainBackground.sizeDelta.y);
|
||
|
}
|
||
|
|
||
|
private IEnumerator AdjustSelectionBackgroundTransformRoutine(WCTabButton tabButton)
|
||
|
{
|
||
|
// Skip a few frames to allow layout groups to update
|
||
|
yield return null;
|
||
|
yield return null;
|
||
|
|
||
|
var initialPosition = _activeTabSelectionBackground.anchoredPosition;
|
||
|
var targetPosition = tabButton.RootTransform.anchoredPosition;
|
||
|
|
||
|
var initialSize = _activeTabSelectionBackground.sizeDelta;
|
||
|
var targetSize = tabButton.RootTransform.sizeDelta;
|
||
|
|
||
|
var timeElapsed = 0f;
|
||
|
|
||
|
while (timeElapsed < _selectionBackgroundTransitionSeconds)
|
||
|
{
|
||
|
var t = timeElapsed / _selectionBackgroundTransitionSeconds;
|
||
|
|
||
|
_activeTabSelectionBackground.anchoredPosition = Vector2.Lerp(initialPosition, targetPosition, t);
|
||
|
_activeTabSelectionBackground.sizeDelta = Vector2.Lerp(initialSize, targetSize, t);
|
||
|
|
||
|
timeElapsed += Time.deltaTime;
|
||
|
|
||
|
yield return null;
|
||
|
}
|
||
|
|
||
|
_activeTabSelectionBackground.anchoredPosition = targetPosition;
|
||
|
_activeTabSelectionBackground.sizeDelta = targetSize;
|
||
|
}
|
||
|
|
||
|
private void OnOrientationChanged(object sender, ScreenOrientation _)
|
||
|
{
|
||
|
if (gameObject.activeInHierarchy)
|
||
|
StartCoroutine(AdjustSelectionBackgroundTransformRoutine(_selectedTabButton));
|
||
|
}
|
||
|
}
|
||
|
}
|