diff --git a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs
index fdfb5175c..55f62b753 100644
--- a/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs
+++ b/src/Ryujinx/UI/Applet/AvaHostUIHandler.cs
@@ -6,6 +6,7 @@ using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
+using Ryujinx.Ava.UI.ViewModels.Input;
using Ryujinx.Ava.UI.Windows;
using Ryujinx.Ava.Utilities.Configuration;
using Ryujinx.Common;
@@ -278,9 +279,11 @@ namespace Ryujinx.Ava.UI.Applet
.ForEach(profile => profiles.Add(new Models.UserProfile(profile, nav)));
profiles.Add(new Models.UserProfile(guest, nav));
-
- UserSelectorDialog content = new(profiles);
- (UserId id, _) = await UserSelectorDialog.ShowInputDialog(content, _parent.AccountManager.LastOpenedUser);
+ UserSelectorDialogViewModel ViewModel = new();
+ ViewModel.Profiles = profiles;
+ ViewModel.SelectedUserId = _parent.AccountManager.LastOpenedUser.UserId;
+ UserSelectorDialog content = new(ViewModel);
+ (UserId id, _) = await UserSelectorDialog.ShowInputDialog(content);
selected = id;
diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml
index dcdd8c853..ed22fb088 100644
--- a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml
+++ b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml
@@ -2,27 +2,24 @@
x:Class="Ryujinx.Ava.UI.Applet.UserSelectorDialog"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
- xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
- xmlns:applet="clr-namespace:Ryujinx.Ava.UI.Applet"
d:DesignHeight="450"
MinWidth="500"
d:DesignWidth="800"
mc:Ignorable="d"
Focusable="True"
- x:DataType="applet:UserSelectorDialog">
+ x:DataType="viewModels:UserSelectorDialogViewModel">
-
+
diff --git a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs
index 0a44742e5..6e25588ec 100644
--- a/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs
+++ b/src/Ryujinx/UI/Applet/UserSelectorDialog.axaml.cs
@@ -6,6 +6,7 @@ using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
+using Ryujinx.Ava.UI.ViewModels.Input;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using System.Collections.ObjectModel;
@@ -19,36 +20,15 @@ namespace Ryujinx.Ava.UI.Applet
{
public partial class UserSelectorDialog : UserControl, INotifyPropertyChanged
{
- public new event PropertyChangedEventHandler PropertyChanged;
+ public UserSelectorDialogViewModel ViewModel { get; set; }
- private UserId _selectedUserId;
- private ObservableCollection _profiles;
-
- public ObservableCollection Profiles
- {
- get => _profiles;
- set
- {
- if (_profiles != value)
- {
- _profiles = value;
- OnPropertyChanged();
- }
- }
- }
-
- public UserSelectorDialog(ObservableCollection profiles)
+ public UserSelectorDialog(UserSelectorDialogViewModel viewModel)
{
InitializeComponent();
- Profiles = profiles;
- DataContext = this;
+ ViewModel = viewModel;
+ DataContext = ViewModel;
}
-
- protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
-
+
private void Grid_PointerEntered(object sender, PointerEventArgs e)
{
if (sender is Grid { DataContext: UserProfile profile })
@@ -71,22 +51,22 @@ namespace Ryujinx.Ava.UI.Applet
{
int selectedIndex = listBox.SelectedIndex;
- if (selectedIndex >= 0 && selectedIndex < Profiles.Count)
+ if (selectedIndex >= 0 && selectedIndex < ViewModel.Profiles.Count)
{
- if (Profiles[selectedIndex] is UserProfile userProfile)
+ if (ViewModel.Profiles[selectedIndex] is UserProfile userProfile)
{
- _selectedUserId = userProfile.UserId;
+ ViewModel.SelectedUserId = userProfile.UserId;
Logger.Info?.Print(LogClass.UI, $"Selected user: {userProfile.UserId}");
ObservableCollection newProfiles = [];
- foreach (var item in Profiles)
+ foreach (var item in ViewModel.Profiles)
{
if (item is UserProfile originalItem)
{
var profile = new UserProfileSft(originalItem.UserId, originalItem.Name, originalItem.Image);
- if (profile.UserId == _selectedUserId)
+ if (profile.UserId == ViewModel.SelectedUserId)
{
profile.AccountState = AccountState.Open;
}
@@ -95,16 +75,14 @@ namespace Ryujinx.Ava.UI.Applet
}
}
- Profiles = newProfiles;
+ ViewModel.Profiles = newProfiles;
}
}
}
}
- public static async Task<(UserId Id, bool Result)> ShowInputDialog(UserSelectorDialog content, UserProfileSft accountManagerLastOpenedUser)
+ public static async Task<(UserId Id, bool Result)> ShowInputDialog(UserSelectorDialog content)
{
- content._selectedUserId = accountManagerLastOpenedUser.UserId;
-
ContentDialog contentDialog = new()
{
Title = LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle],
@@ -124,7 +102,7 @@ namespace Ryujinx.Ava.UI.Applet
{
if (contentDialog.Content is UserSelectorDialog view)
{
- result = view._selectedUserId;
+ result = view.ViewModel.SelectedUserId;
input = true;
}
}
diff --git a/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs b/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs
new file mode 100644
index 000000000..29d2663c8
--- /dev/null
+++ b/src/Ryujinx/UI/ViewModels/UserSelectorDialogViewModel.cs
@@ -0,0 +1,43 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+using Ryujinx.HLE.HOS.Services.Account.Acc;
+using System.Collections.ObjectModel;
+
+namespace Ryujinx.Ava.UI.ViewModels
+{
+ public partial class UserSelectorDialogViewModel : BaseModel
+ {
+ private UserId _selectedUserId;
+ private ObservableCollection _profiles;
+
+ public UserId SelectedUserId
+ {
+ get => _selectedUserId;
+ set
+ {
+ if (_selectedUserId != value)
+ {
+ _selectedUserId = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
+ public ObservableCollection Profiles
+ {
+ get => _profiles;
+ set
+ {
+ if (_profiles != value)
+ {
+ _profiles = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
+ public UserSelectorDialogViewModel()
+ {
+ Profiles = new ObservableCollection();
+ }
+ }
+}