using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using SpaceEngineersBlueprintEditor.Installer.Profiles; using SpaceEngineersBlueprintEditor.Installer.Utilities; using SpaceEngineersBlueprintEditor.Installer.Views.Pages; using SpaceEngineersBlueprintEditor.Installer.Views.Windows; using System.IO; using System.Windows; using XFEExtension.NetCore.FileExtension; using XFEExtension.NetCore.StringExtension; using XFEExtension.NetCore.WebExtension; namespace SpaceEngineersBlueprintEditor.Installer.ViewModel.Pages; public partial class DownloadProgressPageViewModel(DownloadProgressPage viewPage) : ViewModelBase { [ObservableProperty] bool isBusy = false; [ObservableProperty] bool isPause = false; [ObservableProperty] bool isError = false; [ObservableProperty] bool pauseSwitchEnable = false; [ObservableProperty] double maxValue = 100; [ObservableProperty] double value = 0; [ObservableProperty] string pauseText = "暂停"; [ObservableProperty] string downloadText = "0/0"; private XFEDownloader? downloader; public DownloadProgressPage ViewPage { get; set; } = viewPage; public XFEDownloader? Downloader { get => downloader; set { PauseSwitchEnable = false; if (value is not null) { if (downloader is not null) downloader.BufferDownloaded -= Downloader_BufferDownloaded; value.BufferDownloaded += Downloader_BufferDownloaded; PauseSwitchEnable = true; } downloader = value; } } private async Task StartDownload() { try { if (Downloader is not null) await Downloader.Download(false); } catch (Exception ex) { MessageBox.Show($"下载出错:\n{ex.Message}"); PauseText = "继续"; IsError = true; ViewPage.progress.SetError(); } } private void Downloader_BufferDownloaded(XFEDownloader sender, FileDownloadedEventArgs e) { DownloadText = $"{e.DownloadedBufferSize.FileSize()}/{(e.TotalBufferSize is not null ? e.TotalBufferSize.Value.FileSize() : "未知")}"; Value = e.DownloadedBufferSize; if (e.TotalBufferSize is not null) MaxValue = e.TotalBufferSize.Value; ViewPage.Dispatcher.Invoke(ViewPage.progress.Update); if (e.Downloaded) { MainWindow.Current?.Dispatcher.Invoke(() => MainWindow.Current.contentFrame.Content = new InstallProgressPage()); } } [RelayCommand] void PauseSwitch() { if (Downloader is not null) { if (Downloader.IsPaused) { Downloader?.Continue(); IsPause = false; ViewPage.progress.SetPause(); PauseText = "暂停"; } else { Downloader?.Pause(); IsPause = true; ViewPage.progress.SetPause(); PauseText = "继续"; } } } [RelayCommand] async Task Retry() { if (!SystemProfile.DownloadUrl.IsNullOrEmpty()) { Downloader = new() { DownloadUrl = SystemProfile.DownloadUrl, SavePath = Path.Combine(SystemProfile.InstallPath, "InstallPackage.zip") }; } await StartDownload(); } }