using System.Collections.Generic; using UnityEngine; namespace FairyGUI.Utils { /// /// /// public class HtmlPageContext : IHtmlPageContext { Stack _imagePool; Stack _inputPool; Stack _buttonPool; Stack _selectPool; Stack _linkPool; public static HtmlPageContext inst = new HtmlPageContext(); static Transform _poolManager; public HtmlPageContext() { _imagePool = new Stack(); _inputPool = new Stack(); _buttonPool = new Stack(); _selectPool = new Stack(); _linkPool = new Stack(); 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) { } } }