wabbajack/Wabbajack/View Models/MainWindowVM.cs

76 lines
2.6 KiB
C#
Raw Normal View History

using DynamicData;
using DynamicData.Binding;
using ReactiveUI;
2019-11-02 23:23:11 +00:00
using ReactiveUI.Fody.Helpers;
2019-10-22 02:12:55 +00:00
using System;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using Wabbajack.Common;
2019-10-22 02:12:55 +00:00
using Wabbajack.Lib;
namespace Wabbajack
{
/// <summary>
/// Main View Model for the application.
/// Keeps track of which sub view is being shown in the window, and has some singleton wiring like WorkQueue and Logging.
/// </summary>
2019-10-22 02:12:55 +00:00
public class MainWindowVM : ViewModel
{
public MainWindow MainWindow { get; }
2019-10-22 02:12:55 +00:00
public MainSettings Settings { get; }
2019-11-21 15:45:00 +00:00
private readonly ObservableAsPropertyHelper<ViewModel> _activePane;
public ViewModel ActivePane => _activePane.Value;
2019-10-22 02:12:55 +00:00
public ObservableCollectionExtended<string> Log { get; } = new ObservableCollectionExtended<string>();
2019-11-02 23:23:11 +00:00
[Reactive]
public RunMode Mode { get; set; }
2019-11-21 15:45:00 +00:00
private readonly Lazy<CompilerVM> _compiler;
private readonly Lazy<InstallerVM> _installer;
public MainWindowVM(RunMode mode, string source, MainWindow mainWindow, MainSettings settings)
2019-10-22 02:12:55 +00:00
{
2019-11-21 15:04:33 +00:00
Mode = mode;
MainWindow = mainWindow;
Settings = settings;
2019-11-21 15:45:00 +00:00
_installer = new Lazy<InstallerVM>(() => new InstallerVM(this, source));
_compiler = new Lazy<CompilerVM>(() => new CompilerVM(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()
.Top(5000)
2019-11-21 15:04:33 +00:00
.Bind(Log)
.Subscribe()
2019-11-21 15:04:33 +00:00
.DisposeWith(CompositeDisposable);
2019-11-17 04:16:42 +00:00
// Wire mode to drive the active pane.
// Note: This is currently made into a derivative property driven by mode,
// but it can be easily changed into a normal property that can be set from anywhere if needed
2019-11-21 15:45:00 +00:00
_activePane = this.WhenAny(x => x.Mode)
.Select<RunMode, ViewModel>(m =>
{
switch (m)
{
case RunMode.Compile:
2019-11-21 15:45:00 +00:00
return _compiler.Value;
case RunMode.Install:
2019-11-21 15:45:00 +00:00
return _installer.Value;
default:
return default;
}
})
2019-11-21 15:04:33 +00:00
.ToProperty(this, nameof(ActivePane));
}
2019-10-22 02:12:55 +00:00
}
}