AlicizaX/Client/Assets/Scripts/Hotfix/GameLogic/UI/RecyclerViewMixedItemRenderExample.cs
2026-03-27 20:56:06 +08:00

180 lines
4.7 KiB
C#

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<MixedExampleItemData> list)
{
list.RegisterItemRender<MixedExampleHeaderItemRender>(HeaderViewName);
list.RegisterItemRender<MixedExampleLeftMessageItemRender>(LeftMessageViewName);
list.RegisterItemRender<MixedExampleRightMessageItemRender>(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<MixedExampleHeaderData, MixedExampleHeaderViewHolder>
{
public MixedExampleHeaderItemRender(MixedExampleHeaderViewHolder holder) : base(holder)
{
}
protected override void Bind(MixedExampleHeaderData data, int index)
{
Holder.Title.text = data.Title;
}
}
public abstract class MixedExampleMessageItemRender<TData, THolder> : ItemRender<TData, THolder>
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<MixedExampleLeftMessageData, MixedExampleLeftMessageViewHolder>
{
public MixedExampleLeftMessageItemRender(MixedExampleLeftMessageViewHolder holder) : base(holder)
{
}
protected override string GetMessage(MixedExampleLeftMessageData data)
{
return data.Message;
}
}
public sealed class MixedExampleRightMessageItemRender : MixedExampleMessageItemRender<MixedExampleRightMessageData, MixedExampleRightMessageViewHolder>
{
public MixedExampleRightMessageItemRender(MixedExampleRightMessageViewHolder holder) : base(holder)
{
}
protected override string GetMessage(MixedExampleRightMessageData data)
{
return data.Message;
}
}