aboutsummaryrefslogblamecommitdiff
path: root/src/Ryujinx/UI/Views/User/UserEditorView.axaml.cs
blob: 588fa471ef4a7bcc8c9adf23b6b1058ae3efb2cf (plain) (tree)
1
2
3
4
5
6
7
8
9




                                   
                              
                             
                            
                                           
                                                      
 
                                   
 
                                                     




                                                    
                                                        
                                                                                   
 
                               













                                                         

                                                                                                                                             
                                                                
 
                                         

                              
                                                                                                                           
                                                                                                                                                                                          
 

                                                        
                                                            
                                                     






                                                   

             
                                                                             
         
































                                                                                                          
         




                                                                         
                                                      

                                                            
                                                                                                                                                  
 
                       


                                          
                                                                                               
 

                       
                                                







                                                                                     
                                                                                                        









                                        
                                                                                           








                                                                                
 
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Interactivity;
using FluentAvalonia.UI.Controls;
using FluentAvalonia.UI.Navigation;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.Models;
using Ryujinx.HLE.HOS.Services.Account.Acc;
using System;
using UserProfile = Ryujinx.Ava.UI.Models.UserProfile;

namespace Ryujinx.Ava.UI.Views.User
{
    public partial class UserEditorView : UserControl
    {
        private NavigationDialogHost _parent;
        private UserProfile _profile;
        private bool _isNewUser;

        public TempProfile TempProfile { get; set; }
        public static uint MaxProfileNameLength => 0x20;
        public bool IsDeletable => _profile.UserId != AccountManager.DefaultUserId;

        public UserEditorView()
        {
            InitializeComponent();
            AddHandler(Frame.NavigatedToEvent, (s, e) =>
            {
                NavigatedTo(e);
            }, RoutingStrategies.Direct);
        }

        private void NavigatedTo(NavigationEventArgs arg)
        {
            if (Program.PreviewerDetached)
            {
                switch (arg.NavigationMode)
                {
                    case NavigationMode.New:
                        var (parent, profile, isNewUser) = ((NavigationDialogHost parent, UserProfile profile, bool isNewUser))arg.Parameter;
                        _isNewUser = isNewUser;
                        _profile = profile;
                        TempProfile = new TempProfile(_profile);

                        _parent = parent;
                        break;
                }

                ((ContentDialog)_parent.Parent).Title = $"{LocaleManager.Instance[LocaleKeys.UserProfileWindowTitle]} - " +
                                                        $"{(_isNewUser ? LocaleManager.Instance[LocaleKeys.UserEditorTitleCreate] : LocaleManager.Instance[LocaleKeys.UserEditorTitle])}";

                DataContext = TempProfile;

                AddPictureButton.IsVisible = _isNewUser;
                ChangePictureButton.IsVisible = !_isNewUser;
                IdLabel.IsVisible = _profile != null;
                IdText.IsVisible = _profile != null;
                if (!_isNewUser && IsDeletable)
                {
                    DeleteButton.IsVisible = true;
                }
                else
                {
                    DeleteButton.IsVisible = false;
                }
            }
        }

        private async void BackButton_Click(object sender, RoutedEventArgs e)
        {
            if (_isNewUser)
            {
                if (TempProfile.Name != String.Empty || TempProfile.Image != null)
                {
                    if (await ContentDialogHelper.CreateChoiceDialog(
                            LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle],
                            LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesMessage],
                            LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesSubMessage]))
                    {
                        _parent?.GoBack();
                    }
                }
                else
                {
                    _parent?.GoBack();
                }
            }
            else
            {
                if (_profile.Name != TempProfile.Name || _profile.Image != TempProfile.Image)
                {
                    if (await ContentDialogHelper.CreateChoiceDialog(
                            LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesTitle],
                            LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesMessage],
                            LocaleManager.Instance[LocaleKeys.DialogUserProfileUnsavedChangesSubMessage]))
                    {
                        _parent?.GoBack();
                    }
                }
                else
                {
                    _parent?.GoBack();
                }
            }
        }

        private void DeleteButton_Click(object sender, RoutedEventArgs e)
        {
            _parent.DeleteUser(_profile);
        }

        private void SaveButton_Click(object sender, RoutedEventArgs e)
        {
            DataValidationErrors.ClearErrors(NameBox);

            if (string.IsNullOrWhiteSpace(TempProfile.Name))
            {
                DataValidationErrors.SetError(NameBox, new DataValidationException(LocaleManager.Instance[LocaleKeys.UserProfileEmptyNameError]));

                return;
            }

            if (TempProfile.Image == null)
            {
                _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, TempProfile));

                return;
            }

            if (_profile != null && !_isNewUser)
            {
                _profile.Name = TempProfile.Name;
                _profile.Image = TempProfile.Image;
                _profile.UpdateState();
                _parent.AccountManager.SetUserName(_profile.UserId, _profile.Name);
                _parent.AccountManager.SetUserImage(_profile.UserId, _profile.Image);
            }
            else if (_isNewUser)
            {
                _parent.AccountManager.AddUser(TempProfile.Name, TempProfile.Image, TempProfile.UserId);
            }
            else
            {
                return;
            }

            _parent?.GoBack();
        }

        public void SelectProfileImage()
        {
            _parent.Navigate(typeof(UserProfileImageSelectorView), (_parent, TempProfile));
        }

        private void ChangePictureButton_Click(object sender, RoutedEventArgs e)
        {
            if (_profile != null || _isNewUser)
            {
                SelectProfileImage();
            }
        }
    }
}