#nullable enable
using System;
using System.Collections.Generic;
namespace UVC.UIToolkit
{
///
/// 라디오 버튼 그룹을 관리합니다. 하나의 버튼만 선택 상태를 유지합니다.
///
public class UTKToolBarRadioButtonGroup : IDisposable
{
#region Fields
private readonly List _buttons = new();
private bool _disposed;
#endregion
#region Properties
/// 그룹 이름
public string GroupName { get; private set; }
/// 현재 선택된 버튼
public UTKToolBarRadioButtonData? SelectedButton { get; private set; }
#endregion
#region Constructor
///
/// UTKToolBarRadioButtonGroup의 새 인스턴스를 초기화합니다.
///
/// 그룹 이름
public UTKToolBarRadioButtonGroup(string groupName)
{
GroupName = groupName;
}
#endregion
#region Methods
///
/// 버튼을 그룹에 등록합니다.
///
/// 등록할 라디오 버튼
public void RegisterButton(UTKToolBarRadioButtonData button)
{
if (!_buttons.Contains(button))
{
_buttons.Add(button);
}
}
///
/// 특정 버튼을 선택합니다. 나머지 버튼은 해제됩니다.
///
/// 선택할 버튼
/// 이벤트 발생 여부
public void SetSelected(UTKToolBarRadioButtonData? buttonToSelect, bool raiseEvent = true)
{
if (buttonToSelect != null && !_buttons.Contains(buttonToSelect))
{
UnityEngine.Debug.LogWarning($"SetSelected: 버튼 '{buttonToSelect.Text}'은 그룹 '{GroupName}'에 등록되어 있지 않습니다.");
return;
}
// 이미 선택된 버튼을 다시 클릭한 경우 무시
if (SelectedButton == buttonToSelect && buttonToSelect != null && buttonToSelect.IsSelected)
{
return;
}
SelectedButton = buttonToSelect;
foreach (var button in _buttons)
{
bool shouldBeSelected = (button == buttonToSelect);
button.SetSelected(shouldBeSelected, raiseEvent);
}
}
///
/// 모든 선택을 해제합니다.
///
/// 이벤트 발생 여부
public void ClearSelection(bool raiseEvent = true)
{
SelectedButton = null;
foreach (var button in _buttons)
{
button.SetSelected(false, raiseEvent);
}
}
///
/// 그룹 내 버튼 목록을 반환합니다.
///
/// 버튼 목록 (읽기 전용)
public IReadOnlyList GetButtons()
{
return _buttons.AsReadOnly();
}
///
/// 텍스트로 버튼을 검색합니다.
///
/// 검색할 텍스트
/// 일치하는 버튼 또는 null
public UTKToolBarRadioButtonData? FindButtonByText(string text)
{
foreach (var button in _buttons)
{
if (string.Equals(button.Text, text, StringComparison.Ordinal))
{
return button;
}
}
return null;
}
///
/// 초기 선택 상태를 적용합니다.
/// IsSelected가 true인 버튼이 있으면 해당 버튼을 선택합니다.
///
internal void InitializeSelection()
{
if (_buttons.Count == 0) return;
UTKToolBarRadioButtonData? initialButton = null;
foreach (var button in _buttons)
{
if (button.IsSelected)
{
initialButton = button;
break;
}
}
if (initialButton != null)
{
SetSelected(initialButton);
}
}
#endregion
#region IDisposable
///
/// 리소스를 정리합니다.
///
public void Dispose()
{
if (_disposed) return;
_disposed = true;
_buttons.Clear();
SelectedButton = null;
}
#endregion
}
}