using RR.Common.Settings; using UnityEngine; namespace RR.Common.UI { /// /// Биндер для связывания кнопки настроек с модальным окном ввода текста. /// При нажатии кнопки открывает TextInputModal с текущим значением настройки, /// при подтверждении ввода сохраняет новое значение в настройку. /// /// ИСПОЛЬЗОВАНИЕ: /// 1. Создайте в MainSettingsDatabase настройку типа String (например, "prize.description") /// 2. На объект с SettingsButtonBinder добавьте компонент TextInputSettingsBinder /// 3. Укажите ссылку на TextInputModal (должен быть в сцене) /// 4. Настройте параметры: /// - settingKey: ключ настройки (если пусто, используется ключ кнопки) /// - modalTitle: заголовок окна ввода /// - maxLength: максимальная длина текста /// - customAlphabet: кастомный алфавит (опционально) /// 5. При нажатии кнопки в настройках автоматически откроется окно ввода /// 6. При подтверждении ввода значение сохранится в настройку /// /// ПРИМЕР НАСТРОЙКИ В MainSettingsDatabase: /// { /// "key": "prize.phoneNumber", /// "displayName": "Номер телефона", /// "description": "Введите номер телефона для связи", /// "group": "Prizes", /// "valueType": "String", /// "defaultString": "", /// "shownInSettings": true, /// "exposed": true /// } /// [RequireComponent(typeof(SettingsButtonBinder))] public class TextInputSettingsBinder : MonoBehaviour { [Header("Text Input Settings")] [Tooltip("Ключ настройки для сохранения/загрузки значения")] [SerializeField] private string settingKey; [Tooltip("Ссылка на модальное окно ввода текста")] [SerializeField] private TextInputModal textInputModal; [Header("Modal Settings")] [Tooltip("Заголовок модального окна")] [SerializeField] private string modalTitle = "Введите текст"; [Tooltip("Максимальная длина текста (количество ячеек)")] [SerializeField] private int maxLength = 10; [Tooltip("Алфавит для ввода (если пусто - использует дефолтный)")] [SerializeField] private string[] customAlphabet; private SettingsButtonBinder buttonBinder; private SettingEntry settingEntry; private const string BigPrizeSettingKey = "prizes.bigPrize"; private void Awake() { buttonBinder = GetComponent(); // Если ключ настройки не задан, используем ключ кнопки if (string.IsNullOrWhiteSpace(settingKey)) { settingKey = buttonBinder.Key; } Debug.Log($"[TextInputSettingsBinder] settingKey: '{settingKey}'"); // Если TextInputModal не назначен, ищем его на сцене if (textInputModal == null) { textInputModal = FindFirstObjectByType(); if (textInputModal == null) { Debug.LogError("[TextInputSettingsBinder] TextInputModal not found in scene! Please add TextInputModal to the scene or assign it manually.", this); } else { Debug.Log($"[TextInputSettingsBinder] Found TextInputModal on scene: {textInputModal.name}"); } } } private void Start() { if (string.IsNullOrWhiteSpace(settingKey)) { Debug.LogError("[TextInputSettingsBinder] Setting key is not set!", this); return; } // Получаем определение настройки if (SettingsManager.Instance) { settingEntry = SettingsManager.Instance.Define(settingKey); if (settingEntry == null) { Debug.LogWarning($"[TextInputSettingsBinder] Setting '{settingKey}' not found in SettingsManager!"); } } } private void OnEnable() { if (textInputModal != null) { textInputModal.OnTextConfirmed += OnTextConfirmed; textInputModal.OnTextCancelled += OnTextCancelled; } } private void OnDisable() { if (textInputModal != null) { textInputModal.OnTextConfirmed -= OnTextConfirmed; textInputModal.OnTextCancelled -= OnTextCancelled; } } /// /// Открывает модальное окно ввода текста с текущим значением настройки /// public void OpenTextInput() { if (textInputModal == null) { Debug.LogError("[TextInputSettingsBinder] TextInputModal is not assigned!", this); return; } // Загружаем текущее значение из настройки string currentValue = LoadCurrentValue(); // ВАЖНО: Порядок вызовов: // 1. Сначала устанавливаем алфавит (если задан) if (customAlphabet != null && customAlphabet.Length > 0) { textInputModal.SetAlphabet(customAlphabet); } // 2. Потом устанавливаем количество ячеек (это создаст ячейки с сохраненным текстом) if (maxLength > 0) { textInputModal.SetCellCount(maxLength); } // 3. Открываем модалку с текущим значением (ячейки уже созданы, просто обновим значения) textInputModal.OpenForInput(modalTitle, currentValue); } /// /// Загружает текущее значение настройки /// private string LoadCurrentValue() { if (SettingsManager.Instance == null) { Debug.LogWarning("[TextInputSettingsBinder] SettingsManager is not available!"); return ""; } // Проверяем, существует ли настройка var entry = SettingsManager.Instance.Define(settingKey); if (entry == null) { Debug.LogWarning($"[TextInputSettingsBinder] Setting '{settingKey}' not found!"); return ""; } // Пытаемся загрузить значение как строку try { string value = SettingsManager.Instance.GetString(settingKey); return value ?? string.Empty; } catch (System.Exception ex) { Debug.LogWarning($"[TextInputSettingsBinder] Failed to load value for '{settingKey}': {ex.Message}"); return string.Empty; } } private string NormalizeConfirmedValue(string text) { if (settingKey == BigPrizeSettingKey) { return string.IsNullOrWhiteSpace(text) ? string.Empty : text.Trim(); } return text ?? string.Empty; } /// /// Вызывается при подтверждении ввода текста /// private void OnTextConfirmed(string text) { if (SettingsManager.Instance == null) { Debug.LogError("[TextInputSettingsBinder] SettingsManager is not available!"); return; } text = NormalizeConfirmedValue(text); // Сохраняем значение в настройку SettingsManager.Instance.SetString(settingKey, text); // Автоматически сохраняем настройки на диск SettingsManager.Instance.SaveSettings(); } /// /// Вызывается при отмене ввода текста /// private void OnTextCancelled() { // Ничего не делаем при отмене } /// /// Устанавливает заголовок модального окна /// public void SetModalTitle(string title) { modalTitle = title; } /// /// Устанавливает максимальную длину текста /// public void SetMaxLength(int length) { maxLength = length; if (textInputModal != null) { textInputModal.SetCellCount(length); } } /// /// Устанавливает пользовательский алфавит /// public void SetCustomAlphabet(string[] alphabet) { customAlphabet = alphabet; if (textInputModal != null && alphabet != null && alphabet.Length > 0) { textInputModal.SetAlphabet(alphabet); } } } }