Files
Echo/Assets/_Project/Scripts/UI/Tasks/TaskListItemView.cs
T
2026-07-08 20:42:51 +08:00

82 lines
2.3 KiB
C#

using System;
using Core.TaskSystem;
using Michsky.UI.Reach;
using UnityEngine;
using UnityEngine.Events;
namespace UI.Tasks
{
public class TaskListItemView : MonoBehaviour
{
[SerializeField] private ButtonManager button;
[Header("Status Presentation")]
[SerializeField] private Sprite todoIcon;
[SerializeField] private Sprite completedIcon;
[SerializeField] private Sprite expiredIcon;
[SerializeField] private string todoPrefix = "";
[SerializeField] private string completedPrefix = "";
[SerializeField] private string expiredPrefix = "";
TaskEntry task;
Action<TaskEntry> onClicked;
UnityAction clickAction;
void Awake()
{
if (button == null) { button = GetComponent<ButtonManager>(); }
}
public void Bind(TaskEntry task, Action<TaskEntry> onClicked)
{
this.task = task;
this.onClicked = onClicked;
if (button == null)
{
Debug.LogError($"{nameof(TaskListItemView)} on '{name}' is missing ButtonManager reference.");
return;
}
if (clickAction != null) { button.onClick.RemoveListener(clickAction); }
clickAction = HandleClick;
button.onClick.AddListener(clickAction);
ApplyPresentation(task);
}
void OnDestroy()
{
if (button != null && clickAction != null) { button.onClick.RemoveListener(clickAction); }
}
void HandleClick()
{
onClicked?.Invoke(task);
}
void ApplyPresentation(TaskEntry task)
{
if (task == null)
{
if (button != null) { button.SetText(string.Empty); }
return;
}
(Sprite icon, string prefix) = task.status switch
{
TaskStatus.Completed => (completedIcon, completedPrefix),
TaskStatus.Expired => (expiredIcon, expiredPrefix),
_ => (todoIcon, todoPrefix)
};
button.enableIcon = icon != null;
button.buttonIcon = icon;
string label = string.IsNullOrEmpty(prefix) ? task.ShortName : $"{prefix}{task.ShortName}";
button.SetText(label);
}
}
}