166 lines
4.8 KiB
C#
166 lines
4.8 KiB
C#
#nullable enable
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace UVC.UIToolkit
|
|
{
|
|
/// <summary>
|
|
/// 라디오 버튼 그룹을 관리합니다. 하나의 버튼만 선택 상태를 유지합니다.
|
|
/// </summary>
|
|
public class UTKToolBarRadioButtonGroup : IDisposable
|
|
{
|
|
#region Fields
|
|
|
|
private readonly List<UTKToolBarRadioButtonData> _buttons = new();
|
|
private bool _disposed;
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
/// <summary>그룹 이름</summary>
|
|
public string GroupName { get; private set; }
|
|
|
|
/// <summary>현재 선택된 버튼</summary>
|
|
public UTKToolBarRadioButtonData? SelectedButton { get; private set; }
|
|
|
|
#endregion
|
|
|
|
#region Constructor
|
|
|
|
/// <summary>
|
|
/// UTKToolBarRadioButtonGroup의 새 인스턴스를 초기화합니다.
|
|
/// </summary>
|
|
/// <param name="groupName">그룹 이름</param>
|
|
public UTKToolBarRadioButtonGroup(string groupName)
|
|
{
|
|
GroupName = groupName;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
/// <summary>
|
|
/// 버튼을 그룹에 등록합니다.
|
|
/// </summary>
|
|
/// <param name="button">등록할 라디오 버튼</param>
|
|
public void RegisterButton(UTKToolBarRadioButtonData button)
|
|
{
|
|
if (!_buttons.Contains(button))
|
|
{
|
|
_buttons.Add(button);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 특정 버튼을 선택합니다. 나머지 버튼은 해제됩니다.
|
|
/// </summary>
|
|
/// <param name="buttonToSelect">선택할 버튼</param>
|
|
/// <param name="raiseEvent">이벤트 발생 여부</param>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 모든 선택을 해제합니다.
|
|
/// </summary>
|
|
/// <param name="raiseEvent">이벤트 발생 여부</param>
|
|
public void ClearSelection(bool raiseEvent = true)
|
|
{
|
|
SelectedButton = null;
|
|
foreach (var button in _buttons)
|
|
{
|
|
button.SetSelected(false, raiseEvent);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 그룹 내 버튼 목록을 반환합니다.
|
|
/// </summary>
|
|
/// <returns>버튼 목록 (읽기 전용)</returns>
|
|
public IReadOnlyList<UTKToolBarRadioButtonData> GetButtons()
|
|
{
|
|
return _buttons.AsReadOnly();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 텍스트로 버튼을 검색합니다.
|
|
/// </summary>
|
|
/// <param name="text">검색할 텍스트</param>
|
|
/// <returns>일치하는 버튼 또는 null</returns>
|
|
public UTKToolBarRadioButtonData? FindButtonByText(string text)
|
|
{
|
|
foreach (var button in _buttons)
|
|
{
|
|
if (string.Equals(button.Text, text, StringComparison.Ordinal))
|
|
{
|
|
return button;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 초기 선택 상태를 적용합니다.
|
|
/// IsSelected가 true인 버튼이 있으면 해당 버튼을 선택합니다.
|
|
/// </summary>
|
|
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
|
|
|
|
/// <summary>
|
|
/// 리소스를 정리합니다.
|
|
/// </summary>
|
|
public void Dispose()
|
|
{
|
|
if (_disposed) return;
|
|
_disposed = true;
|
|
|
|
_buttons.Clear();
|
|
SelectedButton = null;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|