Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/public/CLPanelBase.cs
2020-07-04 14:41:25 +08:00

511 lines
12 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.

/*
********************************************************************************
*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);
}
}
}
}