using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace OTGIntegrated.Quests { public sealed class QuestLogUI : MonoBehaviour { public GameObject panelRoot; public Transform activeListRoot; public Transform completedListRoot; public Text titleText; public Text detailText; public Button closeButton; public Font uiFont; private QuestManager questManager; private QuestState selectedState; private readonly List spawnedButtons = new List(); public void Initialize(QuestManager manager) { questManager = manager; if (questManager != null) { questManager.OnQuestsChanged -= Refresh; questManager.OnQuestsChanged += Refresh; } if (closeButton != null) { closeButton.onClick.RemoveAllListeners(); closeButton.onClick.AddListener(() => FindObjectOfType()?.CloseCurrentWindow()); } Refresh(); } private void OnEnable() { Refresh(); } private void OnDestroy() { if (questManager != null) { questManager.OnQuestsChanged -= Refresh; } } public void Refresh() { ClearButtons(); if (titleText != null) { titleText.text = "Журнал квестов"; } if (questManager == null) { SetDetails(null); return; } if (selectedState == null && questManager.ActiveQuests.Count > 0) { selectedState = questManager.ActiveQuests[0]; } CreateButtons(activeListRoot, questManager.ActiveQuests); CreateButtons(completedListRoot, questManager.CompletedQuests); SetDetails(selectedState); } private void CreateButtons(Transform parent, IReadOnlyList states) { if (parent == null || states == null) { return; } for (int i = 0; i < states.Count; i++) { QuestState state = states[i]; if (state == null || state.questData == null) { continue; } GameObject root = new GameObject(state.questData.displayName, typeof(RectTransform), typeof(Image), typeof(Button)); root.transform.SetParent(parent, false); spawnedButtons.Add(root); root.GetComponent().sizeDelta = new Vector2(320f, 44f); Image image = root.GetComponent(); image.color = GetStatusColor(state.status); Text label = CreateText(root.transform, "Text", state.questData.displayName, 16, TextAnchor.MiddleLeft); label.rectTransform.anchorMin = Vector2.zero; label.rectTransform.anchorMax = Vector2.one; label.rectTransform.offsetMin = new Vector2(12f, 0f); label.rectTransform.offsetMax = new Vector2(-8f, 0f); Button button = root.GetComponent