using System;
using ReactiveUI;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Windows.Media.Imaging;
using ReactiveUI.Fody.Helpers;
using System.Windows.Media;
using DynamicData;
using DynamicData.Binding;
using System.Reactive;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAPICodePack.Dialogs;
using Microsoft.WindowsAPICodePack.Shell;
using Wabbajack.Common;
using Wabbajack.DTOs;
using Wabbajack.DTOs.JsonConverters;
using Wabbajack.Extensions;
using Wabbajack.Installer;
using Wabbajack.Interventions;
using Wabbajack.Messages;
using Wabbajack.Paths;
using Wabbajack.RateLimiter;
using Wabbajack.View_Models;
using Wabbajack.Paths.IO;
using Consts = Wabbajack.Consts;
using KnownFolders = Wabbajack.Paths.IO.KnownFolders;
namespace Wabbajack;
public enum ModManager
{
Standard
}
public class InstallerVM : BackNavigatingVM, IBackNavigatingVM
{
[Reactive]
public ModList ModList { get; set; }
[Reactive]
public ErrorResponse? Completed { get; set; }
[Reactive]
public FilePickerVM ModListLocation { get; set; }
[Reactive]
public MO2InstallerVM Installer { get; set; }
[Reactive]
public BitmapFrame ModListImage { get; set; }
[Reactive]
public BitmapFrame SlideShowImage { get; set; }
///
/// Slideshow Data
///
[Reactive]
public string SlideShowTitle { get; set; }
[Reactive]
public string SlideShowAuthor { get; set; }
[Reactive]
public string SlideShowDescription { get; set; }
private readonly ObservableAsPropertyHelper _installing;
private readonly DTOSerializer _dtos;
private readonly ILogger _logger;
[Reactive]
public bool Installing { get; set; }
// Command properties
public ReactiveCommand ShowManifestCommand { get; }
public ReactiveCommand OpenReadmeCommand { get; }
public ReactiveCommand VisitModListWebsiteCommand { get; }
public ReactiveCommand CloseWhenCompleteCommand { get; }
public ReactiveCommand OpenLogsCommand { get; }
public ReactiveCommand GoToInstallCommand { get; }
public ReactiveCommand BeginCommand { get; }
public ReactiveCommand BackCommand { get; }
public InstallerVM(ILogger logger, DTOSerializer dtos) : base(logger)
{
_logger = logger;
_dtos = dtos;
Installer = new MO2InstallerVM(this);
BackCommand = ReactiveCommand.Create(() => NavigateToGlobal.Send(NavigateToGlobal.ScreenType.ModeSelectionView));
OpenReadmeCommand = ReactiveCommand.Create(() =>
{
UIUtils.OpenWebsite(new Uri(ModList!.Readme));
}, LoadingLock.IsNotLoadingObservable);
VisitModListWebsiteCommand = ReactiveCommand.Create(() =>
{
UIUtils.OpenWebsite(ModList!.Website);
}, LoadingLock.IsNotLoadingObservable);
ModListLocation = new FilePickerVM
{
ExistCheckOption = FilePickerVM.CheckOptions.On,
PathType = FilePickerVM.PathTypeOptions.File,
PromptTitle = "Select a ModList to install"
};
ModListLocation.Filters.Add(new CommonFileDialogFilter("Wabbajack Modlist", "*.wabbajack"));
MessageBus.Current.Listen()
.Subscribe(msg => LoadModlist(msg.Path).FireAndForget())
.DisposeWith(CompositeDisposable);
this.WhenActivated(disposables =>
{
ModListLocation.WhenAnyValue(l => l.TargetPath)
.Subscribe(p => LoadModlist(p).FireAndForget())
.DisposeWith(disposables);
});
}
private async Task LoadModlist(AbsolutePath path)
{
using var ll = LoadingLock.WithLoading();
ModListLocation.TargetPath = path;
try
{
ModList = await StandardInstaller.LoadFromFile(_dtos, path);
ModListImage = BitmapFrame.Create(await StandardInstaller.ModListImageStream(path));
PopulateSlideShow(ModList);
ll.Succeed();
}
catch (Exception ex)
{
_logger.LogError(ex, "While loading modlist");
ll.Fail();
}
}
private void PopulateSlideShow(ModList modList)
{
SlideShowTitle = modList.Name;
SlideShowAuthor = modList.Author;
SlideShowDescription = modList.Description;
SlideShowImage = ModListImage;
}
}