CTT/Unity/Assets/HotfixView/Model/FGUI/FUI.cs

252 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using ET;
using FairyGUI;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ET
{
public class FUIAwakeSystem: AwakeSystem<FUI, GObject>
{
public override void Awake(FUI self, GObject gObject)
{
self.GObject = gObject;
}
}
public class FUI: Entity
{
public GObject GObject;
public string Name
{
get
{
if (GObject == null)
{
return string.Empty;
}
return GObject.name;
}
set
{
if (GObject == null)
{
return;
}
GObject.name = value;
}
}
public bool Visible
{
get
{
if (GObject == null)
{
return false;
}
return GObject.visible;
}
set
{
if (GObject == null)
{
return;
}
GObject.visible = value;
}
}
public bool IsWindow
{
get
{
return GObject is GWindow;
}
}
public bool IsComponent
{
get
{
return GObject is GComponent;
}
}
public bool IsRoot
{
get
{
return GObject is GRoot;
}
}
public bool IsEmpty
{
get
{
return GObject == null;
}
}
private Dictionary<string, FUI> children = new Dictionary<string, FUI>();
public bool isFromFGUIPool = false;
public override void Dispose()
{
if (IsDisposed)
{
return;
}
base.Dispose();
// 从父亲中删除自己
GetParent<FUI>()?.RemoveNoDispose(Name);
// 删除所有的孩子
foreach (FUI ui in children.Values)
{
ui.Dispose();
}
children.Clear();
// 删除自己的UI
if (!IsRoot && !isFromFGUIPool)
{
GObject.Dispose();
}
GObject = null;
isFromFGUIPool = false;
}
public void Add(FUI ui, bool asChildGObject)
{
if (ui == null || ui.IsEmpty)
{
throw new Exception($"ui can not be empty");
}
if (string.IsNullOrWhiteSpace(ui.Name))
{
throw new Exception($"ui.Name can not be empty");
}
if (children.ContainsKey(ui.Name))
{
Log.Warning($"注意ui.Name({ui.Name}) already exist");
return;
}
children.Add(ui.Name, ui);
if (IsComponent && asChildGObject)
{
GObject.asCom.AddChild(ui.GObject);
}
ui.Parent = this;
}
public void MakeFullScreen()
{
GObject?.asCom?.MakeFullScreen();
}
public void Remove(string name)
{
if (IsDisposed)
{
return;
}
FUI ui;
if (children.TryGetValue(name, out ui))
{
children.Remove(name);
if (ui != null)
{
if (IsComponent)
{
GObject.asCom.RemoveChild(ui.GObject, false);
}
ui.Parent = Game.Scene;
ui.Dispose();
}
}
}
/// <summary>
/// 一般情况不要使用此方法如需使用需要自行管理返回值的FUI的释放。
/// </summary>
public FUI RemoveNoDispose(string name)
{
if (IsDisposed)
{
return null;
}
FUI ui;
if (children.TryGetValue(name, out ui))
{
children.Remove(name);
if (ui != null)
{
if (IsComponent)
{
GObject.asCom.RemoveChild(ui.GObject, false);
}
ui.Parent = Game.Scene;
}
}
return ui;
}
public FUI RemoveSelfNoDispose()
{
return GetParent<FUI>()?.RemoveNoDispose(this.Name);
}
public void RemoveChildren()
{
foreach (FUI child in children.Values.ToArray())
{
child.Dispose();
}
children.Clear();
}
public FUI Get(string name)
{
FUI child;
if (children.TryGetValue(name, out child))
{
return child;
}
return null;
}
public IEnumerable<FUI> GetAll()
{
return children.Values;
}
}
}