XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
UTF-8
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();
    }
}