wabbajack/Wabbajack/View Models/MainWindowVM.cs

109 lines
3.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;
2019-12-04 04:12:08 +00:00
using System.Windows;
using Wabbajack.Common;
2019-12-04 04:12:08 +00:00
using Wabbajack.Common.StatusFeed;
2019-10-22 02:12:55 +00:00
using Wabbajack.Lib;
2019-12-04 04:12:08 +00:00
using Wabbajack.Lib.StatusMessages;
2019-10-22 02:12:55 +00:00
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-24 08:12:28 +00:00
[Reactive]
public ViewModel ActivePane { get; set; }
2019-10-22 02:12:55 +00:00
2019-12-04 04:12:08 +00:00
public ObservableCollectionExtended<IStatusMessage> Log { get; } = new ObservableCollectionExtended<IStatusMessage>();
2019-11-24 08:12:28 +00:00
public readonly Lazy<CompilerVM> Compiler;
public readonly Lazy<InstallerVM> Installer;
2019-11-30 09:08:04 +00:00
public readonly Lazy<ModListGalleryVM> Gallery;
2019-11-24 08:12:28 +00:00
public readonly ModeSelectionVM ModeSelectionVM;
public readonly WebBrowserVM WebBrowserVM;
2019-11-24 08:12:28 +00:00
public MainWindowVM(MainWindow mainWindow, MainSettings settings)
2019-10-22 02:12:55 +00:00
{
2019-11-21 15:04:33 +00:00
MainWindow = mainWindow;
Settings = settings;
2019-11-24 08:12:28 +00:00
Installer = new Lazy<InstallerVM>(() => new InstallerVM(this));
Compiler = new Lazy<CompilerVM>(() => new CompilerVM(this));
2019-11-30 09:08:04 +00:00
Gallery = new Lazy<ModListGalleryVM>(() => new ModListGalleryVM(this));
2019-11-24 08:12:28 +00:00
ModeSelectionVM = new ModeSelectionVM(this);
WebBrowserVM = new WebBrowserVM();
// Set up logging
Utils.LogMessages
.ObserveOn(RxApp.TaskpoolScheduler)
.ToObservableChangeSet()
.Buffer(TimeSpan.FromMilliseconds(250), RxApp.TaskpoolScheduler)
.Where(l => l.Count > 0)
.ObserveOn(RxApp.MainThreadScheduler)
.FlattenBufferResult()
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
2019-12-04 04:12:08 +00:00
Utils.LogMessages
.OfType<ConfirmUpdateOfExistingInstall>()
.Subscribe(msg => ConfirmUpdate(msg));
if (IsStartingFromModlist(out var path))
{
2019-12-03 05:40:59 +00:00
Installer.Value.ModListLocation.TargetPath = path;
ActivePane = Installer.Value;
}
else
{
// Start on mode selection
//ActivePane = ModeSelectionVM;
ActivePane = WebBrowserVM;
}
}
2019-12-04 04:12:08 +00:00
private void ConfirmUpdate(ConfirmUpdateOfExistingInstall msg)
{
var result = MessageBox.Show(msg.ExtendedDescription, msg.ShortDescription, MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
2019-12-05 05:14:40 +00:00
msg.Confirm();
2019-12-04 04:12:08 +00:00
else
msg.Cancel();
}
private static bool IsStartingFromModlist(out string modlistPath)
{
string[] args = Environment.GetCommandLineArgs();
if (args.Length != 3 || !args[1].Contains("-i"))
{
modlistPath = default;
return false;
}
modlistPath = args[2];
return true;
}
2019-11-30 09:08:04 +00:00
public void OpenInstaller(string path)
{
if (path == null) return;
var installer = Installer.Value;
Settings.Installer.LastInstalledListLocation = path;
ActivePane = installer;
2019-12-03 05:40:59 +00:00
installer.ModListLocation.TargetPath = path;
2019-11-30 09:08:04 +00:00
}
2019-10-22 02:12:55 +00:00
}
}