Files
EnglewoodLAB/Assets/Scripts/UVC/UI/Tab/TabButtonView.cs

131 lines
4.2 KiB
C#

#nullable enable
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UVC.Extention;
namespace UVC.UI.Tab
{
/// <summary>
/// 단일 탭 버튼의 UI를 관리하는 컴포넌트입니다.
/// </summary>
public class TabButtonView : MonoBehaviour
{
[Tooltip("탭 버튼 컴포넌트")]
[SerializeField] private Button? button;
[Tooltip("탭 이름을 표시할 Text 컴포넌트")]
[SerializeField] private TextMeshProUGUI? tabText;
[Tooltip("탭 아이콘을 표시할 Image 컴포넌트")]
[SerializeField] private Image? tabIcon;
[Tooltip("탭 배경 이미지 컴포넌트")]
[SerializeField] private Image? background;
[Tooltip("탭이 활성화되었을 때의 배경 색상")]
[SerializeField] private Color activeColor = Color.white;
[Tooltip("탭이 비활성화되었을 때의 배경 색상")]
[SerializeField] private Color inactiveColor = Color.gray;
[Tooltip("탭이 활성화되었을 때의 배경 색상")]
[SerializeField] private Color activeTextColor = Color.black;
[Tooltip("탭이 비활성화되었을 때의 배경 색상")]
[SerializeField] private Color inactiveTextColor = Color.white;
private int _tabIndex;
private Action<int>? _onTabSelected;
private void Awake()
{
// Button 컴포넌트가 할당되지 않은 경우 자동으로 찾기
if (button == null)
button = GetComponent<Button>();
// 버튼 클릭 이벤트 연결
if (button != null)
{
button.onClick.AddListener(OnButtonClick);
button.transition = Selectable.Transition.None; // 버튼의 전환 효과를 비활성화
}
}
/// <summary>
/// 탭 버튼을 초기화합니다.
/// </summary>
/// <param name="index">탭 인덱스</param>
/// <param name="tabName">탭 이름</param>
/// <param name="iconpath">탭 아이콘 경로</param>
/// <param name="onSelectedCallback">탭 선택 시 호출될 콜백</param>
public void Setup(int index, string tabName, string iconpath, Action<int> onSelectedCallback)
{
_tabIndex = index;
_onTabSelected = onSelectedCallback;
// 탭 이름 설정
if (tabText != null)
tabText.text = tabName;
// 탭 아이콘 설정
if (tabIcon != null)
{
if (!iconpath.IsNullOrEmpty())
{
tabIcon.sprite = iconpath.LoadResource<Sprite>();
tabIcon.gameObject.SetActive(true);
}
else
{
tabIcon.gameObject.SetActive(false);
}
}
}
/// <summary>
/// 탭 버튼의 활성화 상태를 변경합니다.
/// </summary>
/// <param name="isActive">활성화 여부</param>
public void SetActive(bool isActive)
{
// 배경 색상 변경
if (background != null)
{
background.color = isActive ? activeColor : inactiveColor;
}
else if(button != null)
{
button.image.color = isActive ? button.colors.pressedColor : button.colors.normalColor;
}
if(tabIcon != null)
{
tabIcon.color = isActive ? activeTextColor : inactiveTextColor;
}
// 텍스트 스타일 변경
if (tabText != null) {
tabText.fontStyle = isActive ? FontStyles.Bold : FontStyles.Normal;
tabText.color = isActive ? activeTextColor : inactiveTextColor;
}
}
// 버튼 클릭 이벤트 처리
private void OnButtonClick()
{
_onTabSelected?.Invoke(_tabIndex);
}
// 게임 오브젝트가 제거될 때 이벤트 리스너 제거
private void OnDestroy()
{
_onTabSelected = null;
if (button != null)
button.onClick.RemoveListener(OnButtonClick);
}
}
}