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