using RR.Common.Settings;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
namespace RR.Common.UI
{
///
/// Биндер для кнопок в настройках.
/// Позволяет назначать действия кнопки настроек прямо на объекты сцены.
///
public class SettingsButtonBinder : MonoBehaviour
{
[Header("Binding")]
[Tooltip("Ключ кнопки из SettingsDatabase")]
[SerializeField] private string key;
///
/// Ключ кнопки для диспетчера
///
public string Key => key;
[Header("UI Elements (опционально)")]
[SerializeField] private Button button;
[SerializeField] private TMP_Text label;
[Header("Action")]
[Tooltip("Действие, выполняемое при нажатии кнопки")]
[SerializeField] private UnityEvent onButtonClick;
private SettingEntry def;
private bool isRegistered;
private void Awake()
{
// Регистрируемся сразу при создании (даже если объект неактивен)
RegisterIfNeeded();
}
private void Start()
{
if (string.IsNullOrWhiteSpace(key)) return;
if (SettingsManager.Instance)
{
def = SettingsManager.Instance.Define(key);
}
// Установка текста кнопки если есть
if (label && def != null)
{
string text = !string.IsNullOrEmpty(def.buttonText) ? def.buttonText : def.displayName;
if (string.IsNullOrEmpty(text)) text = key;
label.text = text;
}
// Привязка действия к локальной кнопке если есть
if (button)
{
button.onClick.RemoveAllListeners();
button.onClick.AddListener(OnButtonClick);
}
}
private void OnEnable()
{
// На случай если Awake не был вызван (объект был неактивен при загрузке сцены)
RegisterIfNeeded();
}
private void OnDestroy()
{
// Отписываемся только при уничтожении
if (isRegistered)
{
SettingsButtonDispatcher.Unregister(key, this);
isRegistered = false;
}
}
private void RegisterIfNeeded()
{
if (isRegistered || string.IsNullOrWhiteSpace(key)) return;
SettingsButtonDispatcher.Register(key, this);
isRegistered = true;
}
private void OnButtonClick()
{
Invoke();
}
///
/// Вызывается при нажатии кнопки (из диспетчера или напрямую)
///
public void Invoke()
{
onButtonClick?.Invoke();
}
}
}