From fa8606732c09b599bd204731d5520ef7ab1eb250 Mon Sep 17 00:00:00 2001 From: Timothy Baldridge Date: Thu, 21 Oct 2021 22:28:52 -0600 Subject: [PATCH] List select views --- .../Controls/InstalledListView.axaml | 15 +++++++ .../Controls/InstalledListView.axaml.cs | 28 +++++++++++++ .../Controls/InstalledListViewModel.cs | 32 +++++++++++++++ Wabbajack.App/Screens/PlaySelectView.axaml | 22 ++++++++++ Wabbajack.App/Screens/PlaySelectView.axaml.cs | 19 +++++++++ Wabbajack.App/Screens/PlaySelectViewModel.cs | 40 +++++++++++++++++++ Wabbajack.App/ServiceExtensions.cs | 6 ++- Wabbajack.App/Views/ModeSelectionView.axaml | 2 +- .../Views/ModeSelectionView.axaml.cs | 5 +++ 9 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 Wabbajack.App/Controls/InstalledListView.axaml create mode 100644 Wabbajack.App/Controls/InstalledListView.axaml.cs create mode 100644 Wabbajack.App/Controls/InstalledListViewModel.cs create mode 100644 Wabbajack.App/Screens/PlaySelectView.axaml create mode 100644 Wabbajack.App/Screens/PlaySelectView.axaml.cs create mode 100644 Wabbajack.App/Screens/PlaySelectViewModel.cs diff --git a/Wabbajack.App/Controls/InstalledListView.axaml b/Wabbajack.App/Controls/InstalledListView.axaml new file mode 100644 index 00000000..14e90f4f --- /dev/null +++ b/Wabbajack.App/Controls/InstalledListView.axaml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/Wabbajack.App/Controls/InstalledListView.axaml.cs b/Wabbajack.App/Controls/InstalledListView.axaml.cs new file mode 100644 index 00000000..778f44da --- /dev/null +++ b/Wabbajack.App/Controls/InstalledListView.axaml.cs @@ -0,0 +1,28 @@ +using Avalonia.Controls.Mixins; +using Avalonia.ReactiveUI; +using ReactiveUI; +using Wabbajack.App.Utilities; + +namespace Wabbajack.App.Controls; + +public partial class InstalledListView : ReactiveUserControl, IActivatableView +{ + public InstalledListView() + { + InitializeComponent(); + + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.Name, view => view.Title.Text) + .DisposeWith(disposables); + + this.OneWayBind(ViewModel, vm => vm.InstallPath, view => view.Title.Text, + p => p.ToString()) + .DisposeWith(disposables); + + this.BindCommand(ViewModel, vm => vm.Play, view => view.PlayButton) + .DisposeWith(disposables); + }); + } + +} \ No newline at end of file diff --git a/Wabbajack.App/Controls/InstalledListViewModel.cs b/Wabbajack.App/Controls/InstalledListViewModel.cs new file mode 100644 index 00000000..1b3b43c3 --- /dev/null +++ b/Wabbajack.App/Controls/InstalledListViewModel.cs @@ -0,0 +1,32 @@ +using System.Reactive; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using Wabbajack.App.Messages; +using Wabbajack.App.Screens; +using Wabbajack.App.ViewModels; +using Wabbajack.DTOs.SavedSettings; +using Wabbajack.Paths; + +namespace Wabbajack.App.Controls; + +public class InstalledListViewModel : ViewModelBase +{ + private readonly InstallationConfigurationSetting _setting; + public AbsolutePath InstallPath => _setting.Install; + + public string Name => _setting.Metadata?.Title ?? ""; + public ReactiveCommand Play { get; } + + public InstalledListViewModel(InstallationConfigurationSetting setting) + { + Activator = new ViewModelActivator(); + _setting = setting; + + Play = ReactiveCommand.Create(() => + { + MessageBus.Instance.Send(new ConfigureLauncher(InstallPath)); + MessageBus.Instance.Send(new NavigateTo(typeof(LauncherViewModel))); + }); + } + +} \ No newline at end of file diff --git a/Wabbajack.App/Screens/PlaySelectView.axaml b/Wabbajack.App/Screens/PlaySelectView.axaml new file mode 100644 index 00000000..93881c42 --- /dev/null +++ b/Wabbajack.App/Screens/PlaySelectView.axaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Wabbajack.App/Screens/PlaySelectView.axaml.cs b/Wabbajack.App/Screens/PlaySelectView.axaml.cs new file mode 100644 index 00000000..c35e220a --- /dev/null +++ b/Wabbajack.App/Screens/PlaySelectView.axaml.cs @@ -0,0 +1,19 @@ +using Avalonia.Controls.Mixins; +using ReactiveUI; +using Wabbajack.App.Views; + +namespace Wabbajack.App.Screens; + +public partial class PlaySelectView : ScreenBase +{ + public PlaySelectView() + { + InitializeComponent(); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.Items, view => view.Lists.Items) + .DisposeWith(disposables); + }); + } + +} \ No newline at end of file diff --git a/Wabbajack.App/Screens/PlaySelectViewModel.cs b/Wabbajack.App/Screens/PlaySelectViewModel.cs new file mode 100644 index 00000000..3a3e5d1b --- /dev/null +++ b/Wabbajack.App/Screens/PlaySelectViewModel.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Disposables; +using System.Threading.Tasks; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; +using Wabbajack.App.Controls; +using Wabbajack.App.Models; +using Wabbajack.App.ViewModels; +using Wabbajack.Common; +using Wabbajack.DTOs.SavedSettings; + +namespace Wabbajack.App.Screens; + +public class PlaySelectViewModel : ViewModelBase, IActivatableViewModel +{ + private readonly InstallationStateManager _manager; + + [Reactive] + public IEnumerable Items { get; set; } + + public PlaySelectViewModel(InstallationStateManager manager) + { + _manager = manager; + Activator = new ViewModelActivator(); + + this.WhenActivated(disposables => + { + LoadAndSetItems().FireAndForget(); + Disposable.Empty.DisposeWith(disposables); + }); + } + + public async Task LoadAndSetItems() + { + var items = await _manager.GetAll(); + Items = items.Settings.Select(a => new InstalledListViewModel(a)).ToArray(); + } + +} \ No newline at end of file diff --git a/Wabbajack.App/ServiceExtensions.cs b/Wabbajack.App/ServiceExtensions.cs index 2282272d..8d67e9bb 100644 --- a/Wabbajack.App/ServiceExtensions.cs +++ b/Wabbajack.App/ServiceExtensions.cs @@ -36,11 +36,11 @@ namespace Wabbajack.App services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddDTOConverters(); services.AddDTOSerializer(); services.AddSingleton(); @@ -55,11 +55,13 @@ namespace Wabbajack.App services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddAllSingleton(); services.AddAllSingleton(); services.AddAllSingleton(); diff --git a/Wabbajack.App/Views/ModeSelectionView.axaml b/Wabbajack.App/Views/ModeSelectionView.axaml index 7aa76b37..cb00693e 100644 --- a/Wabbajack.App/Views/ModeSelectionView.axaml +++ b/Wabbajack.App/Views/ModeSelectionView.axaml @@ -18,7 +18,7 @@ - + diff --git a/Wabbajack.App/Views/ModeSelectionView.axaml.cs b/Wabbajack.App/Views/ModeSelectionView.axaml.cs index fb045f85..4dff3ffb 100644 --- a/Wabbajack.App/Views/ModeSelectionView.axaml.cs +++ b/Wabbajack.App/Views/ModeSelectionView.axaml.cs @@ -29,6 +29,11 @@ namespace Wabbajack.App.Views { MessageBus.Instance.Send(new NavigateTo(typeof(CompilerConfigurationViewModel))); }).DisposeWith(disposables); + + LaunchButton.Button.Command = ReactiveCommand.Create(() => + { + MessageBus.Instance.Send(new NavigateTo(typeof(PlaySelectViewModel))); + }); }); }