si-m1-face-package/Samples/Face Detection Demo/Scripts/FaceDetectionDemoUserList.cs

127 lines
4.3 KiB
C#

using System;
using System.Collections.Generic;
using Aisu.SIM1.Face.Models;
using UnityEngine;
using UnityEngine.UI;
namespace Aisu.SIM1.Face.Samples.FaceDetectionDemo
{
/// <summary>
/// MVP 用户列表窗口。
/// </summary>
public sealed class FaceDetectionDemoUserList : MonoBehaviour
{
[SerializeField] private Transform m_content; // 列表容器。
[SerializeField] private Font m_font; // UI 字体。
private Action<int> m_deleteHandler; // 删除回调。
/// <summary>
/// 绑定 UI。
/// </summary>
public void Bind(Transform content, Font font, Action<int> deleteHandler)
{
m_content = content;
m_font = font;
m_deleteHandler = deleteHandler;
}
/// <summary>
/// 刷新用户列表。
/// </summary>
public void SetUsers(IList<FaceUserInfo> users)
{
Clear();
if (users == null || users.Count == 0)
{
AddText("暂无用户数据");
return;
}
for (var i = 0; i < users.Count; i++)
{
AddRow(users[i]);
}
}
/// <summary>
/// 清空列表。
/// </summary>
public void Clear()
{
if (m_content == null)
{
return;
}
for (var i = m_content.childCount - 1; i >= 0; i--)
{
Destroy(m_content.GetChild(i).gameObject);
}
}
private void AddRow(FaceUserInfo user)
{
var row = new GameObject("User_" + user.UserId, typeof(RectTransform), typeof(HorizontalLayoutGroup), typeof(Image));
row.transform.SetParent(m_content, false);
row.GetComponent<Image>().color = new Color(0.94f, 0.96f, 0.98f);
var layout = row.GetComponent<HorizontalLayoutGroup>();
layout.padding = new RectOffset(8, 8, 6, 6);
layout.spacing = 8;
layout.childControlWidth = true;
layout.childForceExpandWidth = false;
row.AddComponent<LayoutElement>().preferredHeight = 44;
AddText(row.transform, $"ID: {user.UserId} 姓名: {user.UserName} 管理员: {user.IsAdmin}", 1f);
AddButton(row.transform, "删除", () => m_deleteHandler?.Invoke(user.UserId));
}
private void AddText(string text)
{
AddText(m_content, text, 1f);
}
private Text AddText(Transform parent, string text, float flexibleWidth)
{
var go = new GameObject("Text", typeof(RectTransform), typeof(Text));
go.transform.SetParent(parent, false);
var label = go.GetComponent<Text>();
label.font = m_font;
label.fontSize = 22;
label.color = Color.black;
label.alignment = TextAnchor.MiddleLeft;
label.text = text;
go.AddComponent<LayoutElement>().flexibleWidth = flexibleWidth;
return label;
}
private void AddButton(Transform parent, string text, UnityEngine.Events.UnityAction action)
{
var go = new GameObject(text, typeof(RectTransform), typeof(Image), typeof(Button));
go.transform.SetParent(parent, false);
go.GetComponent<Image>().color = new Color(0.82f, 0.88f, 0.95f);
var button = go.GetComponent<Button>();
button.onClick.AddListener(action);
var layout = go.AddComponent<LayoutElement>();
layout.preferredWidth = 92;
layout.preferredHeight = 34;
var labelGo = new GameObject("Text", typeof(RectTransform), typeof(Text));
labelGo.transform.SetParent(go.transform, false);
var rect = labelGo.GetComponent<RectTransform>();
rect.anchorMin = Vector2.zero;
rect.anchorMax = Vector2.one;
rect.offsetMin = Vector2.zero;
rect.offsetMax = Vector2.zero;
var label = labelGo.GetComponent<Text>();
label.font = m_font;
label.fontSize = 20;
label.color = Color.black;
label.alignment = TextAnchor.MiddleCenter;
label.text = text;
}
}
}