using ReactiveUI; using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Windows; using System.Windows.Controls; using Wabbajack.Common; using Wabbajack.Messages; namespace Wabbajack; /// /// Interaction logic for NavigationView.xaml /// public partial class NavigationView : ReactiveUserControl { public Dictionary> ButtonScreensDictionary { get; set; } public NavigationView() { InitializeComponent(); ButtonScreensDictionary = new() { { HomeButton, [ScreenType.Home] }, { BrowseButton, [ScreenType.ModListGallery, ScreenType.Installer] }, { CompileButton, [ScreenType.CompilerHome, ScreenType.CompilerMain] }, { SettingsButton, [ScreenType.Settings] }, }; this.WhenActivated(dispose => { this.BindCommand(ViewModel, vm => vm.BrowseCommand, v => v.BrowseButton) .DisposeWith(dispose); this.BindCommand(ViewModel, vm => vm.HomeCommand, v => v.HomeButton) .DisposeWith(dispose); this.BindCommand(ViewModel, vm => vm.CompileModListCommand, v => v.CompileButton) .DisposeWith(dispose); this.BindCommand(ViewModel, vm => vm.SettingsCommand, v => v.SettingsButton) .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.Version) .Select(version => $"v{version}") .BindToStrict(this, v => v.VersionTextBlock.Text) .DisposeWith(dispose); this.WhenAny(x => x.ViewModel.ActiveScreen) .Subscribe(x => SetButtonActive(x)) .DisposeWith(dispose); }); } private void SetButtonActive(ScreenType activeScreen) { var activeButtonStyle = (Style)Application.Current.Resources["ActiveNavButtonStyle"]; var mainButtonStyle = (Style)Application.Current.Resources["MainNavButtonStyle"]; foreach(var (button, screens) in ButtonScreensDictionary) { if (screens.Contains(activeScreen)) button.Style = activeButtonStyle; else button.Style = mainButtonStyle; } } }