Danro/Assets/Scripts/UI/ButtonTextFocusColor.cs
Danil Iarosh 78d7679e2b
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat(prizes, ui): complete Mar 24-Apr 2 sprint ahead of schedule
- завершен спринт 24 марта - 2 апреля с опережением плана и закрытием задач раньше срока
- расширена и стабилизирована система призов:
  добавлены и доработаны QR-tier конфиги, новые типы и модели данных,
  сохранение `qrCodes` в `prizes.json`, fallback-логика и синхронизация
  через `PrizeSystemManager`, `PrizeDatabase` и `LevelPrizeConfig`
- переработан flow настройки QR-призов:
  добавлены `QRCodeSettingsModal` и связанный UI-код,
  разнесены короткий текст приза и полный текст сообщения,
  добавлены шаблоны форматирования, корректная подстановка текста
  в QR и в UI-модалках, а также сохранение конфигурации между запусками
- доработан flow суперприза и текстовых настроек:
  добавлены fallback-правила показа, корректная обработка пустых строк
  и строк из одних пробелов, обновлены binders и показ текста в меню
- реализована и обновлена отдельная настройка витрины:
  добавлена `PrizeStandSettingsModal`, обновлена навигация строк,
  логика выбора ячейки и порогов очков, циклический выбор ячеек,
  ускорение изменения значений и исправления для keyboard/gamepad UX
- доработана игровая модалка витрины `PrizeStandModal`:
  добавлен вывод очков игрока, форматируемый текст счета,
  улучшено отображение ячеек и связанная логика выбора приза
- исправлен подсчет очков и интеграция с prize flow:
  `ScoreSystem` переведен на событийное обновление текущего счета,
  добавлены `CurrentScore`, `CurrentScoreChanged` и корректный display score,
  витрина и связанные UI-элементы теперь получают актуальные очки,
  а не нулевые или несвоевременные preview-значения
- переработаны модальные окна и навигация UI:
  улучшены `Modal`, `ModalManager`, `UIRowPointer`, `RulesModal`,
  `QRCodeModal`, `PrizeStandModal`, `LevelPrizeSettingsModal` и др.,
  чтобы фокус, указатель и submit работали консистентно без мыши
- обновлен win/prize UI:
  доработаны `WinBannerController`, `GameEndUIController`,
  `MainMenu`, `QRCodeUIController`, `TopPanelTextController` и настройки UI,
  улучшены тексты баннеров, отображение призов и итогового счета
- обновлены сцены и ассеты под новый flow:
  `MainMenu`, `Level UI`, prefab'ы строк настроек и кнопок,
  глобальные префабы, шрифты TMP, иконки, recovery-данные и ресурсы UI
- добавлены вспомогательные UI-компоненты и служебные скрипты:
  `ButtonTextFocusColor`, `SelectableDescriptionTarget`, `QRTier`
  и другие изменения, поддерживающие новый конфигурируемый prize UI
2026-04-01 12:47:17 +03:00

64 lines
1.7 KiB
C#

using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
namespace RR.Common.UI
{
/// <summary>
/// Меняет цвет TMP-текста внутри кнопки при фокусе и наведении.
/// </summary>
public class ButtonTextFocusColor : MonoBehaviour, ISelectHandler, IDeselectHandler, IPointerEnterHandler, IPointerExitHandler
{
[SerializeField] private TextMeshProUGUI targetText;
[SerializeField] private Color normalColor = new(0f, 0.29411766f, 0.1882353f, 1f);
[SerializeField] private Color focusedColor = Color.white;
private bool _isPointerInside;
private bool _isSelected;
private void Awake()
{
ApplyCurrentState();
}
public void OnSelect(BaseEventData eventData)
{
_isSelected = true;
ApplyCurrentState();
}
public void OnDeselect(BaseEventData eventData)
{
_isSelected = false;
ApplyCurrentState();
}
public void OnPointerEnter(PointerEventData eventData)
{
_isPointerInside = true;
ApplyCurrentState();
}
public void OnPointerExit(PointerEventData eventData)
{
_isPointerInside = false;
ApplyCurrentState();
}
private void ApplyCurrentState()
{
if (targetText == null)
return;
targetText.color = (_isSelected || _isPointerInside) ? focusedColor : normalColor;
}
#if UNITY_EDITOR
private void Reset()
{
targetText = GetComponentInChildren<TextMeshProUGUI>(true);
}
#endif
}
}