Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/public/CLPanelBase.cs

511 lines
12 KiB
C#
Raw Normal View History

2020-07-04 14:41:25 +08:00
/*
********************************************************************************
*Copyright(C),coolae.net
*Author: chenbin
*Version: 2.0
*Date: 2017-01-09
*Description:
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace Coolape
{
public abstract class CLPanelBase : CLBaseLua
{
// [HideInInspector]
bool _isActive = false;
public bool isActive {
get {
return _isActive;
}
set {
_isActive = value;
}
}
UIPanel _panel = null;
public UIPanel panel {
get {
if (_panel == null) {
_panel = gameObject.GetComponent<UIPanel> ();
if (_panel == null) {
_panel = gameObject.AddComponent<UIPanel> ();
}
}
return _panel;
}
}
public bool isNeedBackplate = true;
//是否需要遮罩
public bool destroyWhenHide = false;
public bool isNeedResetAtlase = true;
[HideInInspector]
public bool isNeedMask4Init = false;
[HideInInspector]
public bool isNeedMask4InitOnlyOnce = true;
public bool isHideWithEffect = true;
public bool isRefeshContentWhenEffectFinish = false;
public Transform EffectRoot;
static int _destoryDelaySec = 5;
public static int destoryDelaySec {
get {
return _destoryDelaySec;
}
set {
_destoryDelaySec = value;
}
}
//特效root节点
public enum EffectType
{
synchronized,
//同步执行
ordered,
//顺序执行
}
public EffectType effectType = EffectType.ordered;
//特效类型
public List<UITweener> EffectList = new List<UITweener> ();
static public int SortByName (UITweener a, UITweener b)
{
return string.Compare (a.name, b.name);
}
bool isFinishStart = false;
public virtual void Start ()
{
if (isFinishStart)
return;
getSubPanelsDepth ();
UITweener[] tws = null;
if (EffectRoot != null) {
tws = EffectRoot.GetComponents<UITweener> ();
sortTweeners (tws);
for (int j = 0; j < tws.Length; j++) {
if (tws [j] != null) {
tws [j].ResetToBeginning ();
tws [j].enabled = false;
EffectList.Add (tws [j]);
}
}
for (int i = 0; i < EffectRoot.childCount; i++) {
tws = EffectRoot.GetChild (i).GetComponents<UITweener> ();
sortTweeners (tws);
for (int j = 0; j < tws.Length; j++) {
if (tws [j] != null) {
tws [j].ResetToBeginning ();
tws [j].enabled = false;
EffectList.Add (tws [j]);
}
}
}
EffectList.Sort (SortByName);
}
for (int i = EffectList.Count - 1; i >= 0; i--) {
if (EffectList [i] == null) {
EffectList.RemoveAt (i);
} else {
EffectList [i].ResetToBeginning ();
}
}
isFinishStart = true;
}
/// <summary>
/// 冒泡排序法1
/// </summary>
/// <param name="list"></param>
public void sortTweeners (UITweener[] list)
{
UITweener temp = null;
for (int i = 0; i < list.Length; i++) {
for (int j = i; j < list.Length; j++) {
if (list [i].exeOrder < list [j].exeOrder) {
temp = list [i];
list [i] = list [j];
list [j] = temp;
}
}
}
}
object finishShowingCallback = null;
public void showWithEffect (object finishShowingCallback = null)
{
this.finishShowingCallback = finishShowingCallback;
isMoveOut = false;
if (_mask4Hide != null)
{
NGUITools.SetActive(_mask4Hide, false);
}
if (!gameObject.activeInHierarchy || CLPanelManager.showingPanels [gameObject.name] == null) {
NGUITools.SetActive (gameObject, true);
// CLPanelManager.showingPanels [gameObject.name] = this;
CLPanelManager.onShowPanel (this);
}
if (!isRefeshContentWhenEffectFinish) {
callFinishShowingCallback ();
}
playEffect (true);
}
void callFinishShowingCallback ()
{
Utl.doCallback (finishShowingCallback, this);
}
/// <summary>
/// Plaies the effect.
/// 播放ui特效
/// </summary>
/// <param name='forward'>
/// Forward.
/// </param>
int EffectIndex = 0;
bool EffectForward = true;
void playEffect (bool forward)
{
if (!isFinishStart) {
Start ();
}
if (EffectList.Count <= 0) {
if (!forward) {
onFinishHideWithEffect ();
}
return;
}
if (forward) {
EffectIndex = 0;
} else {
EffectIndex = EffectList.Count - 1;
}
EffectForward = forward;
UITweener tw = null;
//说明有动画可以播放先用mask档一下
if (!forward)
{
NGUITools.SetActive(mask4Hide, true);
}
if (effectType == EffectType.synchronized) {
for (int i = 0; i < EffectList.Count; i++) {
tw = EffectList [i];
if (forward && !isHideWithEffect) {
tw.ResetToBeginning ();
}
if (!forward && i == EffectList.Count - 1) {
tw.callWhenFinished = "onFinishHideWithEffect";
tw.eventReceiver = gameObject;
} else {
tw.callWhenFinished = "";
}
tw.Play (forward);
}
} else {
tw = EffectList [EffectIndex];
if (forward && !isHideWithEffect) {
tw.ResetToBeginning ();
}
tw.eventReceiver = gameObject;
tw.callWhenFinished = "onFinishEffect";
tw.Play (forward);
}
}
void onFinishEffect (UITweener tweener)
{
tweener.callWhenFinished = "";
tweener.eventReceiver = gameObject;
if (EffectForward) {
EffectIndex++;
} else {
EffectIndex--;
}
if (EffectIndex < 0) {
if (!EffectForward) {
onFinishHideWithEffect ();
}
} else if (EffectIndex >= EffectList.Count) {
if (isRefeshContentWhenEffectFinish) {
callFinishShowingCallback ();
}
} else {
UITweener tw = EffectList [EffectIndex];
if (EffectForward && !isHideWithEffect) {
tw.ResetToBeginning ();
}
tw.eventReceiver = gameObject;
tw.callWhenFinished = "onFinishEffect";
tw.Play (EffectForward);
}
}
GameObject _mask4Hide = null;
public GameObject mask4Hide
{
get
{
if (_mask4Hide == null)
{
_mask4Hide = new GameObject("_____mask4Hide");
_mask4Hide.transform.parent = transform;
NGUITools.SetLayer(_mask4Hide, LayerMask.NameToLayer("UI"));
UIWidget w = _mask4Hide.AddComponent<UIWidget>();
w.depth = 180;
w.SetAnchor(CLUIInit.self.gameObject, -2, -2, 2, 2);
NGUITools.AddWidgetCollider(_mask4Hide);
_mask4Hide.SetActive(false);
}
return _mask4Hide;
}
}
bool isMoveOut = true;
public void hideWithEffect (bool moveOut = false)
{
isMoveOut = moveOut;
if (isMoveOut) {
Vector3 newPos = transform.localPosition;
newPos.z = -250;
transform.localPosition = newPos;
playEffect (false);
} else {
onFinishHideWithEffect ();
}
}
void onFinishHideWithEffect (UITweener tweener = null)
{
isActive = false;
CLPanelManager.onHidePanel (this);
finishMoveOut ();
}
public virtual void finishMoveOut ()
{
Vector3 newPos = transform.localPosition;
newPos.z = -200;
transform.localPosition = newPos;
NGUITools.SetActive (gameObject, false);
if(_mask4Hide != null) {
NGUITools.SetActive(mask4Hide, false);
}
}
void finishMoveIn (UITweener tween)
{
if (CLPanelManager.topPanel == this) {
callFinishShowingCallback ();
Vector3 newPos = transform.localPosition;
newPos.z = -200;
transform.localPosition = newPos;
if (effectType != EffectType.synchronized) {
playEffect (true);
}
}
}
void destroySelf ()
{
if (isActive) {
return;
}
if (!CLPanelManager.panelRetainLayer.Contains (this)) {
//虽然页面是关掉了但是如果还是在panelRetainLayer里则不能删除因为当关掉顶层页面时这个页面还是会被打开
CLPanelManager.destroyPanel (this, false);
}
}
public virtual void procNetwork (string fname, int succ, string msg, object pars)
{
}
public bool isFinishLoad {
set;
get;
}
public bool isFinishInit {
set;
get;
}
public virtual void init ()
{
getSubPanelsDepth ();
_isActive = false;
if (Application.isPlaying) {
isFinishInit = true;
}
// getSubPanelsDepth(); //此时页面还没有显示,通过 GetComponentsInChildren取不到
}
bool isFinishGetSubPanelsDepth = false;
Hashtable subPanelsDepth = new Hashtable ();
public void getSubPanelsDepth ()
{
if (isFinishGetSubPanelsDepth) {
return;
}
isFinishGetSubPanelsDepth = true;
UIPanel[] ps = gameObject.GetComponentsInChildren<UIPanel> ();
int count = ps.Length;
for (int i = 0; i < count; i++) {
if (ps [i] == panel)
continue;
subPanelsDepth [ps [i]] = ps [i].depth;
}
}
public void setSubPanelsDepth ()
{
foreach (DictionaryEntry cell in subPanelsDepth) {
((UIPanel)(cell.Key)).depth = ((int)(cell.Value)) + panel.depth;
}
}
public abstract void setData (object pars);
public virtual void show (object pars)
{
setData (pars);
show ();
}
public virtual void onTopPanelChange (CLPanelBase p)
{
//TODO:
}
public virtual void show ()
{
isActive = true;
if (!isFinishInit) {
init ();
}
showWithEffect ();
getSubPanelsDepth ();
refresh ();
setSubPanelsDepth ();
isFinishLoad = true;
}
public abstract void refresh ();
/// <summary>
/// Raises the press back event.
/// 当点击返回键
/// 当返回true时表明已经关闭了最顶层页面
/// 当返回false时表明不能关闭最顶层页面其时可能需要弹出退程序的确认
/// </summary>
public virtual bool hideSelfOnKeyBack ()
{
return false;
}
public virtual void hide ()
{
isFinishLoad = false;
hideWithEffect (isHideWithEffect);
}
public int depth {
get {
return panel.depth;
}
set {
panel.depth = value;
}
}
public override void OnDestroy ()
{
base.OnDestroy ();
isFinishInit = false;
}
public virtual void prepare (object callback, object orgs)
{
//sprites
UISprite[] sps = gameObject.GetComponentsInChildren<UISprite> ();
UISprite sp = null;
UISpriteData sd = null;
ArrayList list = new ArrayList ();
for (int i = 0; sps != null && i < sps.Length; i++) {
sp = sps [i];
if (sp.atlas == null || string.IsNullOrEmpty (sp.spriteName)) {
continue;
}
list.Add (sp.atlas);
list.Add (sp.spriteName);
}
prepareSprites4BorrowMode (list, 0, callback, orgs);
}
void onFinishPrepareOneSprite (params object[] paras)
{
NewList objList = paras [2] as NewList;
ArrayList list = objList [0] as ArrayList;
int i = (int)(objList [1]);
object callback = objList [2];
object orgs = objList [3];
prepareSprites4BorrowMode (list, i + 2, callback, orgs);
ObjPool.listPool.returnObject (objList);
}
public void prepareSprites4BorrowMode (ArrayList list, int i, object callback, object orgs)
{
if (list == null) {
return;
}
if (list.Count <= i + 1) {
Utl.doCallback (callback, orgs);
return;
}
NewList paraList = ObjPool.listPool.borrowObject ();
paraList.Add (list);
paraList.Add (i);
paraList.Add (callback);
paraList.Add (orgs);
prepareOneSprite4BorrowMode (list [i] as UIAtlas, list [i + 1] as string, (Callback)onFinishPrepareOneSprite, paraList);
}
public void prepareOneSprite4BorrowMode (UIAtlas atlas, string spriteName, object callback, object orgs)
{
UISpriteData sd = atlas.getSpriteBorrowMode (spriteName);
if (sd != null && MapEx.get (UIAtlas.assetBundleMap, sd.path) != null) {
Utl.doCallback (callback, null, spriteName, orgs);
} else {
atlas.borrowSpriteByname (spriteName, null, callback, orgs);
}
}
}
}