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

191 lines
7.2 KiB
C#

// Decompiled with JetBrains decompiler
// Type: ZuneUI.ZuneShell
// 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 Microsoft.Zune.Util;
using MicrosoftZuneLibrary;
using System;
using System.Collections;
using System.ComponentModel;
namespace ZuneUI
{
public class ZuneShell : ModelItem
{
public Category DeferredNavigateCategory;
public Node DeferredNavigateNode;
private static ZuneShell s_defaultInstance;
private PageStack _pageStack;
private Command _navigateBackCommand;
private ICommandHandler _commandHandler;
private Management _management;
private int _navigationsToPagePending;
private bool _navigationLocked;
private object thisLock = new object();
public ZuneShell()
{
this._pageStack = new PageStack(this);
this._pageStack.PropertyChanged += new PropertyChangedEventHandler(this.OnPageStackPropertyChanged);
this._navigateBackCommand = new Command(this, Shell.LoadString(StringId.IDS_NAVIGATE_BACK), new EventHandler(this.OnClickNavigateBack));
this._pageStack.MaximumStackSize = 1024U;
this._pageStack.NavigateToPage(new StartupPage());
DefaultInstance = this;
}
protected override void OnDispose(bool disposing)
{
if (disposing)
this.DisposeManagement();
base.OnDispose(disposing);
if (!disposing || DefaultInstance != this)
return;
DefaultInstance = null;
}
public Command NavigateBackCommand => this._navigateBackCommand;
private void OnPageStackPropertyChanged(object sender, PropertyChangedEventArgs args)
{
string propertyName = args.PropertyName;
if (!(propertyName == "CurrentPage") && !(propertyName == "CanNavigateBack") && (!(propertyName == "LastNavigationDirection") && !(propertyName == "MaximumStackSize")))
return;
this.FirePropertyChanged(propertyName);
if (!(propertyName == "CurrentPage") && !(propertyName == "CanNavigateBack"))
return;
this._navigateBackCommand.Available = this.CanNavigateBack && (this.CurrentPage.ShowBackArrow || this.CurrentPage.ShowComputerIcon != ComputerIconState.Hide || this.CurrentPage.ShowNowPlayingX);
}
private void OnClickNavigateBack(object sender, EventArgs args)
{
SQMLog.Log(SQMDataId.BackClicks, 1);
this.NavigateBack();
}
public int MaximumStackSize
{
get => (int)this._pageStack.MaximumStackSize;
set => this._pageStack.MaximumStackSize = value >= 0 ? (uint)value : throw new ArgumentOutOfRangeException(nameof(value));
}
public ZunePage CurrentPage => (ZunePage)this._pageStack.CurrentPage;
public bool CanNavigateBack => this._pageStack.CanNavigateBack;
public bool NavigationLocked
{
get => this._navigationLocked;
set
{
if (this._navigationLocked == value)
return;
this._navigationLocked = value;
this.FirePropertyChanged(nameof(NavigationLocked));
}
}
public bool BlockedByNavigationLock
{
get => true;
set => this.FirePropertyChanged(nameof(BlockedByNavigationLock));
}
public NavigationDirection LastNavigationDirection => this._pageStack.LastNavigationDirection;
public ICommandHandler CommandHandler
{
get => this._commandHandler;
set
{
if (this._commandHandler == value)
return;
this._commandHandler = value;
this.FirePropertyChanged(nameof(CommandHandler));
}
}
public static ZuneShell DefaultInstance
{
get => s_defaultInstance;
private set => s_defaultInstance = s_defaultInstance == null || value == null ? value : throw new InvalidOperationException("Should only have one static shell instance.");
}
public bool NavigationsPending => this._navigationsToPagePending > 0;
public void NavigateToPage(ZunePage page)
{
lock (this.thisLock)
++this._navigationsToPagePending;
Application.DeferredInvoke(new DeferredInvokeHandler(this.DeferredNavigateToPage), page);
}
private void DeferredNavigateToPage(object args)
{
ZunePage zunePage = (ZunePage)args;
if (this.CurrentPage == null || this.CurrentPage.CanNavigateForwardTo(zunePage))
this._pageStack.NavigateToPage(zunePage);
else
zunePage.Release();
lock (this.thisLock)
--this._navigationsToPagePending;
}
public void NavigateBack() => this.NavigateBack(false);
public void NavigateBack(bool bypassPage) => Application.DeferredInvoke(new DeferredInvokeHandler(this.DeferredNavigateBack), bypassPage);
private void DeferredNavigateBack(object args)
{
if (!(bool)args && this.CurrentPage != null && this.CurrentPage.HandleBack())
return;
this._pageStack.NavigateBack();
}
public void Execute(string command, IDictionary commandArguments)
{
if (this._commandHandler == null)
throw new InvalidOperationException("No CommandHandler has been registered. Unable to resolve shell command: " + command);
this._commandHandler.Execute(command, commandArguments);
}
public void LaunchHelp() => this.Execute(InternetConnection.Instance.IsConnected ? "Web\\" + CultureHelper.GetHelpUrl() : "Help\\" + Shell.LoadString(StringId.IDS_ZUNECLIENT_LOCALE) + "\\help.htm", null);
public Management Management
{
get
{
if (this._management == null && DefaultInstance != null)
this._management = new Management();
return this._management;
}
}
public void DisposeManagement()
{
if (this._management == null)
return;
this._management.Dispose();
this._management = null;
}
public static MediaType MapStringToMediaType(string typeName) => (MediaType)LibraryDataProvider.NameToMediaType(typeName);
public static MediaType MapIntToMediaType(int mediaType) => (MediaType)mediaType;
public static int MapMediaTypeToInt(MediaType mediaType) => (int)mediaType;
public static EMediaTypes MapMediaTypeToEMediaTypes(MediaType mediaType) => (EMediaTypes)mediaType;
public static MediaType GetMediaTypeFromMedia(object media)
{
EMediaTypes mediaType = EMediaTypes.eMediaTypeInvalid;
if (media is IDatabaseMedia)
((IDatabaseMedia)media).GetMediaIdAndType(out int _, out mediaType);
return (MediaType)mediaType;
}
}
}