using System;
using XGame.Framework.Quality;
using XGame.Framework.Time;
namespace XGame.Framework.UI
{
///
/// 每个UIView一个UIContext实例
///
public sealed class UIContext : IContext, IUIViewAdapter, IDisposable
{
public IQualityModule Quality { get; private set; }
private ITimeModule _timeModule;
private ITimeProxy _timeProxy;
public ITimeProxy Time => _timeProxy ?? (_timeProxy = new TimeProxy(_timeModule));
public IUIModule UI { get; private set; }
///
/// 资源加载模块,需要时才创建
///
private IUIAssetModule _asset;
///
/// 资源加载模块
///
public IUIAssetModule Asset => _asset ?? (_asset = (UI as IUIAssetModuleCreator).Create(this));
public UIContext(IQualityModule qualityModule, ITimeModule timeModule, IUIModule uiModule)
{
Quality = qualityModule;
_timeModule = timeModule;
UI = uiModule;
}
public UIContext Clone()
{
return new UIContext(Quality, _timeModule, UI);
}
///
/// 关闭UI
///
///
public void ClosePanel(bool isDestroy = false)
{
UI.Close(_uikey, isDestroy);
}
///
/// 取消定时器、清理资源加载监听等
///
public void Clear()
{
_timeProxy?.CancelAll();
_asset?.StopAllAsyncs();
}
void IDisposable.Dispose()
{
Quality = null;
_timeModule = null;
UI = null;
_timeProxy?.CancelAll();
_timeProxy = null;
(_asset as IDisposable)?.Dispose();
_asset = null;
//_ctrlGroup = null;
_uikey = null;
}
///
/// Context对应的UIKey
/// 业务不要赋值
///
private UIKey _uikey;
public UIKey Key => _uikey;
UIKey IUIViewAdapter.Key { set => _uikey = value; }
//private IUIControllerGroup _ctrlGroup;
//IUIControllerGroup IUIViewAdapter.CtrlGroup { get => _ctrlGroup; set => _ctrlGroup = value; }
TNestedView IUIViewAdapter.CreateNested(IUINested nested, bool isStatic)
{
var nestedView = Activator.CreateInstance();
(nestedView as INestedInternal).Init(this, nested, isStatic);
return nestedView;
}
INestedView IUIViewAdapter.CreateNested(Type nestedViewType, IUINested nested, bool isStatic)
{
var nestedView = Activator.CreateInstance(nestedViewType) as INestedInternal;
if (nestedView == null)
{
Log.Error($"CreateNested 类型错误. Type:{nestedViewType} isStatic:{isStatic}");
}
else
{
nestedView.Init(this, nested, isStatic);
}
return nestedView;
}
}
public interface IUIContextSetter
{
UIContext Context { set; }
}
}