draggableList/Tab 개발 중
This commit is contained in:
183
Assets/Scripts/UVC/UI/Tab/TabModel.cs
Normal file
183
Assets/Scripts/UVC/UI/Tab/TabModel.cs
Normal file
@@ -0,0 +1,183 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UVC.UI.Tab
|
||||
{
|
||||
/// <summary>
|
||||
/// 전체 탭 시스템의 데이터를 관리하는 모델 클래스입니다.
|
||||
/// </summary>
|
||||
public class TabModel
|
||||
{
|
||||
// 모든 탭 목록
|
||||
private List<TabData> _tabs = new List<TabData>();
|
||||
// 현재 활성화된 탭의 인덱스 (-1은 활성화된 탭이 없음을 의미)
|
||||
private int _activeTabIndex = -1;
|
||||
|
||||
// 탭 컨텐츠 인스턴스를 저장하는 Dictionary (키: tabID)
|
||||
private Dictionary<string, GameObject> _contentInstances = new Dictionary<string, GameObject>();
|
||||
|
||||
/// <summary>
|
||||
/// 현재 활성화된 탭 인덱스를 가져옵니다.
|
||||
/// </summary>
|
||||
public int ActiveTabIndex => _activeTabIndex;
|
||||
|
||||
/// <summary>
|
||||
/// 등록된 모든 탭의 목록을 가져옵니다.
|
||||
/// </summary>
|
||||
public IReadOnlyList<TabData> Tabs => _tabs;
|
||||
|
||||
/// <summary>
|
||||
/// 탭이 변경될 때 발생하는 이벤트입니다.
|
||||
/// </summary>
|
||||
public event Action<int>? OnTabChanged;
|
||||
|
||||
/// <summary>
|
||||
/// 새로운 탭을 모델에 추가합니다.
|
||||
/// </summary>
|
||||
/// <param name="tab">추가할 탭 데이터</param>
|
||||
public void AddTab(TabData tab)
|
||||
{
|
||||
_tabs.Add(tab);
|
||||
|
||||
// 첫 번째 추가된 탭을 기본 활성화 탭으로 설정
|
||||
if (_activeTabIndex == -1 && _tabs.Count == 1)
|
||||
{
|
||||
_activeTabIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 탭 인덱스로 탭을 전환합니다.
|
||||
/// </summary>
|
||||
/// <param name="tabIndex">활성화할 탭의 인덱스</param>
|
||||
public void SwitchToTab(int tabIndex)
|
||||
{
|
||||
// 인덱스 범위 확인
|
||||
if (tabIndex < 0 || tabIndex >= _tabs.Count)
|
||||
{
|
||||
Debug.LogWarning($"잘못된 탭 인덱스: {tabIndex}");
|
||||
return;
|
||||
}
|
||||
|
||||
// 같은 탭을 다시 선택한 경우 무시
|
||||
if (_activeTabIndex == tabIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// 활성화 탭 인덱스 업데이트
|
||||
_activeTabIndex = tabIndex;
|
||||
|
||||
// 이벤트 발생
|
||||
OnTabChanged?.Invoke(_activeTabIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 탭 ID로 탭을 전환합니다.
|
||||
/// </summary>
|
||||
/// <param name="tabID">활성화할 탭의 ID</param>
|
||||
public void SwitchToTab(string tabID)
|
||||
{
|
||||
for (int i = 0; i < _tabs.Count; i++)
|
||||
{
|
||||
if (_tabs[i].tabID == tabID)
|
||||
{
|
||||
SwitchToTab(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.LogWarning($"해당 ID의 탭을 찾을 수 없음: {tabID}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 현재 활성화된 탭 데이터를 반환합니다.
|
||||
/// </summary>
|
||||
/// <returns>활성화된 탭 데이터 또는 활성화된 탭이 없는 경우 null</returns>
|
||||
public TabData? GetActiveTab()
|
||||
{
|
||||
if (_activeTabIndex >= 0 && _activeTabIndex < _tabs.Count)
|
||||
{
|
||||
return _tabs[_activeTabIndex];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 탭의 contentData를 업데이트합니다.
|
||||
/// </summary>
|
||||
/// <param name="tabID">업데이트할 탭의 ID</param>
|
||||
/// <param name="newData">새로운 데이터</param>
|
||||
public void UpdateTabContentData(string tabID, object? newData)
|
||||
{
|
||||
for (int i = 0; i < _tabs.Count; i++)
|
||||
{
|
||||
if (_tabs[i].tabID == tabID)
|
||||
{
|
||||
_tabs[i].contentData = newData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 탭의 contentData를 업데이트합니다.
|
||||
/// </summary>
|
||||
/// <param name="tabIndex">업데이트할 탭의 인덱스</param>
|
||||
/// <param name="newData">새로운 데이터</param>
|
||||
public void UpdateTabContentData(int tabIndex, object? newData)
|
||||
{
|
||||
if (tabIndex >= 0 && tabIndex < _tabs.Count)
|
||||
{
|
||||
_tabs[tabIndex].contentData = newData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 탭의 컨텐츠 인스턴스를 저장합니다.
|
||||
/// </summary>
|
||||
/// <param name="tabID">탭 ID</param>
|
||||
/// <param name="instance">인스턴스화된 컨텐츠 GameObject</param>
|
||||
public void SetContentInstance(string tabID, GameObject instance)
|
||||
{
|
||||
if (_contentInstances.ContainsKey(tabID))
|
||||
{
|
||||
_contentInstances[tabID] = instance;
|
||||
}
|
||||
else
|
||||
{
|
||||
_contentInstances.Add(tabID, instance);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 탭의 컨텐츠 인스턴스를 가져옵니다.
|
||||
/// </summary>
|
||||
/// <param name="tabID">탭 ID</param>
|
||||
/// <returns>컨텐츠 인스턴스 또는 인스턴스가 없는 경우 null</returns>
|
||||
public GameObject? GetContentInstance(string tabID)
|
||||
{
|
||||
if (_contentInstances.TryGetValue(tabID, out GameObject instance))
|
||||
{
|
||||
return instance;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 인덱스로 특정 탭의 컨텐츠 인스턴스를 가져옵니다.
|
||||
/// </summary>
|
||||
/// <param name="tabIndex">탭 인덱스</param>
|
||||
/// <returns>컨텐츠 인스턴스 또는 인스턴스가 없는 경우 null</returns>
|
||||
public GameObject? GetContentInstance(int tabIndex)
|
||||
{
|
||||
if (tabIndex >= 0 && tabIndex < _tabs.Count)
|
||||
{
|
||||
return GetContentInstance(_tabs[tabIndex].tabID);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user