68 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|