Example #1
0
        public MainWindowVM(MainWindow mainWindow, MainSettings settings)
        {
            MainWindow               = mainWindow;
            ViewDispatcher           = MainWindow.Dispatcher;
            Settings                 = settings;
            Installer                = new Lazy <InstallerVM>(() => new InstallerVM(this));
            Compiler                 = new Lazy <CompilerVM>(() => new CompilerVM(this));
            Gallery                  = new Lazy <ModListGalleryVM>(() => new ModListGalleryVM(this));
            ModeSelectionVM          = new ModeSelectionVM(this);
            UserInterventionHandlers = new UserInterventionHandlers(this);

            // Set up logging
            Utils.LogMessages
            .ObserveOn(RxApp.TaskpoolScheduler)
            .ToObservableChangeSet()
            .Buffer(TimeSpan.FromMilliseconds(250), RxApp.TaskpoolScheduler)
            .Where(l => l.Count > 0)
            .ObserveOn(RxApp.MainThreadScheduler)
            .FlattenBufferResult()
            .Bind(Log)
            .Subscribe()
            .DisposeWith(CompositeDisposable);

            Utils.LogMessages
            .OfType <IUserIntervention>()
            .ObserveOnGuiThread()
            .SelectTask(msg => UserInterventionHandlers.Handle(msg))
            .Subscribe()
            .DisposeWith(CompositeDisposable);

            if (IsStartingFromModlist(out var path))
            {
                Installer.Value.ModListLocation.TargetPath = path;
                ActivePane = Installer.Value;
            }
            else
            {
                // Start on mode selection
                ActivePane = ModeSelectionVM;
            }

            try
            {
                System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
                FileVersionInfo            fvi      = FileVersionInfo.GetVersionInfo(assembly.Location);
                VersionDisplay = $"v{fvi.FileVersion}";
            }
            catch (Exception ex)
            {
                Utils.Error(ex);
                VersionDisplay = "ERROR";
            }
            CopyVersionCommand = ReactiveCommand.Create(() =>
            {
                Clipboard.SetText($"Wabbajack {VersionDisplay}\n{ThisAssembly.Git.Sha}");
            });
        }
Example #2
0
        public MainWindowVM(MainWindow mainWindow, MainSettings settings)
        {
            ConverterRegistration.Register();
            MainWindow               = mainWindow;
            Settings                 = settings;
            Installer                = new Lazy <InstallerVM>(() => new InstallerVM(this));
            Compiler                 = new Lazy <CompilerVM>(() => new CompilerVM(this));
            SettingsPane             = new Lazy <SettingsVM>(() => new SettingsVM(this));
            Gallery                  = new Lazy <ModListGalleryVM>(() => new ModListGalleryVM(this));
            ModeSelectionVM          = new ModeSelectionVM(this);
            UserInterventionHandlers = new UserInterventionHandlers(this);

            // Set up logging
            Utils.LogMessages
            .ObserveOn(RxApp.TaskpoolScheduler)
            .ToObservableChangeSet()
            .Buffer(TimeSpan.FromMilliseconds(250), RxApp.TaskpoolScheduler)
            .Where(l => l.Count > 0)
            .FlattenBufferResult()
            .ObserveOnGuiThread()
            .Bind(Log)
            .Subscribe()
            .DisposeWith(CompositeDisposable);

            var singleton_lock = new AsyncLock();

            Utils.LogMessages
            .OfType <IUserIntervention>()
            .ObserveOnGuiThread()
            .SelectTask(async msg =>
            {
                using var _ = await singleton_lock.Wait();
                try
                {
                    await UserInterventionHandlers.Handle(msg);
                }
                catch (Exception ex)
                    when(ex.GetType() != typeof(TaskCanceledException))
                    {
                        Utils.Error(ex, $"Error while handling user intervention of type {msg?.GetType()}");
                        try
                        {
                            if (!msg.Handled)
                            {
                                msg.Cancel();
                            }
                        }
                        catch (Exception cancelEx)
                        {
                            Utils.Error(cancelEx, $"Error while cancelling user intervention of type {msg?.GetType()}");
                        }
                    }
            })
            .Subscribe()
            .DisposeWith(CompositeDisposable);

            if (IsStartingFromModlist(out var path))
            {
                Installer.Value.ModListLocation.TargetPath = path;
                NavigateTo(Installer.Value);
            }
            else
            {
                // Start on mode selection
                NavigateTo(ModeSelectionVM);
            }

            try
            {
                var assembly = Assembly.GetExecutingAssembly();
                var fvi      = FileVersionInfo.GetVersionInfo(assembly.Location);
                VersionDisplay = $"v{fvi.FileVersion}";
                Utils.Log($"Wabbajack Version: {fvi.FileVersion}");
            }
            catch (Exception ex)
            {
                Utils.Error(ex);
                VersionDisplay = "ERROR";
            }
            CopyVersionCommand = ReactiveCommand.Create(() =>
            {
                Clipboard.SetText($"Wabbajack {VersionDisplay}\n{ThisAssembly.Git.Sha}");
            });
            OpenSettingsCommand = ReactiveCommand.Create(
                canExecute: this.WhenAny(x => x.ActivePane)
                .Select(active => !SettingsPane.IsValueCreated || !object.ReferenceEquals(active, SettingsPane.Value)),
                execute: () => NavigateTo(SettingsPane.Value));

            OpenTerminalCommand = ReactiveCommand.Create(() => OpenTerminal());
        }