Files
SHI_Sample_UI/Assets/Scripts/DTNavigation/Model/NavSelectionModel.cs
2026-03-09 01:05:56 +09:00

68 lines
2.6 KiB
C#

#nullable enable
using System;
using System.Collections.Generic;
namespace DTNavigation.Model
{
/// <summary>
/// 사이드바-탑바 공유 선택 상태 모델.
/// 현재 선택된 아이템 ID와 탑바에 표시할 탭 목록(현재 그룹 기준)을 관리합니다.
/// </summary>
public sealed class NavSelectionModel
{
/// <summary>현재 선택된 자식 항목 ID (없으면 null)</summary>
public string? SelectedItemId { get; private set; }
/// <summary>현재 탭으로 표시 중인 그룹 ID</summary>
public string? ActiveGroupId { get; private set; }
private readonly List<NavChildItemModel> _tabs = new();
/// <summary>탑바에 표시 중인 탭 목록 (현재 활성 그룹의 자식 전체)</summary>
public IReadOnlyList<NavChildItemModel> Tabs => _tabs;
/// <summary>선택 항목 변경 시 발행</summary>
public event Action<string?>? OnSelectionChanged;
/// <summary>탭 목록 변경 시 발행</summary>
public event Action<IReadOnlyList<NavChildItemModel>>? OnTabsChanged;
// ──────────────────────────────────────────────────────────
/// <summary>
/// 탭 목록을 교체하고 선택 항목을 동시에 반영합니다.
/// 그룹이 동일하면 탭은 유지하고 선택만 변경합니다.
/// 그룹이 달라지면 탭 전체를 교체한 뒤 새 선택 항목을 반영합니다.
/// </summary>
public void SetGroupTabsAndSelect(
string groupId,
IReadOnlyList<NavChildItemModel> children,
string? selectedId)
{
if (ActiveGroupId != groupId)
{
ActiveGroupId = groupId;
_tabs.Clear();
for (var i = 0; i < children.Count; i++)
_tabs.Add(children[i]);
OnTabsChanged?.Invoke(_tabs);
}
if (SelectedItemId != selectedId)
{
SelectedItemId = selectedId;
OnSelectionChanged?.Invoke(selectedId);
}
}
/// <summary>탭 목록 변경 없이 선택 항목만 변경합니다 (탑바 탭 클릭 시 사용).</summary>
public void SelectItem(string? itemId)
{
if (SelectedItemId == itemId) return;
SelectedItemId = itemId;
OnSelectionChanged?.Invoke(itemId);
}
}
}