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.
150 lines
4.6 KiB
150 lines
4.6 KiB
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) |
|
{ |
|
} |
|
} |
|
}
|
|
|