180 lines
5.5 KiB
C#
180 lines
5.5 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace FairyGUI.Utils
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public class HtmlPageContext : IHtmlPageContext
|
|||
|
{
|
|||
|
Stack<IHtmlObject> _imagePool;
|
|||
|
Stack<IHtmlObject> _inputPool;
|
|||
|
Stack<IHtmlObject> _buttonPool;
|
|||
|
Stack<IHtmlObject> _selectPool;
|
|||
|
Stack<IHtmlObject> _linkPool;
|
|||
|
|
|||
|
static HtmlPageContext _inst;
|
|||
|
|
|||
|
public static HtmlPageContext inst
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_inst == null)
|
|||
|
_inst = new HtmlPageContext();
|
|||
|
return _inst;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
static Transform _poolManager;
|
|||
|
|
|||
|
#if UNITY_2019_3_OR_NEWER
|
|||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
|||
|
static void InitializeOnLoad()
|
|||
|
{
|
|||
|
_inst = null;
|
|||
|
_poolManager = null;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
public HtmlPageContext()
|
|||
|
{
|
|||
|
_imagePool = new Stack<IHtmlObject>();
|
|||
|
_inputPool = new Stack<IHtmlObject>();
|
|||
|
_buttonPool = new Stack<IHtmlObject>();
|
|||
|
_selectPool = new Stack<IHtmlObject>();
|
|||
|
_linkPool = new Stack<IHtmlObject>();
|
|||
|
|
|||
|
if (Application.isPlaying && _poolManager == null)
|
|||
|
_poolManager = Stage.inst.CreatePoolManager("HtmlObjectPool");
|
|||
|
}
|
|||
|
|
|||
|
virtual public IHtmlObject CreateObject(RichTextField owner, HtmlElement element)
|
|||
|
{
|
|||
|
IHtmlObject ret = null;
|
|||
|
bool fromPool = false;
|
|||
|
if (element.type == HtmlElementType.Image)
|
|||
|
{
|
|||
|
if (_imagePool.Count > 0 && _poolManager != null)
|
|||
|
{
|
|||
|
ret = _imagePool.Pop();
|
|||
|
fromPool = true;
|
|||
|
}
|
|||
|
else
|
|||
|
ret = new HtmlImage();
|
|||
|
}
|
|||
|
else if (element.type == HtmlElementType.Link)
|
|||
|
{
|
|||
|
if (_linkPool.Count > 0 && _poolManager != null)
|
|||
|
{
|
|||
|
ret = _linkPool.Pop();
|
|||
|
fromPool = true;
|
|||
|
}
|
|||
|
else
|
|||
|
ret = new HtmlLink();
|
|||
|
}
|
|||
|
else if (element.type == HtmlElementType.Input)
|
|||
|
{
|
|||
|
string type = element.GetString("type");
|
|||
|
if (type != null)
|
|||
|
type = type.ToLower();
|
|||
|
if (type == "button" || type == "submit")
|
|||
|
{
|
|||
|
if (_buttonPool.Count > 0 && _poolManager != null)
|
|||
|
{
|
|||
|
ret = _buttonPool.Pop();
|
|||
|
fromPool = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (HtmlButton.resource != null)
|
|||
|
ret = new HtmlButton();
|
|||
|
else
|
|||
|
Debug.LogWarning("FairyGUI: Set HtmlButton.resource first");
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_inputPool.Count > 0 && _poolManager != null)
|
|||
|
{
|
|||
|
ret = _inputPool.Pop();
|
|||
|
fromPool = true;
|
|||
|
}
|
|||
|
else
|
|||
|
ret = new HtmlInput();
|
|||
|
}
|
|||
|
}
|
|||
|
else if (element.type == HtmlElementType.Select)
|
|||
|
{
|
|||
|
if (_selectPool.Count > 0 && _poolManager != null)
|
|||
|
{
|
|||
|
ret = _selectPool.Pop();
|
|||
|
fromPool = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (HtmlSelect.resource != null)
|
|||
|
ret = new HtmlSelect();
|
|||
|
else
|
|||
|
Debug.LogWarning("FairyGUI: Set HtmlSelect.resource first");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//Debug.Log("from=" + fromPool);
|
|||
|
if (ret != null)
|
|||
|
{
|
|||
|
//可能已经被GameObject tree deleted了,不再使用
|
|||
|
if (fromPool && ret.displayObject != null && ret.displayObject.isDisposed)
|
|||
|
{
|
|||
|
ret.Dispose();
|
|||
|
return CreateObject(owner, element);
|
|||
|
|
|||
|
}
|
|||
|
ret.Create(owner, element);
|
|||
|
if (ret.displayObject != null)
|
|||
|
ret.displayObject.home = owner.cachedTransform;
|
|||
|
}
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
virtual public void FreeObject(IHtmlObject obj)
|
|||
|
{
|
|||
|
if (_poolManager == null)
|
|||
|
{
|
|||
|
obj.Dispose();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//可能已经被GameObject tree deleted了,不再回收
|
|||
|
if (obj.displayObject != null && obj.displayObject.isDisposed)
|
|||
|
{
|
|||
|
obj.Dispose();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
obj.Release();
|
|||
|
if (obj is HtmlImage)
|
|||
|
_imagePool.Push(obj);
|
|||
|
else if (obj is HtmlInput)
|
|||
|
_inputPool.Push(obj);
|
|||
|
else if (obj is HtmlButton)
|
|||
|
_buttonPool.Push(obj);
|
|||
|
else if (obj is HtmlLink)
|
|||
|
_linkPool.Push(obj);
|
|||
|
|
|||
|
if (obj.displayObject != null)
|
|||
|
obj.displayObject.cachedTransform.SetParent(_poolManager, false);
|
|||
|
}
|
|||
|
|
|||
|
virtual public NTexture GetImageTexture(HtmlImage image)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
virtual public void FreeImageTexture(HtmlImage image, NTexture texture)
|
|||
|
{
|
|||
|
}
|
|||
|
}
|
|||
|
}
|