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); } } }