You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.6 KiB
151 lines
4.6 KiB
3 years ago
|
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;
|
||
|
|
||
|
public static HtmlPageContext inst = new HtmlPageContext();
|
||
|
|
||
|
static Transform _poolManager;
|
||
|
|
||
|
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
|
||
|
ret = new HtmlButton();
|
||
|
}
|
||
|
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
|
||
|
ret = new HtmlSelect();
|
||
|
}
|
||
|
|
||
|
//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)
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
}
|