Compare commits

..

4 Commits

Author SHA1 Message Date
Vladimir Sokolov
e75ce17137 Merge branch 'master' into Master_PR 2025-02-21 10:38:39 +10:00
Vladimir Sokolov
0d9a4fe48c Merge branch 'master' into Master_PR 2025-02-19 14:11:13 +10:00
Vladimir Sokolov
6c13e94c93 Merge branch 'master' into Master_PR 2025-02-19 09:36:44 +10:00
Vova
3e69afd110 Fix: Input page is saved only when input is changed
This is an attempt to decouple "saving gamepad settings" from the rest of the emulator settings. Should fix the issue where the gamepad was not detected when starting the emulator and the game (usually after saving settings with the gamepad turned off)
2025-02-18 19:28:13 +10:00
6 changed files with 37 additions and 8 deletions

View File

@@ -52,6 +52,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
[ObservableProperty] private object _configViewModel;
[ObservableProperty] private string _profileName;
private bool _isLoaded;
public bool InitInputPage { get; set; }
private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
@@ -92,6 +93,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense");
public bool IsModified { get; set; }
public bool IsInputConfigChanged { get; set; }
public event Action NotifyChangesEvent;
public PlayerIndex PlayerIdChoose
@@ -121,13 +124,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
}
_isLoaded = false;
LoadConfiguration();
LoadDevice();
LoadProfiles();
_isLoaded = true;
OnPropertyChanged();
}
}
@@ -296,7 +298,10 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
{
ConfigViewModel = new ControllerInputViewModel(this, new GamepadInputConfig(controllerInputConfig));
}
}
IsInputConfigChanged |= InitInputPage; // If the field has been changed, the control settings will be overwritten
InitInputPage = true; // initialization variable
}
public void LoadDevice()
{
@@ -817,6 +822,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
{
IsModified = false;
if (!IsInputConfigChanged)
{
return; //If the input settings were not touched, then do nothing
}
IsInputConfigChanged = false; // Input settings have been changed
List<InputConfig> newConfig = [];
newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value);

View File

@@ -65,6 +65,9 @@ namespace Ryujinx.Ava.UI.Views.Input
if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value)
{
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
FlagInputConfigChanged();
_changeSlider = (float)check.Value;
}
}
@@ -75,6 +78,9 @@ namespace Ryujinx.Ava.UI.Views.Input
if (sender is CheckBox { IsPointerOver: true })
{
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
FlagInputConfigChanged();
_currentAssigner?.Cancel();
_currentAssigner = null;
}
@@ -102,6 +108,8 @@ namespace Ryujinx.Ava.UI.Views.Input
PointerPressed += MouseClick;
FlagInputConfigChanged();
ControllerInputViewModel viewModel = (DataContext as ControllerInputViewModel);
IKeyboard keyboard =
@@ -208,6 +216,11 @@ namespace Ryujinx.Ava.UI.Views.Input
}
}
private void FlagInputConfigChanged()
{
(DataContext as ControllerInputViewModel)!.ParentModel.IsInputConfigChanged = true;
}
private void MouseClick(object sender, PointerPressedEventArgs e)
{
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
@@ -239,7 +252,6 @@ namespace Ryujinx.Ava.UI.Views.Input
{
gamepad?.ClearLed();
}
_currentAssigner?.Cancel();
_currentAssigner = null;
}

View File

@@ -48,6 +48,7 @@ namespace Ryujinx.Ava.UI.Views.Input
if (result == UserResult.Yes)
{
ViewModel.InitInputPage = false;
ViewModel.Save();
}

View File

@@ -60,6 +60,8 @@ namespace Ryujinx.Ava.UI.Views.Input
PointerPressed += MouseClick;
FlagInputConfigChanged();
if (DataContext is not KeyboardInputViewModel viewModel)
return;
@@ -184,6 +186,11 @@ namespace Ryujinx.Ava.UI.Views.Input
}
}
private void FlagInputConfigChanged()
{
(DataContext as KeyboardInputViewModel)!.ParentModel.IsInputConfigChanged = true;
}
private void MouseClick(object sender, PointerPressedEventArgs e)
{
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;

View File

@@ -148,11 +148,8 @@ namespace Ryujinx.Ava.UI.Windows
{
if ((firmwarePath.ExistsAsFile && firmwarePath.Extension is "xci" or "zip") ||
firmwarePath.ExistsAsDirectory)
{
await Dispatcher.UIThread.InvokeAsync(() =>
ViewModel.HandleFirmwareInstallation(firmwarePath));
CommandLineState.FirmwareToInstallPathArg = null;
}
else
Logger.Notice.Print(LogClass.UI, "Invalid firmware type provided. Path must be a directory, or a .zip or .xci file.");
}

View File

@@ -14,7 +14,7 @@ namespace Ryujinx.Ava.Utilities
public static string OverrideBackendThreading { get; private set; }
public static string OverrideHideCursor { get; private set; }
public static string BaseDirPathArg { get; private set; }
public static FilePath FirmwareToInstallPathArg { get; set; }
public static FilePath FirmwareToInstallPathArg { get; private set; }
public static string Profile { get; private set; }
public static string LaunchPathArg { get; private set; }
public static string LaunchApplicationId { get; private set; }