using FairyGUI; using System; using System.Collections.Generic; using UnityEngine; using XGame.Framework.UI; namespace XGame.Framework.FGUI { /// /// FGUI相关的操作都在IUIViewModel的实现类里 /// public abstract class FguiViewModel : IUIViewModel, IUIVMInternal, IDisposable { protected GComponent Panel { get; private set; } public Vector3 Pos { get=> Panel.position; set => Panel.position = value; } public Vector2 Scale { get => Panel.scale; set => Panel.scale = value; } public ScrollPane Scroll =>Panel.scrollPane; public EventListener PanelEvent => Panel.onClick; private HashSet _nestedViews; void IUIVMInternal.Init(IUIPanel uiPanel, IUIViewAdapter adapter) { Init((uiPanel as FguiPanel).Panel, adapter); } void IUIVMInternal.Init(IUINested nested, IUIViewAdapter adapter) { Init((nested as FguiNested).Component, adapter); } void IUIVMInternal.EnableChildren(object intent) { if (_nestedViews == null) return; foreach(var nestedView in _nestedViews) { nestedView.EnableByParent(intent); } } void IUIVMInternal.DisableChildren() { if (_nestedViews == null) return; foreach (var nestedView in _nestedViews) { nestedView.DisableByParent(); } } private void Init(GComponent panel, IUIViewAdapter adapter) { Panel = panel; BindComponents(panel, adapter); CustomBind(panel, adapter); } protected abstract void BindComponents(GComponent panel, IUIViewAdapter adapter); /// /// 自定义绑定,有需要的重载 /// /// protected virtual void CustomBind(GComponent panel, IUIViewAdapter adapter) { } public void AddChild(INestedView nestedView) { if (nestedView is INestedInternal temp) { _nestedViews ??= new HashSet(); _nestedViews.Add(temp); } } public void RemoveChild(INestedView nestedView) { if (_nestedViews == null) return; if (nestedView is INestedInternal temp) { _nestedViews.Remove(temp); } } /// /// 结束ui的所有tween /// public void KillTweens(bool complete = false) { GTween.Kill(Panel, complete); } void IDisposable.Dispose() { if (_nestedViews != null) { foreach(var nestedView in _nestedViews) { (nestedView as IDisposable)?.Dispose(); } _nestedViews.Clear(); } } } }