Files
ZuneShell.dll/ZuneShell/ZuneUI/PageStack.cs
T

154 lines
4.8 KiB
C#
Raw Normal View History

2021-02-21 21:52:41 -06:00
// Decompiled with JetBrains decompiler
// Type: ZuneUI.PageStack
// Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264
// Assembly location: C:\Program Files\Zune\ZuneShell.dll
using Microsoft.Iris;
using System;
using System.Collections;
namespace ZuneUI
{
public class PageStack : ModelItem
{
private IPage _currentPage;
private ArrayList _pageStack;
private NavigationDirection _navDirection;
private uint _maxStackSize;
public PageStack()
: this(null)
2021-02-21 21:52:41 -06:00
{
}
public PageStack(IModelItemOwner owner)
: base(owner)
=> this._pageStack = new ArrayList();
protected override void OnDispose(bool disposing)
{
if (disposing)
{
if (this._currentPage != null)
{
this._currentPage.OnNavigatedAway(null);
2021-02-21 21:52:41 -06:00
this._currentPage.Release();
this._currentPage = null;
2021-02-21 21:52:41 -06:00
}
if (this._pageStack != null)
{
foreach (IPageState page in this._pageStack)
page.Release();
this._pageStack = null;
2021-02-21 21:52:41 -06:00
}
}
base.OnDispose(disposing);
}
public IPage CurrentPage => this._currentPage;
public bool CanNavigateBack => this._pageStack.Count > 0;
public uint MaximumStackSize
{
get => this._maxStackSize;
set
{
if ((int)this._maxStackSize == (int)value)
return;
this._maxStackSize = value;
this.FirePropertyChanged(nameof(MaximumStackSize));
this.TrimStackSize();
}
}
public NavigationDirection LastNavigationDirection => this._navDirection;
private void SetLastNavigationDirection(NavigationDirection value)
{
if (this._navDirection == value)
return;
this._navDirection = value;
this.FirePropertyChanged("LastNavigationDirection");
}
public void NavigateToPage(IPage page)
{
if (page == null)
throw new ArgumentNullException(nameof(page));
if (this._currentPage != null)
{
this._currentPage.OnNavigatedAway(page);
this.PushToStack(this._currentPage);
}
this.SetCurrentPage(page);
this.SetLastNavigationDirection(NavigationDirection.Forward);
this.TrimStackSize();
}
public void NavigateBack()
{
IPage page1 = null;
2021-02-21 21:52:41 -06:00
while (this.CanNavigateBack && page1 == null)
{
int index = this._pageStack.Count - 1;
IPageState page2 = (IPageState)this._pageStack[index];
this._pageStack.RemoveAt(index);
if (page2 != null)
page1 = page2.RestoreAndRelease();
if (page2 != null)
;
}
if (!this.CanNavigateBack)
this.FirePropertyChanged("CanNavigateBack");
if (page1 == null)
return;
this._currentPage.OnNavigatedAway(page1);
this._currentPage.Release();
this.SetCurrentPage(page1);
this.SetLastNavigationDirection(NavigationDirection.Back);
}
public void PushToStack(IPage page)
{
IPageState pageState = page != null ? page.SaveAndRelease() : throw new ArgumentNullException(nameof(page));
if (pageState == null)
return;
this._pageStack.Add(pageState);
2021-02-21 21:52:41 -06:00
if (this._pageStack.Count != 1)
return;
this.FirePropertyChanged("CanNavigateBack");
}
private void SetCurrentPage(IPage page)
{
this._currentPage = page;
this.FirePropertyChanged("CurrentPage");
this._currentPage.OnNavigatedTo();
}
private void TrimStackSize()
{
if (this._maxStackSize == 0U)
return;
int num = this._pageStack.Count - (int)this._maxStackSize;
if (num <= 0)
return;
int index = 0;
while (num > 0 && index < this._pageStack.Count)
{
IPageState page = (IPageState)this._pageStack[index];
if (page.CanBeTrimmed)
{
this._pageStack.RemoveAt(index);
page.Release();
--num;
}
else
++index;
}
}
}
}