| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- using Avalonia;
- using Avalonia.Controls;
- using Avalonia.Controls.Primitives;
- using Avalonia.Data;
- using Avalonia.Data.Converters;
- using Avalonia.Input;
- using Avalonia.Interactivity;
- using Avalonia.LogicalTree;
- using Avalonia.Markup.Xaml;
- using Avalonia.Threading;
- using FluentAvalonia.Core;
- using FluentAvalonia.UI.Controls;
- using Ryujinx.Ava.Common.Locale;
- using Ryujinx.Ava.Ui.Controls;
- using Ryujinx.Ava.Ui.Models;
- using Ryujinx.Ava.Ui.ViewModels;
- using Ryujinx.HLE.FileSystem;
- using Ryujinx.Input;
- using Ryujinx.Input.Assigner;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using TimeZone = Ryujinx.Ava.Ui.Models.TimeZone;
- namespace Ryujinx.Ava.Ui.Windows
- {
- public class SettingsWindow : StyleableWindow
- {
- private ListBox _gameList;
- private TextBox _pathBox;
- private AutoCompleteBox _timeZoneBox;
- private ControllerSettingsWindow _controllerSettings;
- // Pages
- private Control _uiPage;
- private Control _inputPage;
- private Control _hotkeysPage;
- private Control _systemPage;
- private Control _cpuPage;
- private Control _graphicsPage;
- private Control _audioPage;
- private Control _networkPage;
- private Control _loggingPage;
- private NavigationView _navPanel;
- 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();
- AttachDebugDevTools();
- 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();
- AttachDebugDevTools();
- }
- [Conditional("DEBUG")]
- private void AttachDebugDevTools()
- {
- this.AttachDevTools();
- }
- private void InitializeComponent()
- {
- AvaloniaXamlLoader.Load(this);
- _pathBox = this.FindControl<TextBox>("PathBox");
- _gameList = this.FindControl<ListBox>("GameList");
- _timeZoneBox = this.FindControl<AutoCompleteBox>("TimeZoneBox");
- _controllerSettings = this.FindControl<ControllerSettingsWindow>("ControllerSettings");
- _uiPage = this.FindControl<Control>("UiPage");
- _inputPage = this.FindControl<Control>("InputPage");
- _hotkeysPage = this.FindControl<Control>("HotkeysPage");
- _systemPage = this.FindControl<Control>("SystemPage");
- _cpuPage = this.FindControl<Control>("CpuPage");
- _graphicsPage = this.FindControl<Control>("GraphicsPage");
- _audioPage = this.FindControl<Control>("AudioPage");
- _networkPage = this.FindControl<Control>("NetworkPage");
- _loggingPage = this.FindControl<Control>("LoggingPage");
- var pageGrid = this.FindControl<Grid>("Pages");
- pageGrid.Children.Clear();
- _navPanel = this.FindControl<NavigationView>("NavPanel");
- _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);
- }
- else
- {
- path = await new OpenFolderDialog().ShowAsync(this);
- if (!string.IsNullOrWhiteSpace(path))
- {
- ViewModel.GameDirectories.Add(path);
- }
- }
- }
- 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);
- }
- }
- 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 void SaveButton_Clicked(object sender, RoutedEventArgs e)
- {
- SaveSettings();
- Close();
- }
- private void CloseButton_Clicked(object sender, RoutedEventArgs e)
- {
- ViewModel.RevertIfNotSaved();
- Close();
- }
- private void ApplyButton_Clicked(object sender, RoutedEventArgs e)
- {
- SaveSettings();
- }
- private void SaveSettings()
- {
- ViewModel.SaveSettings();
- _controllerSettings?.SaveCurrentProfile();
- if (Owner is MainWindow window)
- {
- window.ViewModel.LoadApplications();
- }
- }
- protected override void OnClosed(EventArgs e)
- {
- _controllerSettings.Dispose();
- _currentAssigner?.Cancel();
- _currentAssigner = null;
- base.OnClosed(e);
- }
- }
- }
|