| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- using Avalonia.Controls;
- using Avalonia.Controls.Primitives;
- using Avalonia.Data;
- using Avalonia.Data.Converters;
- using Avalonia.Input;
- using Avalonia.Interactivity;
- using FluentAvalonia.Core;
- using FluentAvalonia.UI.Controls;
- using Ryujinx.Ava.Common.Locale;
- using Ryujinx.Ava.Ui.Controls;
- using Ryujinx.Ava.Ui.ViewModels;
- using Ryujinx.HLE.FileSystem;
- using Ryujinx.Input;
- using Ryujinx.Input.Assigner;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using TimeZone = Ryujinx.Ava.Ui.Models.TimeZone;
- namespace Ryujinx.Ava.Ui.Windows
- {
- public partial class SettingsWindow : StyleableWindow
- {
- private ButtonKeyAssigner _currentAssigner;
- internal SettingsViewModel ViewModel { get; set; }
- public SettingsWindow(VirtualFileSystem virtualFileSystem, ContentManager contentManager)
- {
- Title = $"Ryujinx {Program.Version} - {LocaleManager.Instance["Settings"]}";
- ViewModel = new SettingsViewModel(virtualFileSystem, contentManager, this);
- DataContext = ViewModel;
- InitializeComponent();
- Load();
- FuncMultiValueConverter<string, string> converter = new(parts => string.Format("{0} {1} {2}", parts.ToArray()));
- MultiBinding tzMultiBinding = new() { Converter = converter };
- tzMultiBinding.Bindings.Add(new Binding("UtcDifference"));
- tzMultiBinding.Bindings.Add(new Binding("Location"));
- tzMultiBinding.Bindings.Add(new Binding("Abbreviation"));
- TimeZoneBox.ValueMemberBinding = tzMultiBinding;
- }
- public SettingsWindow()
- {
- ViewModel = new SettingsViewModel();
- DataContext = ViewModel;
- InitializeComponent();
- Load();
- }
- private void Load()
- {
- Pages.Children.Clear();
- NavPanel.SelectionChanged += NavPanelOnSelectionChanged;
- NavPanel.SelectedItem = NavPanel.MenuItems.ElementAt(0);
- }
- private void Button_Checked(object sender, RoutedEventArgs e)
- {
- if (sender is ToggleButton button)
- {
- if (_currentAssigner != null && button == _currentAssigner.ToggledButton)
- {
- return;
- }
- if (_currentAssigner == null && (bool)button.IsChecked)
- {
- _currentAssigner = new ButtonKeyAssigner(button);
- FocusManager.Instance.Focus(this, NavigationMethod.Pointer);
- PointerPressed += MouseClick;
- IKeyboard keyboard = (IKeyboard)ViewModel.AvaloniaKeyboardDriver.GetGamepad(ViewModel.AvaloniaKeyboardDriver.GamepadsIds[0]);
- IButtonAssigner assigner = new KeyboardKeyAssigner(keyboard);
- _currentAssigner.GetInputAndAssign(assigner);
- }
- else
- {
- if (_currentAssigner != null)
- {
- ToggleButton oldButton = _currentAssigner.ToggledButton;
- _currentAssigner.Cancel();
- _currentAssigner = null;
- button.IsChecked = false;
- }
- }
- }
- }
- private void Button_Unchecked(object sender, RoutedEventArgs e)
- {
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- }
- private void MouseClick(object sender, PointerPressedEventArgs e)
- {
- bool shouldUnbind = false;
- if (e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed)
- {
- shouldUnbind = true;
- }
- _currentAssigner?.Cancel(shouldUnbind);
- PointerPressed -= MouseClick;
- }
- private void NavPanelOnSelectionChanged(object sender, NavigationViewSelectionChangedEventArgs e)
- {
- if (e.SelectedItem is NavigationViewItem navitem)
- {
- switch (navitem.Tag.ToString())
- {
- case "UiPage":
- NavPanel.Content = UiPage;
- break;
- case "InputPage":
- NavPanel.Content = InputPage;
- break;
- case "HotkeysPage":
- NavPanel.Content = HotkeysPage;
- break;
- case "SystemPage":
- NavPanel.Content = SystemPage;
- break;
- case "CpuPage":
- NavPanel.Content = CpuPage;
- break;
- case "GraphicsPage":
- NavPanel.Content = GraphicsPage;
- break;
- case "AudioPage":
- NavPanel.Content = AudioPage;
- break;
- case "NetworkPage":
- NavPanel.Content = NetworkPage;
- break;
- case "LoggingPage":
- NavPanel.Content = LoggingPage;
- break;
- }
- }
- }
- private async void AddButton_OnClick(object sender, RoutedEventArgs e)
- {
- string path = PathBox.Text;
- if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path) && !ViewModel.GameDirectories.Contains(path))
- {
- ViewModel.GameDirectories.Add(path);
- ViewModel.DirectoryChanged = true;
- }
- else
- {
- path = await new OpenFolderDialog().ShowAsync(this);
- if (!string.IsNullOrWhiteSpace(path))
- {
- ViewModel.GameDirectories.Add(path);
- ViewModel.DirectoryChanged = true;
- }
- }
- }
- private void RemoveButton_OnClick(object sender, RoutedEventArgs e)
- {
- List<string> selected = new(GameList.SelectedItems.Cast<string>());
- foreach (string path in selected)
- {
- ViewModel.GameDirectories.Remove(path);
- ViewModel.DirectoryChanged = true;
- }
- }
- private void TimeZoneBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (e.AddedItems != null && e.AddedItems.Count > 0)
- {
- if (e.AddedItems[0] is TimeZone timeZone)
- {
- e.Handled = true;
- ViewModel.ValidateAndSetTimeZone(timeZone.Location);
- }
- }
- }
- private void TimeZoneBox_OnTextChanged(object sender, EventArgs e)
- {
- if (sender is AutoCompleteBox box)
- {
- if (box.SelectedItem != null && box.SelectedItem is TimeZone timeZone)
- {
- ViewModel.ValidateAndSetTimeZone(timeZone.Location);
- }
- }
- }
- private async void SaveButton_Clicked(object sender, RoutedEventArgs e)
- {
- await SaveSettings();
- Close();
- }
- private void CloseButton_Clicked(object sender, RoutedEventArgs e)
- {
- ViewModel.RevertIfNotSaved();
- Close();
- }
- private async void ApplyButton_Clicked(object sender, RoutedEventArgs e)
- {
- await SaveSettings();
- }
- private async Task SaveSettings()
- {
- await ViewModel.SaveSettings();
- ControllerSettings?.SaveCurrentProfile();
- if (Owner is MainWindow window && ViewModel.DirectoryChanged)
- {
- window.ViewModel.LoadApplications();
- }
- ViewModel.DirectoryChanged = false;
- }
- protected override void OnClosed(EventArgs e)
- {
- ControllerSettings.Dispose();
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- base.OnClosed(e);
- }
- }
- }
|