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