82 lines
2.3 KiB
C#
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|