#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 } }