using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI; using RR.Game2D.Core.Managers; namespace RR.Common.UI { /// /// Модальное окно витрины с выбором ячейки/полки для выдачи приза. /// Отображает сетку кнопок-ячеек. Навигация — через Input System (Navigate). /// public class PrizeStandModal : Modal { /// Текущий экземпляр на сцене. Регистрируется автоматически. public static PrizeStandModal Current { get; private set; } [Header("Контент")] [Tooltip("Контейнер для кнопок ячеек (например, GridLayoutGroup).")] [SerializeField] private Transform boxButtonsContainer; [Tooltip("Префаб кнопки ячейки. Должен содержать Button и TMP_Text.")] [SerializeField] private GameObject boxButtonPrefab; [Header("UI")] [Tooltip("Текст-заголовок окна (опционально).")] [SerializeField] private TMP_Text titleText; [Tooltip("Текст заголовка по умолчанию.")] [SerializeField] private string defaultTitle = "Выберите ячейку"; [Header("Навигация")] [Tooltip("InputAction для навигации (Navigate из Input System).")] [SerializeField] private InputActionReference navigateAction; /// /// Вызывается при выборе ячейки. Параметр — номер ячейки (1-based). /// Если игрок закрыл окно без выбора, вызывается с 0. /// public event Action OnBoxSelected; private readonly List _createdButtons = new(); private bool _selectionMade; // ────────────── Lifecycle ────────────── protected override void Awake() { Current = this; base.Awake(); // При закрытии без выбора — уведомляем с 0 OnClosed += HandleClosedWithoutSelection; } private void OnDestroy() { if (Current == this) Current = null; OnClosed -= HandleClosedWithoutSelection; } // ────────────── Публичный API ────────────── /// /// Показывает окно с указанным количеством ячеек. /// /// Количество ячеек для отображения. public void Show(int boxCount) { _selectionMade = false; BuildButtons(boxCount); if (titleText != null) titleText.text = defaultTitle; Open(); GameManager.Instance?.SetPause(true); } // ────────────── Внутреннее ────────────── private void BuildButtons(int count) { ClearButtons(); if (boxButtonsContainer == null || boxButtonPrefab == null) { Debug.LogError("[PrizeStandModal] Контейнер или префаб кнопки не назначены."); return; } for (int i = 1; i <= count; i++) { GameObject btnObj = Instantiate(boxButtonPrefab, boxButtonsContainer); btnObj.name = $"BoxButton_{i}"; // Настраиваем текст TMP_Text label = btnObj.GetComponentInChildren(); if (label != null) label.text = i.ToString(); // Настраиваем кнопку Button btn = btnObj.GetComponent