using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace RR.Common.UI
{
public class SettingsGroupPanel : MonoBehaviour
{
[Header("Wiring")]
[SerializeField] private TMP_Text titleText;
[SerializeField] private Button headerButton;
[SerializeField] private GameObject contentRoot; // сюда будут инстанситься строки настроек
[Header("Optional icons")]
[SerializeField] private GameObject iconExpanded;
[SerializeField] private GameObject iconCollapsed;
public Transform ContentRoot => contentRoot ? contentRoot.transform : transform;
///
/// Событие вызывается при сворачивании/разворачивании группы
///
public event Action OnExpandedChanged;
private bool expanded = true;
private string prefsKey;
private bool rememberState;
private string groupTitle = string.Empty;
public void Init(string title, string prefsKey, bool defaultExpanded, bool rememberState)
{
this.prefsKey = prefsKey;
this.rememberState = rememberState;
groupTitle = title ?? string.Empty;
if (titleText) titleText.text = title;
bool startExpanded = defaultExpanded;
if (this.rememberState && !string.IsNullOrEmpty(this.prefsKey))
startExpanded = PlayerPrefs.GetInt(this.prefsKey, defaultExpanded ? 1 : 0) == 1;
SetExpanded(startExpanded, save: false);
if (headerButton)
{
headerButton.onClick.RemoveAllListeners();
headerButton.onClick.AddListener(Toggle);
}
}
public void BindExternalDescriptionTarget(TMP_Text targetText)
{
if (headerButton == null) return;
SelectableDescriptionTarget descriptionTarget =
headerButton.GetComponent();
if (descriptionTarget == null)
descriptionTarget = headerButton.gameObject.AddComponent();
descriptionTarget.Configure(targetText, $"Группа {groupTitle}");
}
public void Toggle() => SetExpanded(!expanded, save: true);
public void SetExpanded(bool value, bool save)
{
expanded = value;
if (contentRoot) contentRoot.SetActive(expanded);
if (iconExpanded) iconExpanded.SetActive(expanded);
if (iconCollapsed) iconCollapsed.SetActive(!expanded);
if (save && rememberState && !string.IsNullOrEmpty(prefsKey))
{
PlayerPrefs.SetInt(prefsKey, expanded ? 1 : 0);
PlayerPrefs.Save();
}
// Чтобы лэйаут сразу пересчитался
var rt = transform as RectTransform;
if (rt) LayoutRebuilder.ForceRebuildLayoutImmediate(rt);
// Уведомляем подписчиков об изменении состояния
OnExpandedChanged?.Invoke(this, expanded);
}
}
}