diff --git a/Directory.Packages.props b/Directory.Packages.props
index 070c1330c..7054dcd7d 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -17,6 +17,7 @@
+
diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs
index b90f8b801..c728ee9c9 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/AppHost.cs
@@ -314,7 +314,7 @@ namespace Ryujinx.Ava
_renderer.Window?.ChangeVSyncMode(e.NewValue);
- _viewModel.ShowCustomVSyncIntervalPicker = (e.NewValue == VSyncMode.Custom);
+ _viewModel.UpdateVSyncIntervalPicker();
}
public void VSyncModeToggle()
diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj
index 461e556ea..0991cf9ce 100644
--- a/src/Ryujinx/Ryujinx.csproj
+++ b/src/Ryujinx/Ryujinx.csproj
@@ -49,6 +49,7 @@
+
@@ -162,4 +163,4 @@
-
\ No newline at end of file
+
diff --git a/src/Ryujinx/UI/ViewModels/BaseModel.cs b/src/Ryujinx/UI/ViewModels/BaseModel.cs
index e27c52867..c0ccfcae1 100644
--- a/src/Ryujinx/UI/ViewModels/BaseModel.cs
+++ b/src/Ryujinx/UI/ViewModels/BaseModel.cs
@@ -1,18 +1,10 @@
+using CommunityToolkit.Mvvm.ComponentModel;
using System;
-using System.ComponentModel;
-using System.Runtime.CompilerServices;
namespace Ryujinx.Ava.UI.ViewModels
{
- public class BaseModel : INotifyPropertyChanged
+ public class BaseModel : ObservableObject
{
- public event PropertyChangedEventHandler PropertyChanged;
-
- protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
protected void OnPropertiesChanged(string firstPropertyName, params ReadOnlySpan propertyNames)
{
OnPropertyChanged(firstPropertyName);
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 23bd2d9e7..6df1f76ad 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -6,6 +6,7 @@ using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
+using CommunityToolkit.Mvvm.ComponentModel;
using DynamicData;
using DynamicData.Binding;
using FluentAvalonia.UI.Controls;
@@ -54,80 +55,76 @@ using ShaderCacheLoadingState = Ryujinx.Graphics.Gpu.Shader.ShaderCacheState;
namespace Ryujinx.Ava.UI.ViewModels
{
- public class MainWindowViewModel : BaseModel
+ public partial class MainWindowViewModel : BaseModel
{
private const int HotKeyPressDelayMs = 500;
private delegate int LoadContentFromFolderDelegate(List dirs, out int numRemoved);
- private ObservableCollectionExtended _applications;
- private string _aspectStatusText;
-
- private string _loadHeading;
- private string _cacheLoadStatus;
- private string _searchText;
- private Timer _searchTimer;
- private string _dockedStatusText;
- private string _vSyncModeText;
- private string _fifoStatusText;
- private string _gameStatusText;
- private string _volumeStatusText;
- private string _gpuStatusText;
- private string _shaderCountText;
+ [ObservableProperty] private ObservableCollectionExtended _applications;
+ [ObservableProperty] private string _aspectRatioStatusText;
+ [ObservableProperty] private string _loadHeading;
+ [ObservableProperty] private string _cacheLoadStatus;
+ [ObservableProperty] private string _dockedStatusText;
+ [ObservableProperty] private string _fifoStatusText;
+ [ObservableProperty] private string _gameStatusText;
+ [ObservableProperty] private string _volumeStatusText;
+ [ObservableProperty] private string _gpuNameText;
+ [ObservableProperty] private string _backendText;
+ [ObservableProperty] private string _shaderCountText;
+ [ObservableProperty] private bool _showShaderCompilationHint;
+ [ObservableProperty] private bool _isFullScreen;
+ [ObservableProperty] private int _progressMaximum;
+ [ObservableProperty] private int _progressValue;
+ [ObservableProperty] private bool _showMenuAndStatusBar = true;
+ [ObservableProperty] private bool _showStatusSeparator;
+ [ObservableProperty] private Brush _progressBarForegroundColor;
+ [ObservableProperty] private Brush _progressBarBackgroundColor;
+ [ObservableProperty] private Brush _vSyncModeColor;
+ [ObservableProperty] private byte[] _selectedIcon;
+ [ObservableProperty] private int _statusBarProgressMaximum;
+ [ObservableProperty] private int _statusBarProgressValue;
+ [ObservableProperty] private string _statusBarProgressStatusText;
+ [ObservableProperty] private bool _statusBarProgressStatusVisible;
+ [ObservableProperty] private bool _isPaused;
+ [ObservableProperty] private bool _isLoadingIndeterminate = true;
+ [ObservableProperty] private bool _showAll;
+ [ObservableProperty] private string _lastScannedAmiiboId;
+ [ObservableProperty] private ReadOnlyObservableCollection _appsObservableList;
+ [ObservableProperty] private long _lastFullscreenToggle = Environment.TickCount64;
+ [ObservableProperty] private bool _showContent = true;
+ [ObservableProperty] private float _volumeBeforeMute;
+ [ObservableProperty] private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered;
+ [ObservableProperty] private Cursor _cursor;
+ [ObservableProperty] private string _title;
+ [ObservableProperty] private WindowState _windowState;
+ [ObservableProperty] private double _windowWidth;
+ [ObservableProperty] private double _windowHeight;
+ [ObservableProperty] private bool _isActive;
+ [ObservableProperty] private bool _isSubMenuOpen;
+ [ObservableProperty] private ApplicationContextMenu _listAppContextMenu;
+ [ObservableProperty] private ApplicationContextMenu _gridAppContextMenu;
+
+ private bool _showLoadProgress;
+ private bool _isGameRunning;
private bool _isAmiiboRequested;
private bool _isAmiiboBinRequested;
- private bool _showShaderCompilationHint;
- private bool _isGameRunning;
- private bool _isFullScreen;
- private int _progressMaximum;
- private int _progressValue;
- private long _lastFullscreenToggle = Environment.TickCount64;
- private bool _showLoadProgress;
- private bool _showMenuAndStatusBar = true;
- private bool _showStatusSeparator;
- private Brush _progressBarForegroundColor;
- private Brush _progressBarBackgroundColor;
- private Brush _vSyncModeColor;
- private byte[] _selectedIcon;
- private bool _isAppletMenuActive;
- private int _statusBarProgressMaximum;
- private int _statusBarProgressValue;
- private string _statusBarProgressStatusText;
- private bool _statusBarProgressStatusVisible;
- private bool _isPaused;
- private bool _showContent = true;
- private bool _isLoadingIndeterminate = true;
- private bool _showAll;
- private string _lastScannedAmiiboId;
- private bool _statusBarVisible;
- private ReadOnlyObservableCollection _appsObservableList;
-
+ private string _searchText;
+ private Timer _searchTimer;
+ private string _vSyncModeText;
private string _showUiKey = "F4";
private string _pauseKey = "F5";
private string _screenshotKey = "F8";
private float _volume;
- private float _volumeBeforeMute;
- private string _backendText;
-
- private bool _areMimeTypesRegistered = FileAssociationHelper.AreMimeTypesRegistered;
+ private bool _isAppletMenuActive;
+ private bool _statusBarVisible;
private bool _canUpdate = true;
- private Cursor _cursor;
- private string _title;
private ApplicationData _currentApplicationData;
private readonly AutoResetEvent _rendererWaitEvent;
- private WindowState _windowState;
- private double _windowWidth;
- private double _windowHeight;
private int _customVSyncInterval;
private int _customVSyncIntervalPercentageProxy;
-
- private bool _isActive;
- private bool _isSubMenuOpen;
-
private ApplicationData _listSelectedApplication;
private ApplicationData _gridSelectedApplication;
- private ApplicationContextMenu _listAppContextMenu;
- private ApplicationContextMenu _gridAppContextMenu;
-
+
public ApplicationData ListSelectedApplication
{
get => _listSelectedApplication;
@@ -135,10 +132,13 @@ namespace Ryujinx.Ava.UI.ViewModels
{
_listSelectedApplication = value;
+#pragma warning disable MVVMTK0034
if (_listSelectedApplication != null && _listAppContextMenu == null)
+
ListAppContextMenu = new ApplicationContextMenu();
else if (_listSelectedApplication == null && _listAppContextMenu != null)
- ListAppContextMenu = null;
+ ListAppContextMenu = null!;
+#pragma warning restore MVVMTK0034
OnPropertyChanged();
}
@@ -151,10 +151,12 @@ namespace Ryujinx.Ava.UI.ViewModels
{
_gridSelectedApplication = value;
+#pragma warning disable MVVMTK0034
if (_gridSelectedApplication != null && _gridAppContextMenu == null)
GridAppContextMenu = new ApplicationContextMenu();
else if (_gridSelectedApplication == null && _gridAppContextMenu != null)
- GridAppContextMenu = null;
+ GridAppContextMenu = null!;
+#pragma warning restore MVVMTK0034
OnPropertyChanged();
}
@@ -260,71 +262,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public Cursor Cursor
- {
- get => _cursor;
- set
- {
- _cursor = value;
- OnPropertyChanged();
- }
- }
-
- public ReadOnlyObservableCollection AppsObservableList
- {
- get => _appsObservableList;
- set
- {
- _appsObservableList = value;
-
- OnPropertyChanged();
- }
- }
-
- public ApplicationContextMenu ListAppContextMenu
- {
- get => _listAppContextMenu;
- set
- {
- _listAppContextMenu = value;
-
- OnPropertyChanged();
- }
- }
-
- public ApplicationContextMenu GridAppContextMenu
- {
- get => _gridAppContextMenu;
- set
- {
- _gridAppContextMenu = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool IsPaused
- {
- get => _isPaused;
- set
- {
- _isPaused = value;
-
- OnPropertyChanged();
- }
- }
-
- public long LastFullscreenToggle
- {
- get => _lastFullscreenToggle;
- set
- {
- _lastFullscreenToggle = value;
-
- OnPropertyChanged();
- }
- }
-
public bool StatusBarVisible
{
get => _statusBarVisible && EnableNonGameRunningControls;
@@ -340,17 +277,6 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool ShowFirmwareStatus => !ShowLoadProgress;
- public bool ShowShaderCompilationHint
- {
- get => _showShaderCompilationHint;
- set
- {
- _showShaderCompilationHint = value;
-
- OnPropertyChanged();
- }
- }
-
public bool IsGameRunning
{
get => _isGameRunning;
@@ -393,7 +319,7 @@ namespace Ryujinx.Ava.UI.ViewModels
}
public bool CanScanAmiiboBinaries => AmiiboBinReader.HasAmiiboKeyFile;
-
+
public bool ShowLoadProgress
{
get => _showLoadProgress;
@@ -406,61 +332,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public string GameStatusText
- {
- get => _gameStatusText;
- set
- {
- _gameStatusText = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool IsFullScreen
- {
- get => _isFullScreen;
- set
- {
- _isFullScreen = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool IsSubMenuOpen
- {
- get => _isSubMenuOpen;
- set
- {
- _isSubMenuOpen = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool ShowAll
- {
- get => _showAll;
- set
- {
- _showAll = value;
-
- OnPropertyChanged();
- }
- }
-
- public string LastScannedAmiiboId
- {
- get => _lastScannedAmiiboId;
- set
- {
- _lastScannedAmiiboId = value;
-
- OnPropertyChanged();
- }
- }
-
public ApplicationData SelectedApplication
{
get
@@ -482,79 +353,12 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool OpenBcatSaveDirectoryEnabled => SelectedApplication.HasControlHolder && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0;
- public string LoadHeading
+ public bool ShowCustomVSyncIntervalPicker
+ => _isGameRunning && AppHost.Device.VSyncMode == VSyncMode.Custom;
+
+ public void UpdateVSyncIntervalPicker()
{
- get => _loadHeading;
- set
- {
- _loadHeading = value;
-
- OnPropertyChanged();
- }
- }
-
- public string CacheLoadStatus
- {
- get => _cacheLoadStatus;
- set
- {
- _cacheLoadStatus = value;
-
- OnPropertyChanged();
- }
- }
-
- public Brush ProgressBarBackgroundColor
- {
- get => _progressBarBackgroundColor;
- set
- {
- _progressBarBackgroundColor = value;
-
- OnPropertyChanged();
- }
- }
-
- public Brush ProgressBarForegroundColor
- {
- get => _progressBarForegroundColor;
- set
- {
- _progressBarForegroundColor = value;
-
- OnPropertyChanged();
- }
- }
-
- public Brush VSyncModeColor
- {
- get => _vSyncModeColor;
- set
- {
- _vSyncModeColor = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool ShowCustomVSyncIntervalPicker
- {
- get
- {
- if (_isGameRunning)
- {
- return AppHost.Device.VSyncMode ==
- VSyncMode.Custom;
- }
- else
- {
- return false;
- }
- }
- set
- {
- OnPropertyChanged();
- }
+ OnPropertyChanged(nameof(ShowCustomVSyncIntervalPicker));
}
public int CustomVSyncIntervalPercentageProxy
@@ -607,126 +411,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public byte[] SelectedIcon
- {
- get => _selectedIcon;
- set
- {
- _selectedIcon = value;
-
- OnPropertyChanged();
- }
- }
-
- public int ProgressMaximum
- {
- get => _progressMaximum;
- set
- {
- _progressMaximum = value;
-
- OnPropertyChanged();
- }
- }
-
- public int ProgressValue
- {
- get => _progressValue;
- set
- {
- _progressValue = value;
-
- OnPropertyChanged();
- }
- }
-
- public int StatusBarProgressMaximum
- {
- get => _statusBarProgressMaximum;
- set
- {
- _statusBarProgressMaximum = value;
-
- OnPropertyChanged();
- }
- }
-
- public int StatusBarProgressValue
- {
- get => _statusBarProgressValue;
- set
- {
- _statusBarProgressValue = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool StatusBarProgressStatusVisible
- {
- get => _statusBarProgressStatusVisible;
- set
- {
- _statusBarProgressStatusVisible = value;
-
- OnPropertyChanged();
- }
- }
-
- public string StatusBarProgressStatusText
- {
- get => _statusBarProgressStatusText;
- set
- {
- _statusBarProgressStatusText = value;
-
- OnPropertyChanged();
- }
- }
-
- public string FifoStatusText
- {
- get => _fifoStatusText;
- set
- {
- _fifoStatusText = value;
-
- OnPropertyChanged();
- }
- }
-
- public string GpuNameText
- {
- get => _gpuStatusText;
- set
- {
- _gpuStatusText = value;
-
- OnPropertyChanged();
- }
- }
-
- public string ShaderCountText
- {
- get => _shaderCountText;
- set
- {
- _shaderCountText = value;
- OnPropertyChanged();
- }
- }
-
- public string BackendText
- {
- get => _backendText;
- set
- {
- _backendText = value;
-
- OnPropertyChanged();
- }
- }
-
public string VSyncModeText
{
get => _vSyncModeText;
@@ -735,39 +419,7 @@ namespace Ryujinx.Ava.UI.ViewModels
_vSyncModeText = value;
OnPropertyChanged();
- }
- }
-
- public string DockedStatusText
- {
- get => _dockedStatusText;
- set
- {
- _dockedStatusText = value;
-
- OnPropertyChanged();
- }
- }
-
- public string AspectRatioStatusText
- {
- get => _aspectStatusText;
- set
- {
- _aspectStatusText = value;
-
- OnPropertyChanged();
- }
- }
-
- public string VolumeStatusText
- {
- get => _volumeStatusText;
- set
- {
- _volumeStatusText = value;
-
- OnPropertyChanged();
+ OnPropertyChanged(nameof(ShowCustomVSyncIntervalPicker));
}
}
@@ -791,73 +443,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public float VolumeBeforeMute
- {
- get => _volumeBeforeMute;
- set
- {
- _volumeBeforeMute = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool ShowStatusSeparator
- {
- get => _showStatusSeparator;
- set
- {
- _showStatusSeparator = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool ShowMenuAndStatusBar
- {
- get => _showMenuAndStatusBar;
- set
- {
- _showMenuAndStatusBar = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool IsLoadingIndeterminate
- {
- get => _isLoadingIndeterminate;
- set
- {
- _isLoadingIndeterminate = value;
-
- OnPropertyChanged();
- }
- }
-
- public bool IsActive
- {
- get => _isActive;
- set
- {
- _isActive = value;
-
- OnPropertyChanged();
- }
- }
-
-
- public bool ShowContent
- {
- get => _showContent;
- set
- {
- _showContent = value;
-
- OnPropertyChanged();
- }
- }
-
public bool IsAppletMenuActive
{
get => _isAppletMenuActive && EnableNonGameRunningControls;
@@ -869,39 +454,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public WindowState WindowState
- {
- get => _windowState;
- internal set
- {
- _windowState = value;
-
- OnPropertyChanged();
- }
- }
-
- public double WindowWidth
- {
- get => _windowWidth;
- set
- {
- _windowWidth = value;
-
- OnPropertyChanged();
- }
- }
-
- public double WindowHeight
- {
- get => _windowHeight;
- set
- {
- _windowHeight = value;
-
- OnPropertyChanged();
- }
- }
-
public bool IsGrid => Glyph == Glyph.Grid;
public bool IsList => Glyph == Glyph.List;
@@ -945,17 +497,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
}
- public string Title
- {
- get => _title;
- set
- {
- _title = value;
-
- OnPropertyChanged();
- }
- }
-
public bool ShowConsoleVisible
{
get => ConsoleHelper.SetConsoleWindowStateSupported;
@@ -966,27 +507,6 @@ namespace Ryujinx.Ava.UI.ViewModels
get => FileAssociationHelper.IsTypeAssociationSupported;
}
- public bool AreMimeTypesRegistered
- {
- get => _areMimeTypesRegistered;
- set {
- _areMimeTypesRegistered = value;
-
- OnPropertyChanged();
- }
- }
-
- public ObservableCollectionExtended Applications
- {
- get => _applications;
- set
- {
- _applications = value;
-
- OnPropertyChanged();
- }
- }
-
public Glyph Glyph
{
get => (Glyph)ConfigurationState.Instance.UI.GameListViewMode.Value;
@@ -1004,7 +524,8 @@ namespace Ryujinx.Ava.UI.ViewModels
public bool ShowNames
{
- get => ConfigurationState.Instance.UI.ShowNames && ConfigurationState.Instance.UI.GridSize > 1; set
+ get => ConfigurationState.Instance.UI.ShowNames && ConfigurationState.Instance.UI.GridSize > 1;
+ set
{
ConfigurationState.Instance.UI.ShowNames.Value = value;
@@ -1564,8 +1085,6 @@ namespace Ryujinx.Ava.UI.ViewModels
}
VSyncModeText = args.VSyncMode == "Custom" ? "Custom" : "VSync";
- ShowCustomVSyncIntervalPicker =
- args.VSyncMode == VSyncMode.Custom.ToString();
DockedStatusText = args.DockedMode;
AspectRatioStatusText = args.AspectRatio;
GameStatusText = args.GameStatus;