From 934b5a64e5638ae5228acb52faf48efadefdea8d Mon Sep 17 00:00:00 2001 From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> Date: Wed, 11 Jan 2023 00:20:19 -0500 Subject: Ava GUI: User Profile Manager + Other Fixes (#4166) * Fix redundancies * Add back elses * Loading Screen fixes * Redesign User Profile Manager - Backported long selection bar in Grid/List view not working - Backported UserSelector is jank * Fix SelectionIndicator * Fix DataType * Fix SaveManager bug * Remove debug log * Load saves on UIThread * Reduce UI thread blocking * Fix locale keys * Use block namespaces * Fix close button width * Make UserProfile ordering consistent * Alphabetical order * Adjust layout, remove green circle for blue selector * Fix some inconsistencies * Fix no inital selected profile * Adjust appearance of edit button * Adjust SaveManager * Remove redundant warning dialog * Make firmware avatar selector clearer * View redesign again :hero_depressed: * Consistency adjustments * Adjust margins * Make `UserProfileImageSelector` consistent * Make `UserFirmwareAvatarSelector` consistent * Fix long grid view selector * Switch case * Remove long selection bar Handled in #4178 * Consistency * Started dialog titles * Fixes * Remaining titles * Update Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml Co-authored-by: Mary-nyan * Fix build * Hide UserRecoverer if no LostProfiles are found * UserEditor Avatar Placeholder * Watermark + locale adjustment * Border radius * Remove unnecessary styles * Fix firmware avatar image order * Cleanup `ColorPickerButton` * Make `UserId` copy/paste able * Make `FirmwareAvatarSelector` 6 images wide * Make selection bar better * Unsaved changes dialogue * Fix indentation * Remove extra check * Address suggestions * Reorganise - Remove unused views - Rename views to match convention - Fix weird namespacing * Update Ryujinx.Ava/UI/Views/User/UserFirmwareAvatarSelectorView.axaml Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Views/User/UserFirmwareAvatarSelectorView.axaml Co-authored-by: Ac_K * UserRecovererView empty placeholder * Update Ryujinx.Ava/UI/Views/User/UserSelectorView.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Views/User/UserRecovererView.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Views/User/UserFirmwareAvatarSelectorView.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/ViewModels/UserFirmwareAvatarSelectorViewModel.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Models/UserProfile.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs Co-authored-by: Ac_K * Update Ryujinx.Ava/UI/Controls/NavigationDialogHost.axaml.cs Co-authored-by: Ac_K * Remove AddModel * Update Ryujinx.Ava/Assets/Locales/en_US.json Co-authored-by: Ac_K * Fix bug Co-authored-by: Mary-nyan Co-authored-by: Ac_K --- Ryujinx.Ava/UI/Models/ProfileImageModel.cs | 20 +++++++++++++- Ryujinx.Ava/UI/Models/SaveModel.cs | 24 ----------------- Ryujinx.Ava/UI/Models/TempProfile.cs | 9 ++++--- Ryujinx.Ava/UI/Models/UserProfile.cs | 42 +++++++++++++++++++++++++++--- 4 files changed, 63 insertions(+), 32 deletions(-) (limited to 'Ryujinx.Ava/UI/Models') diff --git a/Ryujinx.Ava/UI/Models/ProfileImageModel.cs b/Ryujinx.Ava/UI/Models/ProfileImageModel.cs index 63da7b44..8aa19400 100644 --- a/Ryujinx.Ava/UI/Models/ProfileImageModel.cs +++ b/Ryujinx.Ava/UI/Models/ProfileImageModel.cs @@ -1,6 +1,9 @@ +using Avalonia.Media; +using Ryujinx.Ava.UI.ViewModels; + namespace Ryujinx.Ava.UI.Models { - public class ProfileImageModel + public class ProfileImageModel : BaseModel { public ProfileImageModel(string name, byte[] data) { @@ -10,5 +13,20 @@ namespace Ryujinx.Ava.UI.Models public string Name { get; set; } public byte[] Data { get; set; } + + private SolidColorBrush _backgroundColor = new(Colors.White); + + public SolidColorBrush BackgroundColor + { + get + { + return _backgroundColor; + } + set + { + _backgroundColor = value; + OnPropertyChanged(); + } + } } } \ No newline at end of file diff --git a/Ryujinx.Ava/UI/Models/SaveModel.cs b/Ryujinx.Ava/UI/Models/SaveModel.cs index 3c20741f..7096f9d7 100644 --- a/Ryujinx.Ava/UI/Models/SaveModel.cs +++ b/Ryujinx.Ava/UI/Models/SaveModel.cs @@ -4,13 +4,10 @@ using LibHac.Fs.Shim; using LibHac.Ncm; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; -using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Ava.UI.Windows; using Ryujinx.HLE.FileSystem; -using Ryujinx.Ui.App.Common; -using System; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -22,7 +19,6 @@ namespace Ryujinx.Ava.UI.Models private readonly HorizonClient _horizonClient; private long _size; - public Action DeleteAction { get; set; } public ulong SaveId { get; } public ProgramId TitleId { get; } public string TitleIdString => $"{TitleId.Value:X16}"; @@ -99,25 +95,5 @@ namespace Ryujinx.Ava.UI.Models }); } - - public void OpenLocation() - { - ApplicationHelper.OpenSaveDir(SaveId); - } - - public async void Delete() - { - var result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance[LocaleKeys.DeleteUserSave], - LocaleManager.Instance[LocaleKeys.IrreversibleActionNote], - LocaleManager.Instance[LocaleKeys.InputDialogYes], - LocaleManager.Instance[LocaleKeys.InputDialogNo], ""); - - if (result == UserResult.Yes) - { - _horizonClient.Fs.DeleteSaveData(SaveDataSpaceId.User, SaveId); - - DeleteAction?.Invoke(); - } - } } } \ No newline at end of file diff --git a/Ryujinx.Ava/UI/Models/TempProfile.cs b/Ryujinx.Ava/UI/Models/TempProfile.cs index 2dd7a6c8..05e16632 100644 --- a/Ryujinx.Ava/UI/Models/TempProfile.cs +++ b/Ryujinx.Ava/UI/Models/TempProfile.cs @@ -7,10 +7,12 @@ namespace Ryujinx.Ava.UI.Models public class TempProfile : BaseModel { private readonly UserProfile _profile; - private byte[] _image = null; + private byte[] _image; private string _name = String.Empty; private UserId _userId; + public uint MaxProfileNameLength => 0x20; + public byte[] Image { get => _image; @@ -28,9 +30,12 @@ namespace Ryujinx.Ava.UI.Models { _userId = value; OnPropertyChanged(); + OnPropertyChanged(nameof(UserIdString)); } } + public string UserIdString => _userId.ToString(); + public string Name { get => _name; @@ -52,7 +57,5 @@ namespace Ryujinx.Ava.UI.Models UserId = profile.UserId; } } - - public TempProfile(){} } } \ No newline at end of file diff --git a/Ryujinx.Ava/UI/Models/UserProfile.cs b/Ryujinx.Ava/UI/Models/UserProfile.cs index 869db661..e7cd5300 100644 --- a/Ryujinx.Ava/UI/Models/UserProfile.cs +++ b/Ryujinx.Ava/UI/Models/UserProfile.cs @@ -1,5 +1,7 @@ +using Avalonia.Media; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.ViewModels; +using Ryujinx.Ava.UI.Views.User; using Ryujinx.HLE.HOS.Services.Account.Acc; using Profile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile; @@ -12,6 +14,8 @@ namespace Ryujinx.Ava.UI.Models private byte[] _image; private string _name; private UserId _userId; + private bool _isPointerOver; + private IBrush _backgroundColor; public byte[] Image { @@ -43,27 +47,57 @@ namespace Ryujinx.Ava.UI.Models } } + public bool IsPointerOver + { + get => _isPointerOver; + set + { + _isPointerOver = value; + OnPropertyChanged(); + } + } + + public IBrush BackgroundColor + { + get => _backgroundColor; + set + { + _backgroundColor = value; + OnPropertyChanged(); + } + } + public UserProfile(Profile profile, NavigationDialogHost owner) { _profile = profile; _owner = owner; + UpdateBackground(); + Image = profile.Image; Name = profile.Name; UserId = profile.UserId; } - public bool IsOpened => _profile.AccountState == AccountState.Open; - public void UpdateState() { - OnPropertyChanged(nameof(IsOpened)); + UpdateBackground(); OnPropertyChanged(nameof(Name)); } + private void UpdateBackground() + { + Avalonia.Application.Current.Styles.TryGetResource("ControlFillColorSecondary", out object color); + + if (color is not null) + { + BackgroundColor = _profile.AccountState == AccountState.Open ? new SolidColorBrush((Color)color) : Brushes.Transparent; + } + } + public void Recover(UserProfile userProfile) { - _owner.Navigate(typeof(UserEditor), (_owner, userProfile, true)); + _owner.Navigate(typeof(UserEditorView), (_owner, userProfile, true)); } } } \ No newline at end of file -- cgit v1.2.3