Files
taptap2024_GJ_chidouren/Packages/CC-Framework/com.foldcc.icecreamview/Runtime/IC_AbstractView.cs
2024-10-16 00:03:41 +08:00

192 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace IcecreamView
{
[DisallowMultipleComponent, System.Serializable]
public abstract class IC_AbstractView : MonoBehaviour
{
#if UNITY_EDITOR
public bool HasAutoCreate = true;
#endif
/// <summary>
/// ViewTable标识 不能修改
/// </summary>
[HideInInspector]
public string VIEWTABLE;
internal string _group;
internal int _configID;
internal int openCount;
internal int CurSortOrder;
[SerializeField ,Tooltip("是否可被聚焦")]
internal bool hasFocusView = true;
internal int _focusID;
internal bool CurFocusState;
internal Action onOpened;
internal Action onClosed;
/// <summary>
/// 用于判断页面是否开启
/// </summary>
[HideInInspector]
public bool isOpen = false;
[HideInInspector]
public bool isOnce = false;
[SerializeField] internal int DefaultStory;
public int PanelLayer => DefaultStory;
public bool HasFocusView => hasFocusView;
public string Group => this._group;
public RectTransform ViewRectTransform { get; protected set; }
/// <summary>
/// 对应View管理器
/// </summary>
[System.NonSerialized] protected IC_Controller viewManager;
internal void SetViewManager(IC_Controller viewManager)
{
if (this.viewManager == null)
{
this.viewManager = viewManager;
}
}
public void SendEvent(int code , params object[] value)
{
this.viewManager.EventManager.SendEvent(code , value);
}
/// <summary>
/// 页面被创建初始化时触发该方法
/// </summary>
internal virtual void OnInitView ()
{
this.ViewRectTransform = (RectTransform)this.transform;
}
/// <summary>
/// 页面打开时触发该方法
/// </summary>
internal virtual void OnOpenView(params IC_ViewData[] values) { }
/// <summary>
/// 页面被关闭前触发该方法
/// </summary>
internal virtual void OnCloseView() { }
/// <summary>
/// 强制关闭页面时触发该方法
/// </summary>
internal virtual void OnHardCloseView() { }
/// <summary>
/// 页面被彻底销毁时触发
/// </summary>
internal virtual void OnDestroyView() { }
internal virtual void OnFocus(bool isFocus) { }
/// <summary>
/// 关闭当前页面
/// </summary>
public void CloseView()
{
viewManager.CloseViewFromView(this);
}
/// <summary>
/// 用于截断页面关闭的钩子方法,默认返回true如果返回false转为手动模式需要自行close页面适用于各种骚操作请谨慎使用可能会引起未知错误
/// </summary>
/// <returns></returns>
internal virtual bool _closeHook()
{
return true;
}
/// <summary>
/// 直接关闭页面通常情况下请使用CloseView方法直接使用该方法可能导致不稳定出现位置问题
/// </summary>
internal void _directClose()
{
OnClosed ();
if (isOnce)
{
viewManager.DestroyViewAtHash(gameObject.GetHashCode());
}
else
{
gameObject.SetActive(false);
transform.SetAsFirstSibling();
}
this.viewManager.UpdateFocusView ();
this.viewManager.OnViewClosed?.Invoke(this);
}
/// <summary>
/// 打开指定页面
/// </summary>
/// <param name="ViewTable">页面table</param>
/// <param name="isCloseThis">是否同时关闭自己</param>
public IC_AbstractView OpenView(string ViewTable, bool isCloseThis = false, bool isSinge = true , params IC_ViewData[] values)
{
if (viewManager != null)
{
if (isCloseThis)
{
CloseView();
}
return viewManager.OpenView(ViewTable, isSinge, values);
}
return null;
}
public IC_AbstractView OpenView(string ViewTable, bool isCloseThis = false, params IC_ViewData[] values)
{
return OpenView(ViewTable , isCloseThis , true , values);
}
public IC_AbstractView OpenView(string ViewTable, params IC_ViewData[] values)
{
return OpenView(ViewTable , false , true , values);
}
private void OnDestroy()
{
this.OnDestroyView();
}
// ReSharper disable Unity.PerformanceAnalysis
protected void OnOpened ()
{
var opened = this.onOpened;
this.onOpened = null;
opened?.Invoke ();
}
protected void OnClosed ()
{
var closed = this.onClosed;
this.onClosed = null;
closed?.Invoke ();
}
}
}