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}"); }); }
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()); }