Ejemplo n.º 1
0
    /// <summary>
    /// 更新导航信息
    /// </summary>
    /// <param name="panelBase"></param>
    private void UpdateNavigationInfo(PanelID pid, bool ignoreCache)
    {
        LocalPanelInfo localPanelInfo = null;

        if (TryGetLocalPanelInfo(pid, out localPanelInfo))
        {
            if (localPanelInfo.IsStartPanel)
            {
                ClearCacheStack();
            }

            if ((localPanelInfo.HidePanelMask == 0 &&
                 localPanelInfo.CacheLv == PanelCacheLv.None))
            {
                return;
            }

            HideCondition condition = (info) =>
            {
                if (info != null && (localPanelInfo.IsMatchHideType(info.PType) ||
                                     localPanelInfo.CanCachePanel(info.PID)))
                {
                    return(true);
                }
                return(false);
            };


            List <UIPanelBase.PanelData> cachePanels = new List <UIPanelBase.PanelData>();
            if (showPanels.Count > 0 && condition != null)
            {
                List <PanelID> lstHide = new List <PanelID>();

                UIPanelBase.PanelData       panelBackspaceData = null;
                UIPanelBase.PanelReturnData lastReturnData     = (null != panelCacheStack && panelCacheStack.Count != 0) ? panelCacheStack.Peek() : null;
                bool           canCache  = (null == lastReturnData || lastReturnData.PID != pid);
                PanelID        tempPID   = PanelID.None;
                UIPanelBase    tempPBase = null;
                LocalPanelInfo tempInfo  = null;

                for (int i = 0, max = showPanels.Count; i < max; i++)
                {
                    tempPID   = (PanelID)showPanels[i];
                    tempPBase = GetPanel(tempPID);
                    if (null == tempPBase)
                    {
                        continue;
                    }
                    if (TryGetLocalPanelInfo(tempPID, out tempInfo) && condition(tempInfo))
                    {
                        lstHide.Add(tempPID);
                        if (!ignoreCache && canCache && localPanelInfo.CanCachePanel(tempPID))
                        {
                            panelBackspaceData = tempPBase.GetPanelData();
                            if (null == panelBackspaceData.JumpData)
                            {
                                panelBackspaceData.JumpData = new UIPanelBase.PanelJumpData();
                            }
                            panelBackspaceData.JumpData.IsBackspacing = true;
                            cachePanels.Add(panelBackspaceData);
                        }
                    }
                }

                if (cachePanels.Count > 0)
                {
                    cachePanels.Sort((left, right) =>
                    {
                        UIPanelBase pleft  = GetPanel(left.PID);
                        UIPanelBase pright = GetPanel(right.PID);
                        return(pleft.Depth - pright.Depth);
                    });

                    panelCacheStack.Push(new UIPanelBase.PanelReturnData()
                    {
                        PID            = pid,
                        CachePanelList = cachePanels,
                    });
                }

                for (int i = 0; i < lstHide.Count; i++)
                {
                    HidePanel(lstHide[i], false);
                }
            }
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    ///  面板返回
    /// </summary>
    /// <param name="pid"></param>
    public void OnPanelCacheBack(PanelID pid = PanelID.None)
    {
        if (pid != PanelID.None && pid != CurShowCachePanel)
        {
            if (IsShowPanel(CurShowCachePanel))
            {
                HidePanel(CurShowCachePanel, false, null);
            }

            ShowMain();

            UIFrameManager.Instance.CheckCloseRightBtn();
            Engine.Utility.Log.Error("OnPanelCacheBack return {0},{1}", pid, CurShowCachePanel);
            return;
        }

        if (CurShowCachePanel != PanelID.None)
        {
            //内部跳转直接成功直接return
            UIPanelBase panelBase = GetPanel(CurShowCachePanel);
            if (null != panelBase && panelBase.ExecuteReturnLogic())
            {
                return;
            }
        }
        if (IsShowPanel(PanelID.TopBarPanel))
        {
            HidePanel(PanelID.TopBarPanel, false);
        }
        if (IsShowPanel(PanelID.CommonBgPanel))
        {
            HidePanel(PanelID.CommonBgPanel, false);
        }

        if (panelCacheStack.Count == 0)
        {
            if (IsShowPanel(CurShowCachePanel))
            {
                HidePanel(CurShowCachePanel, false, null);
            }

            ShowMain();

            UIFrameManager.Instance.CheckCloseRightBtn();

            return;
        }
        bool success = false;


        UIPanelBase.PanelReturnData panelReturnData = panelCacheStack.Peek();
        if (null != panelReturnData)
        {
            if (panelReturnData.PID == CurShowCachePanel)
            {
                panelCacheStack.Pop();
                success = true;
                Action returenAction = () =>
                {
                    CurShowCachePanel = PanelID.None;
                    if (null != panelReturnData.CachePanelList && panelReturnData.CachePanelList.Count > 0)
                    {
                        UIPanelBase.PanelData pd = null;
                        for (int i = 0; i < panelReturnData.CachePanelList.Count; i++)
                        {
                            pd = panelReturnData.CachePanelList[i];
                            if (null == pd)
                            {
                                continue;
                            }

                            ShowPanel(pd.PID, pd.PrePanelData, true, data: pd.Data, jumpData: pd.JumpData);
                        }
                    }
                };
                if (IsShowPanel(CurShowCachePanel))
                {
                    HidePanel(CurShowCachePanel, false, returenAction);
                }
                else
                {
                    returenAction.Invoke();
                }
            }
            else
            {
                Engine.Utility.Log.Error("PanelCacheBackError {0},{1}", panelReturnData.PID, CurShowCachePanel);
            }
        }

        if (!success)
        {
            ShowMain();
        }

        UIFrameManager.Instance.CheckCloseRightBtn();
    }