180 lines
4.7 KiB
C#
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;
|
||
|
|
}
|
||
|
|
}
|