using System; using AlicizaX.UI; using TMPro; using UnityEngine; using UnityEngine.UI; public static class RecyclerViewMixedExample { public const string HeaderViewName = "MixedExampleHeader"; public const string LeftMessageViewName = "MixedExampleLeftMessage"; public const string RightMessageViewName = "MixedExampleRightMessage"; public static void Register(UGMixedList list) { list.RegisterItemRender(HeaderViewName); list.RegisterItemRender(LeftMessageViewName); list.RegisterItemRender(RightMessageViewName); } } public abstract class MixedExampleItemData : IMixedViewData { public string TemplateName { get; set; } } public sealed class MixedExampleHeaderData : MixedExampleItemData { public string Title; public MixedExampleHeaderData() { TemplateName = RecyclerViewMixedExample.HeaderViewName; } } public sealed class MixedExampleLeftMessageData : MixedExampleItemData { public string Message; public MixedExampleLeftMessageData() { TemplateName = RecyclerViewMixedExample.LeftMessageViewName; } } public sealed class MixedExampleRightMessageData : MixedExampleItemData { public string Message; public MixedExampleRightMessageData() { TemplateName = RecyclerViewMixedExample.RightMessageViewName; } } public sealed class MixedExampleHeaderViewHolder : InteractiveViewHolder { [SerializeField] private TextMeshProUGUI title; public TextMeshProUGUI Title => title; } public abstract class MixedExampleMessageViewHolder : InteractiveViewHolder { [SerializeField] private Image background; [SerializeField] private TextMeshProUGUI message; public TextMeshProUGUI Message => message; public Image Background => background; } public sealed class MixedExampleLeftMessageViewHolder : MixedExampleMessageViewHolder { } public sealed class MixedExampleRightMessageViewHolder : MixedExampleMessageViewHolder { } public sealed class MixedExampleHeaderItemRender : ItemRender { public MixedExampleHeaderItemRender(MixedExampleHeaderViewHolder holder) : base(holder) { } protected override void Bind(MixedExampleHeaderData data, int index) { Holder.Title.text = data.Title; } } public abstract class MixedExampleMessageItemRender : ItemRender where THolder : MixedExampleMessageViewHolder where TData : MixedExampleItemData { private static readonly Color NormalColor = Color.white; private static readonly Color HoverColor = new(0.9f, 0.9f, 0.9f, 1f); private static readonly Color SelectedColor = new(1f, 0.95f, 0.75f, 1f); private bool hovered; private bool selected; protected MixedExampleMessageItemRender(THolder holder) : base(holder) { } protected override void Bind(TData data, int index) { Holder.Message.text = GetMessage(data); ApplyBackgroundColor(); } protected override void OnSelectionChanged(bool isSelected) { selected = isSelected; ApplyBackgroundColor(); } protected override void OnClear() { hovered = false; selected = false; ApplyBackgroundColor(); } protected override void OnPointerEnter() { hovered = true; ApplyBackgroundColor(); } protected override void OnPointerExit() { hovered = false; ApplyBackgroundColor(); } protected abstract string GetMessage(TData data); private void ApplyBackgroundColor() { if (Holder.Background == null) { return; } if (selected) { Holder.Background.color = SelectedColor; return; } Holder.Background.color = hovered ? HoverColor : NormalColor; } } public sealed class MixedExampleLeftMessageItemRender : MixedExampleMessageItemRender { public MixedExampleLeftMessageItemRender(MixedExampleLeftMessageViewHolder holder) : base(holder) { } protected override string GetMessage(MixedExampleLeftMessageData data) { return data.Message; } } public sealed class MixedExampleRightMessageItemRender : MixedExampleMessageItemRender { public MixedExampleRightMessageItemRender(MixedExampleRightMessageViewHolder holder) : base(holder) { } protected override string GetMessage(MixedExampleRightMessageData data) { return data.Message; } }