using DownKyi.Core.Settings;
using DownKyi.Services.Download;
using DownKyi.Utils;
using DownKyi.ViewModels;
using DownKyi.ViewModels.Dialogs;
using DownKyi.ViewModels.DownloadManager;
using DownKyi.ViewModels.Settings;
using DownKyi.ViewModels.Toolbox;
using DownKyi.ViewModels.UserSpace;
using DownKyi.Views;
using DownKyi.Views.Dialogs;
using DownKyi.Views.DownloadManager;
using DownKyi.Views.Settings;
using DownKyi.Views.Toolbox;
using DownKyi.Views.UserSpace;
using Prism.Ioc;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace DownKyi
{
///
/// Interaction logic for App.xaml
///
public partial class App
{
public static Dictionary Dictionary = new Dictionary();
public static ObservableCollection DownloadingList { get; set; }
public static ObservableCollection DownloadedList { get; set; }
// 下载服务
private IDownloadService downloadService;
protected override Window CreateShell()
{
// 设置主题
DictionaryResource.LoadTheme("ThemeDefault");
//DictionaryResource.LoadTheme("ThemeDiy");
// 切换语言
DictionaryResource.LoadLanguage("Default");
//DictionaryResource.LoadLanguage("en_US");
// 初始化数据
DownloadingList = new ObservableCollection();
DownloadedList = new ObservableCollection();
// 下载数据存储服务
DownloadStorageService downloadStorageService = new DownloadStorageService();
// 从数据库读取
List downloadingItems = downloadStorageService.GetDownloading();
List downloadedItems = downloadStorageService.GetDownloaded();
DownloadingList.AddRange(downloadingItems);
DownloadedList.AddRange(downloadedItems);
// 下载列表发生变化时执行的任务
DownloadingList.CollectionChanged += new NotifyCollectionChangedEventHandler(async (object sender, NotifyCollectionChangedEventArgs e) =>
{
await Task.Run(() =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (object item in e.NewItems)
{
if (item is DownloadingItem downloading)
{
//Console.WriteLine("DownloadingList添加");
downloadStorageService.AddDownloading(downloading);
}
}
}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (object item in e.OldItems)
{
if (item is DownloadingItem downloading)
{
//Console.WriteLine("DownloadingList移除");
downloadStorageService.RemoveDownloading(downloading);
}
}
}
});
});
// 下载完成列表发生变化时执行的任务
DownloadedList.CollectionChanged += new NotifyCollectionChangedEventHandler(async (object sender, NotifyCollectionChangedEventArgs e) =>
{
await Task.Run(() =>
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (object item in e.NewItems)
{
if (item is DownloadedItem downloaded)
{
//Console.WriteLine("DownloadedList添加");
downloadStorageService.AddDownloaded(downloaded);
}
}
}
if (e.Action == NotifyCollectionChangedAction.Remove)
{
foreach (object item in e.OldItems)
{
if (item is DownloadedItem downloaded)
{
//Console.WriteLine("DownloadedList移除");
downloadStorageService.RemoveDownloaded(downloaded);
}
}
}
});
});
// 启动下载服务
downloadService = new AriaDownloadService(DownloadingList, DownloadedList);
downloadService.Start();
return Container.Resolve();
}
protected override void OnStartup(StartupEventArgs e)
{
Thread thread = new Thread(() =>
{
SplashWindow sw = new SplashWindow();
// 储存
Dictionary["SplashWindow"] = sw;
// 不能用Show
sw.ShowDialog();
});
// 设置单线程
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
base.OnStartup(e);
}
protected override void OnExit(ExitEventArgs e)
{
// 关闭下载服务
downloadService.End();
base.OnExit(e);
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// pages
containerRegistry.RegisterForNavigation(ViewIndexViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewLoginViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewVideoDetailViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewSettingsViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewToolboxViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewDownloadManagerViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewPublicFavoritesViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewUserSpaceViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewPublicationViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewModels.ViewChannelViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewMySpaceViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewMyFavoritesViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewMyBangumiFollowViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewMyToViewVideoViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewMyHistoryViewModel.Tag);
// downloadManager pages
containerRegistry.RegisterForNavigation(ViewDownloadingViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewDownloadFinishedViewModel.Tag);
// settings pages
containerRegistry.RegisterForNavigation(ViewBasicViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewNetworkViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewVideoViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewDanmakuViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewAboutViewModel.Tag);
// tools pages
containerRegistry.RegisterForNavigation(ViewBiliHelperViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewDelogoViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewExtractMediaViewModel.Tag);
// UserSpace
containerRegistry.RegisterForNavigation(ViewArchiveViewModel.Tag);
containerRegistry.RegisterForNavigation(ViewModels.UserSpace.ViewChannelViewModel.Tag);
// dialogs
containerRegistry.RegisterDialog(ViewAlertDialogViewModel.Tag);
containerRegistry.RegisterDialog(ViewDownloadSetterViewModel.Tag);
containerRegistry.RegisterDialog(ViewParsingSelectorViewModel.Tag);
}
///
/// 异步修改绑定到UI的属性
///
///
public static void PropertyChangeAsync(Action callback)
{
if (Current == null) { return; }
Current.Dispatcher.Invoke(callback);
}
///
/// 下载完成列表排序
///
///
public static void SortDownloadedList(DownloadFinishedSort finishedSort)
{
List list = DownloadedList.ToList();
switch (finishedSort)
{
case DownloadFinishedSort.DOWNLOAD:
// 按下载先后排序
list.Sort((x, y) => { return x.Downloaded.FinishedTimestamp.CompareTo(y.Downloaded.FinishedTimestamp); });
break;
case DownloadFinishedSort.NUMBER:
// 按序号排序
list.Sort((x, y) =>
{
int compare = x.MainTitle.CompareTo(y.MainTitle);
return compare == 0 ? x.Order.CompareTo(y.Order) : compare;
});
break;
default:
break;
}
// 更新下载完成列表
// 如果有更好的方法再重写
DownloadedList.Clear();
foreach (DownloadedItem item in list)
{
DownloadedList.Add(item);
}
}
}
}