You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
5.6 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;
public class EmojiMain : MonoBehaviour
{
GComponent _mainView;
GList _list;
GTextInput _input1;
GTextInput _input2;
GComponent _emojiSelectUI1;
GComponent _emojiSelectUI2;
class Message
{
public string sender;
public string senderIcon;
public string msg;
public bool fromMe;
}
List<Message> _messages;
Dictionary<uint, Emoji> _emojies;
void Awake()
{
UIPackage.AddPackage("UI/Emoji");
UIConfig.verticalScrollBar = "ui://Emoji/ScrollBar_VT";
UIConfig.defaultScrollBarDisplay = ScrollBarDisplayType.Auto;
}
void Start()
{
Application.targetFrameRate = 60;
Stage.inst.onKeyDown.Add(OnKeyDown);
_messages = new List<Message>();
_mainView = this.GetComponent<UIPanel>().ui;
_list = _mainView.GetChild("list").asList;
_list.SetVirtual();
_list.itemProvider = GetListItemResource;
_list.itemRenderer = RenderListItem;
_input1 = _mainView.GetChild("input1").asTextInput;
_input1.onKeyDown.Add(__inputKeyDown1);
_input2 = _mainView.GetChild("input2").asTextInput;
_input2.onKeyDown.Add(__inputKeyDown2);
//作为demo这里只添加了部分表情素材
_emojies = new Dictionary<uint, Emoji>();
for (uint i = 0x1f600; i < 0x1f637; i++)
{
string url = UIPackage.GetItemURL("Emoji", Convert.ToString(i, 16));
if (url != null)
_emojies.Add(i, new Emoji(url));
}
_input2.emojies = _emojies;
_mainView.GetChild("btnSend1").onClick.Add(__clickSendBtn1);
_mainView.GetChild("btnSend2").onClick.Add(__clickSendBtn2);
_mainView.GetChild("btnEmoji1").onClick.Add(__clickEmojiBtn1);
_mainView.GetChild("btnEmoji2").onClick.Add(__clickEmojiBtn2);
_emojiSelectUI1 = UIPackage.CreateObject("Emoji", "EmojiSelectUI").asCom;
_emojiSelectUI1.fairyBatching = true;
_emojiSelectUI1.GetChild("list").asList.onClickItem.Add(__clickEmoji1);
_emojiSelectUI2 = UIPackage.CreateObject("Emoji", "EmojiSelectUI_ios").asCom;
_emojiSelectUI2.fairyBatching = true;
_emojiSelectUI2.GetChild("list").asList.onClickItem.Add(__clickEmoji2);
}
void AddMsg(string sender, string senderIcon, string msg, bool fromMe)
{
bool isScrollBottom = _list.scrollPane.isBottomMost;
Message newMessage = new Message();
newMessage.sender = sender;
newMessage.senderIcon = senderIcon;
newMessage.msg = msg;
newMessage.fromMe = fromMe;
_messages.Add(newMessage);
if (newMessage.fromMe)
{
if (_messages.Count == 1 || UnityEngine.Random.Range(0f, 1f) < 0.5f)
{
Message replyMessage = new Message();
replyMessage.sender = "FairyGUI";
replyMessage.senderIcon = "r1";
replyMessage.msg = "Today is a good day. \U0001f600";
replyMessage.fromMe = false;
_messages.Add(replyMessage);
}
}
if (_messages.Count > 100)
_messages.RemoveRange(0, _messages.Count - 100);
_list.numItems = _messages.Count;
if (isScrollBottom)
_list.scrollPane.ScrollBottom();
}
string GetListItemResource(int index)
{
Message msg = _messages[index];
if (msg.fromMe)
return "ui://Emoji/chatRight";
else
return "ui://Emoji/chatLeft";
}
void RenderListItem(int index, GObject obj)
{
GButton item = (GButton)obj;
Message msg = _messages[index];
if (!msg.fromMe)
item.GetChild("name").text = msg.sender;
item.icon = UIPackage.GetItemURL("Emoji", msg.senderIcon);
//Recaculate the text width
GRichTextField tf = item.GetChild("msg").asRichTextField;
tf.emojies = _emojies;
tf.text = EmojiParser.inst.Parse(msg.msg);
}
void __clickSendBtn1(EventContext context)
{
string msg = _input1.text;
if (msg.Length == 0)
return;
AddMsg("Unity", "r0", msg, true);
_input1.text = "";
}
void __clickSendBtn2(EventContext context)
{
string msg = _input2.text;
if (msg.Length == 0)
return;
AddMsg("Unity", "r0", msg, true);
_input2.text = "";
}
void __clickEmojiBtn1(EventContext context)
{
GRoot.inst.ShowPopup(_emojiSelectUI1, (GObject)context.sender, PopupDirection.Up);
}
void __clickEmojiBtn2(EventContext context)
{
GRoot.inst.ShowPopup(_emojiSelectUI2, (GObject)context.sender, PopupDirection.Up);
}
void __clickEmoji1(EventContext context)
{
GButton item = (GButton)context.data;
_input1.ReplaceSelection("[:" + item.text + "]");
}
void __clickEmoji2(EventContext context)
{
GButton item = (GButton)context.data;
_input2.ReplaceSelection(Char.ConvertFromUtf32(Convert.ToInt32(UIPackage.GetItemByURL(item.icon).name, 16)));
}
void __inputKeyDown1(EventContext context)
{
if (context.inputEvent.keyCode == KeyCode.Return)
_mainView.GetChild("btnSend1").onClick.Call();
}
void __inputKeyDown2(EventContext context)
{
if (context.inputEvent.keyCode == KeyCode.Return)
_mainView.GetChild("btnSend2").onClick.Call();
}
void OnKeyDown(EventContext context)
{
if (context.inputEvent.keyCode == KeyCode.Escape)
{
Application.Quit();
}
}
}