diff --git a/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs
new file mode 100644
index 000000000..b93cdd6dc
--- /dev/null
+++ b/src/Ryujinx/UI/ViewModels/SettingsHacksViewModel.cs
@@ -0,0 +1,77 @@
+using Gommon;
+using Ryujinx.Ava.Utilities.Configuration;
+
+namespace Ryujinx.Ava.UI.ViewModels
+{
+ public class SettingsHacksViewModel : BaseModel
+ {
+ private readonly SettingsViewModel _baseViewModel;
+
+ public SettingsHacksViewModel() {}
+
+ public SettingsHacksViewModel(SettingsViewModel settingsVm)
+ {
+ _baseViewModel = settingsVm;
+ }
+
+ private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix;
+ private bool _shaderTranslationThreadSleep = ConfigurationState.Instance.Hacks.EnableShaderTranslationDelay;
+ private int _shaderTranslationSleepDelay = ConfigurationState.Instance.Hacks.ShaderTranslationDelay;
+
+ public bool Xc2MenuSoftlockFixEnabled
+ {
+ get => _xc2MenuSoftlockFix;
+ set
+ {
+ _xc2MenuSoftlockFix = value;
+
+ OnPropertyChanged();
+ }
+ }
+
+ public bool ShaderTranslationDelayEnabled
+ {
+ get => _shaderTranslationThreadSleep;
+ set
+ {
+ _shaderTranslationThreadSleep = value;
+
+ OnPropertyChanged();
+ }
+ }
+
+ public string ShaderTranslationDelayTooltipText => $"Current value: {ShaderTranslationDelay}";
+
+ public int ShaderTranslationDelay
+ {
+ get => _shaderTranslationSleepDelay;
+ set
+ {
+ _shaderTranslationSleepDelay = value;
+
+ OnPropertiesChanged(nameof(ShaderTranslationDelay), nameof(ShaderTranslationDelayTooltipText));
+ }
+ }
+
+ public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb =>
+ {
+ sb.AppendLine(
+ "This fix applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.")
+ .AppendLine();
+
+ sb.AppendLine("From the issue on GitHub:").AppendLine();
+ sb.Append(
+ "When clicking very fast from game main menu to 2nd submenu, " +
+ "there is a low chance that the game will softlock, " +
+ "the submenu won't show up, while background music is still there.");
+ });
+
+ public static string ShaderTranslationDelayTooltip { get; } = Lambda.String(sb =>
+ {
+ sb.AppendLine("This hack applies the delay you specify every time shaders are attempted to be translated.")
+ .AppendLine();
+
+ sb.Append("Configurable via slider, only when this option is enabled.");
+ });
+ }
+}
diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
index 8126b3c7d..a5bdd2f88 100644
--- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs
@@ -65,9 +65,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private string _ldnPassphrase;
private string _ldnServer;
- private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix;
- private bool _shaderTranslationThreadSleep = ConfigurationState.Instance.Hacks.EnableShaderCompilationThreadSleep;
- private int _shaderTranslationSleepDelay = ConfigurationState.Instance.Hacks.ShaderCompilationThreadSleepDelay;
+ public SettingsHacksViewModel DirtyHacks { get; }
public int ResolutionScale
{
@@ -279,41 +277,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public bool Xc2MenuSoftlockFixEnabled
- {
- get => _xc2MenuSoftlockFix;
- set
- {
- _xc2MenuSoftlockFix = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool ShaderTranslationDelayEnabled
- {
- get => _shaderTranslationThreadSleep;
- set
- {
- _shaderTranslationThreadSleep = value;
-
- OnPropertyChanged();
- }
- }
-
- public string ShaderTranslationDelayTooltipText => $"Current value: {ShaderTranslationDelay}";
-
- public int ShaderTranslationDelay
- {
- get => _shaderTranslationSleepDelay;
- set
- {
- _shaderTranslationSleepDelay = value;
-
- OnPropertiesChanged(nameof(ShaderTranslationDelay), nameof(ShaderTranslationDelayTooltipText));
- }
- }
-
public int Language { get; set; }
public int Region { get; set; }
public int FsGlobalAccessLogMode { get; set; }
@@ -426,9 +389,12 @@ namespace Ryujinx.Ava.UI.ViewModels
{
_virtualFileSystem = virtualFileSystem;
_contentManager = contentManager;
+
if (Program.PreviewerDetached)
{
Task.Run(LoadTimeZones);
+
+ DirtyHacks = new SettingsHacksViewModel(this);
}
}
@@ -448,6 +414,8 @@ namespace Ryujinx.Ava.UI.ViewModels
{
Task.Run(LoadAvailableGpus);
LoadCurrentConfiguration();
+
+ DirtyHacks = new SettingsHacksViewModel(this);
}
}
@@ -662,9 +630,9 @@ namespace Ryujinx.Ava.UI.ViewModels
OpenglDebugLevel = (int)config.Logger.GraphicsDebugLevel.Value;
MultiplayerModeIndex = (int)config.Multiplayer.Mode.Value;
- DisableP2P = config.Multiplayer.DisableP2p.Value;
- LdnPassphrase = config.Multiplayer.LdnPassphrase.Value;
- LdnServer = config.Multiplayer.LdnServer.Value;
+ DisableP2P = config.Multiplayer.DisableP2p;
+ LdnPassphrase = config.Multiplayer.LdnPassphrase;
+ LdnServer = config.Multiplayer.LdnServer;
}
public void SaveSettings()
@@ -788,9 +756,9 @@ namespace Ryujinx.Ava.UI.ViewModels
config.Multiplayer.LdnServer.Value = LdnServer;
// Dirty Hacks
- config.Hacks.Xc2MenuSoftlockFix.Value = Xc2MenuSoftlockFixEnabled;
- config.Hacks.EnableShaderCompilationThreadSleep.Value = ShaderTranslationDelayEnabled;
- config.Hacks.ShaderCompilationThreadSleepDelay.Value = ShaderTranslationDelay;
+ config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFixEnabled;
+ config.Hacks.EnableShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelayEnabled;
+ config.Hacks.ShaderTranslationDelay.Value = DirtyHacks.ShaderTranslationDelay;
config.ToFileFormat().SaveConfig(Program.ConfigurationPath);
@@ -824,24 +792,5 @@ namespace Ryujinx.Ava.UI.ViewModels
RevertIfNotSaved();
CloseWindow?.Invoke();
}
-
- public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb =>
- {
- sb.AppendLine(
- "This fix applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.")
- .AppendLine();
-
- sb.AppendLine("From the issue on GitHub:").AppendLine();
- sb.Append(
- "When clicking very fast from game main menu to 2nd submenu, " +
- "there is a low chance that the game will softlock, " +
- "the submenu won't show up, while background music is still there.");
- });
-
- public static string ShaderTranslationDelayTooltip { get; } = Lambda.String(sb =>
- {
- sb.Append(
- "This hack applies the delay you specify every time shaders are attempted to be translated.");
- });
}
}
diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml
index b597706df..087112368 100644
--- a/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml
+++ b/src/Ryujinx/UI/Views/Settings/SettingsHacksView.axaml
@@ -34,10 +34,10 @@
Margin="0,10,0,0"
Orientation="Horizontal"
HorizontalAlignment="Center"
- ToolTip.Tip="{Binding Xc2MenuFixTooltip}">
+ ToolTip.Tip="{Binding DirtyHacks.Xc2MenuFixTooltip}">
+ IsChecked="{Binding DirtyHacks.Xc2MenuSoftlockFixEnabled}"/>
@@ -47,16 +47,17 @@
Margin="0,10,0,0"
Orientation="Horizontal"
HorizontalAlignment="Center"
- ToolTip.Tip="{Binding ShaderTranslationDelayTooltip}">
+ ToolTip.Tip="{Binding DirtyHacks.ShaderTranslationDelayTooltip}">
+ IsChecked="{Binding DirtyHacks.ShaderTranslationDelayEnabled}"/>
-
it.Hack == DirtyHacks.ShaderCompilationThreadSleep);
- Hacks.EnableShaderCompilationThreadSleep.Value = shaderCompilationThreadSleep != null;
- Hacks.ShaderCompilationThreadSleepDelay.Value = shaderCompilationThreadSleep?.Value ?? 0;
+ Hacks.EnableShaderTranslationDelay.Value = shaderCompilationThreadSleep != null;
+ Hacks.ShaderTranslationDelay.Value = shaderCompilationThreadSleep?.Value ?? 0;
}
if (configurationFileUpdated)
diff --git a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs
index ef3d565da..2a91bf65b 100644
--- a/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs
+++ b/src/Ryujinx/Utilities/Configuration/ConfigurationState.Model.cs
@@ -629,18 +629,18 @@ namespace Ryujinx.Ava.Utilities.Configuration
public ReactiveObject Xc2MenuSoftlockFix { get; private set; }
- public ReactiveObject EnableShaderCompilationThreadSleep { get; private set; }
+ public ReactiveObject EnableShaderTranslationDelay { get; private set; }
- public ReactiveObject ShaderCompilationThreadSleepDelay { get; private set; }
+ public ReactiveObject ShaderTranslationDelay { get; private set; }
public HacksSection()
{
ShowDirtyHacks = new ReactiveObject();
Xc2MenuSoftlockFix = new ReactiveObject();
Xc2MenuSoftlockFix.Event += HackChanged;
- EnableShaderCompilationThreadSleep = new ReactiveObject();
- EnableShaderCompilationThreadSleep.Event += HackChanged;
- ShaderCompilationThreadSleepDelay = new ReactiveObject();
+ EnableShaderTranslationDelay = new ReactiveObject();
+ EnableShaderTranslationDelay.Event += HackChanged;
+ ShaderTranslationDelay = new ReactiveObject();
}
private void HackChanged(object sender, ReactiveEventArgs rxe)
@@ -651,7 +651,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
if (newHacks != _lastHackCollection)
{
RyuLogger.Info?.Print(LogClass.Configuration,
- $"EnabledDirtyHacks set to: [{_lastHackCollection}]", "LogValueChange");
+ $"EnabledDirtyHacks set to: [{newHacks}]", "LogValueChange");
_lastHackCollection = newHacks;
}
@@ -668,8 +668,8 @@ namespace Ryujinx.Ava.Utilities.Configuration
if (Xc2MenuSoftlockFix)
Apply(DirtyHacks.Xc2MenuSoftlockFix);
- if (EnableShaderCompilationThreadSleep)
- Apply(DirtyHacks.ShaderCompilationThreadSleep, ShaderCompilationThreadSleepDelay);
+ if (EnableShaderTranslationDelay)
+ Apply(DirtyHacks.ShaderCompilationThreadSleep, ShaderTranslationDelay);
return enabledHacks.ToArray();