From 9f57747c57a6d20f3e0787fae744ae97aeeae4af Mon Sep 17 00:00:00 2001
From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>
Date: Thu, 12 Jan 2023 07:23:24 -0500
Subject: [PATCH] Ava UI: Various Fixes (#4268)

* Fix saves disappearing

* Better size formatter

* Move TextBox alignment fix to Styles

* Fix bug

* Left align

* Add border

* Update Ryujinx.Ava/UI/Models/SaveModel.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Update Ryujinx.Ava/UI/Models/SaveModel.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Update Ryujinx.Ava/UI/Models/SaveModel.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Whitespace

Co-authored-by: Ac_K <Acoustik666@gmail.com>
---
 Ryujinx.Ava/Assets/Styles/Styles.xaml         |  3 ++
 Ryujinx.Ava/UI/Models/SaveModel.cs            | 31 +++++++++++++------
 .../UI/ViewModels/UserSaveManagerViewModel.cs |  6 ++--
 .../UI/Views/Main/MainViewControls.axaml      |  1 -
 .../UI/Views/User/UserSaveManagerView.axaml   | 12 +++++++
 .../Views/User/UserSaveManagerView.axaml.cs   |  7 ++---
 6 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/Ryujinx.Ava/Assets/Styles/Styles.xaml b/Ryujinx.Ava/Assets/Styles/Styles.xaml
index 04412bf2e3..681b4feaf4 100644
--- a/Ryujinx.Ava/Assets/Styles/Styles.xaml
+++ b/Ryujinx.Ava/Assets/Styles/Styles.xaml
@@ -234,6 +234,9 @@
         <Setter Property="BorderBrush" Value="{DynamicResource MenuFlyoutPresenterBorderBrush}" />
         <Setter Property="BorderThickness" Value="{DynamicResource MenuFlyoutPresenterBorderThemeThickness}" />
     </Style>
+    <Style Selector="TextBox">
+        <Setter Property="VerticalContentAlignment" Value="Center" />
+    </Style>
     <Style Selector="TextBox.NumberBoxTextBoxStyle">
         <Setter Property="Foreground" Value="{DynamicResource ThemeForegroundColor}" />
     </Style>
diff --git a/Ryujinx.Ava/UI/Models/SaveModel.cs b/Ryujinx.Ava/UI/Models/SaveModel.cs
index 7096f9d794..ab919c88d5 100644
--- a/Ryujinx.Ava/UI/Models/SaveModel.cs
+++ b/Ryujinx.Ava/UI/Models/SaveModel.cs
@@ -1,13 +1,9 @@
-using LibHac;
 using LibHac.Fs;
-using LibHac.Fs.Shim;
 using LibHac.Ncm;
-using Ryujinx.Ava.Common;
-using Ryujinx.Ava.Common.Locale;
-using Ryujinx.Ava.UI.Helpers;
 using Ryujinx.Ava.UI.ViewModels;
 using Ryujinx.Ava.UI.Windows;
 using Ryujinx.HLE.FileSystem;
+using System;
 using System.IO;
 using System.Linq;
 using System.Threading.Tasks;
@@ -16,7 +12,6 @@ namespace Ryujinx.Ava.UI.Models
 {
     public class SaveModel : BaseModel
     {
-        private readonly HorizonClient _horizonClient;
         private long _size;
 
         public ulong SaveId { get; }
@@ -41,11 +36,29 @@ namespace Ryujinx.Ava.UI.Models
 
         public bool SizeAvailable { get; set; }
 
-        public string SizeString => $"{((float)_size * 0.000000954):0.###}MB";
+        public string SizeString => GetSizeString();
 
-        public SaveModel(SaveDataInfo info, HorizonClient horizonClient, VirtualFileSystem virtualFileSystem)
+        private string GetSizeString()
+        {
+            const int scale = 1024;
+            string[] orders = { "GiB", "MiB", "KiB" };
+            long max = (long)Math.Pow(scale, orders.Length);
+
+            foreach (string order in orders)
+            {
+                if (Size > max)
+                {
+                    return $"{decimal.Divide(Size, max):##.##} {order}";
+                }
+
+                max /= scale;
+            }
+
+            return "0 KiB";
+        }
+
+        public SaveModel(SaveDataInfo info, VirtualFileSystem virtualFileSystem)
         {
-            _horizonClient = horizonClient;
             SaveId = info.SaveDataId;
             TitleId = info.ProgramId;
             UserId = info.UserId;
diff --git a/Ryujinx.Ava/UI/ViewModels/UserSaveManagerViewModel.cs b/Ryujinx.Ava/UI/ViewModels/UserSaveManagerViewModel.cs
index bd37435084..dad74230f6 100644
--- a/Ryujinx.Ava/UI/ViewModels/UserSaveManagerViewModel.cs
+++ b/Ryujinx.Ava/UI/ViewModels/UserSaveManagerViewModel.cs
@@ -13,8 +13,8 @@ namespace Ryujinx.Ava.UI.ViewModels
         private int _sortIndex;
         private int _orderIndex;
         private string _search;
-        private ObservableCollection<SaveModel> _saves;
-        private ObservableCollection<SaveModel> _views;
+        private ObservableCollection<SaveModel> _saves = new();
+        private ObservableCollection<SaveModel> _views = new();
         private AccountManager _accountManager;
 
         public string SaveManagerHeading =>
@@ -77,8 +77,6 @@ namespace Ryujinx.Ava.UI.ViewModels
         public UserSaveManagerViewModel(AccountManager accountManager)
         {
             _accountManager = accountManager;
-            _saves = new ObservableCollection<SaveModel>();
-            _views = new ObservableCollection<SaveModel>();
         }
 
         public void Sort()
diff --git a/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml b/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml
index e83a650462..ac8ede7ae5 100644
--- a/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml
+++ b/Ryujinx.Ava/UI/Views/Main/MainViewControls.axaml
@@ -74,7 +74,6 @@
             Margin="5,0,5,0"
             HorizontalAlignment="Right"
             VerticalAlignment="Center"
-            VerticalContentAlignment="Center"
             DockPanel.Dock="Right"
             KeyUp="SearchBox_OnKeyUp"
             Text="{Binding SearchText}"
diff --git a/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml b/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml
index cdf74d52f1..b4f2e1014e 100644
--- a/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml
+++ b/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml
@@ -55,6 +55,11 @@
                             HorizontalContentAlignment="Left"
                             Content="{locale:Locale Size}" />
                     </ComboBoxItem>
+                    <ComboBox.Styles>
+                        <Style Selector="ContentControl#ContentPresenter">
+                            <Setter Property="HorizontalAlignment" Value="Left" />
+                        </Style>
+                    </ComboBox.Styles>
                 </ComboBox>
                 <ComboBox SelectedIndex="{Binding OrderIndex}" Width="150">
                     <ComboBoxItem>
@@ -69,6 +74,11 @@
                             HorizontalContentAlignment="Left"
                             Content="{locale:Locale OrderDescending}" />
                     </ComboBoxItem>
+                    <ComboBox.Styles>
+                        <Style Selector="ContentControl#ContentPresenter">
+                            <Setter Property="HorizontalAlignment" Value="Left" />
+                        </Style>
+                    </ComboBox.Styles>
                 </ComboBox>
             </StackPanel>
             <Grid
@@ -122,6 +132,8 @@
                                     Height="42"
                                     Width="42"
                                     Padding="10"
+                                    BorderBrush="{DynamicResource AppListHoverBackgroundColor}"
+                                    BorderThickness="1"
                                     IsVisible="{Binding !InGameList}">
                                     <ui:SymbolIcon
                                         Symbol="Help"
diff --git a/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs b/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs
index 9d955326f7..074ca30e9b 100644
--- a/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs
+++ b/Ryujinx.Ava/UI/Views/User/UserSaveManagerView.axaml.cs
@@ -94,7 +94,7 @@ namespace Ryujinx.Ava.UI.Views.User
                     var save = saveDataInfo[i];
                     if (save.ProgramId.Value != 0)
                     {
-                        var saveModel = new SaveModel(save, _horizonClient, _virtualFileSystem);
+                        var saveModel = new SaveModel(save, _virtualFileSystem);
                         saves.Add(saveModel);
                     }
                 }
@@ -137,10 +137,9 @@ namespace Ryujinx.Ava.UI.Views.User
                     if (result == UserResult.Yes)
                     {
                         _horizonClient.Fs.DeleteSaveData(SaveDataSpaceId.User, saveModel.SaveId);
+                        ViewModel.Saves.Remove(saveModel);
+                        ViewModel.Sort();
                     }
-
-                    ViewModel.Saves.Remove(saveModel);
-                    ViewModel.Views.Remove(saveModel);
                 }
             }
         }