Newer
Older
Qwilight / Igniter / ViewModels / MainViewModel.cs
@Taehui Taehui on 14 Nov 6 KB 2023-11-15 오전 12:14
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Messaging;
using Ionic.Zip;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows;

namespace Igniter.ViewModel
{
    public sealed partial class MainViewModel : ObservableObject
    {
        double _value;
        string _text;
        bool _isVisible = true;

        public double Value
        {
            get => _value;

            set => SetProperty(ref _value, value, nameof(Value));
        }

        public string Text
        {
            get => _text;

            set => SetProperty(ref _text, value, nameof(Text));
        }

        public bool IsVisible
        {
            get => _isVisible;

            set => SetProperty(ref _isVisible, value, nameof(IsVisible));
        }

        public void OnLoaded()
        {
            WeakReferenceMessenger.Default.Send(new ICC
            {
                IDValue = ICC.ID.ViewAllowWindow,
                Contents = new object[]
                {
                    LanguageSystem.Instance.Levy,
                    MessageBoxButton.OKCancel,
                    MessageBoxImage.Information,
                    new Action<MessageBoxResult>(async r =>
                    {
                        switch (r)
                        {
                            case MessageBoxResult.OK:
                                while (true)
                                {
                                    try
                                    {
                                        using (var zipFile = ZipFile.Read(Environment.GetCommandLineArgs()[1]))
                                        {
                                            zipFile.ExtractProgress += (sender, e) =>
                                            {
                                                if (e.EntriesTotal > 0)
                                                {
                                                    Value = 100.0 * e.EntriesExtracted / e.EntriesTotal;
                                                }
                                                var fileName = e.CurrentEntry?.FileName;
                                                if (!string.IsNullOrEmpty(fileName))
                                                {
                                                    Text = fileName;
                                                }
                                            };
                                            await Task.Run(() => zipFile.ExtractAll(Path.GetDirectoryName(IgniterComponent.QwilightFilePath), ExtractExistingFileAction.OverwriteSilently));
                                        }

                                        OnIgnited();
                                    }
                                    catch (Exception e)
                                    {
                                        OnIgnitingFault(e);
                                        if (IsVisible)
                                        {
                                            continue;
                                        }
                                    }
                                }
                            case MessageBoxResult.Cancel:
                                Environment.Exit(1);
                                break;
                        }
                    })
                }
            });

            void OnIgnited()
            {
                IsVisible = false;
                WeakReferenceMessenger.Default.Send(new ICC
                {
                    IDValue = ICC.ID.ViewAllowWindow,
                    Contents = new object[]
                    {
                        LanguageSystem.Instance.Ignited,
                        MessageBoxButton.OK,
                        MessageBoxImage.Information
                    }
                });
                WeakReferenceMessenger.Default.Send(new ICC
                {
                    IDValue = ICC.ID.ViewAllowWindow,
                    Contents = new object[]
                    {
                        LanguageSystem.Instance.ExeQwilight,
                        MessageBoxButton.YesNo,
                        MessageBoxImage.Question,
                        new Action<MessageBoxResult>(r =>
                        {
                            switch (r)
                            {
                                case MessageBoxResult.Yes:
                                    Process.Start(IgniterComponent.QwilightFilePath);
                                    break;
                            }

                            Environment.Exit(0);
                        })
                    }
                });
            }

            void OnIgnitingFault(Exception e)
            {
                IsVisible = false;
                WeakReferenceMessenger.Default.Send(new ICC
                {
                    IDValue = ICC.ID.ViewAllowWindow,
                    Contents = new object[]
                    {
                        e.Message,
                        MessageBoxButton.OK,
                        MessageBoxImage.Error
                    }
                });
                WeakReferenceMessenger.Default.Send(new ICC
                {
                    IDValue = ICC.ID.ViewAllowWindow,
                    Contents = new object[]
                    {
                        LanguageSystem.Instance.IgnitingFault,
                        MessageBoxButton.YesNo,
                        MessageBoxImage.Warning,
                        new Action<MessageBoxResult>(r =>
                        {
                            switch (r)
                            {
                                case MessageBoxResult.Yes:
                                    IsVisible = true;
                                    break;
                                case MessageBoxResult.No:
                                    Environment.Exit(1);
                                    break;
                            }
                        })
                    }
                });
            }
        }
    }
}