From 22d77f03ff72dca09d12f741f59a548b5e59c5ba Mon Sep 17 00:00:00 2001 From: Luke44565 Date: Tue, 12 Mar 2024 20:57:23 -0400 Subject: [PATCH 01/10] Initial Implementation --- .../App/ApplicationLibrary.cs | 49 +++++++++++++++++- .../Resources/Icon_Folder.png | Bin 0 -> 2091 bytes .../Ryujinx.UI.Common.csproj | 2 + src/Ryujinx/UI/Helpers/Glyph.cs | 1 + src/Ryujinx/UI/Helpers/GlyphValueConverter.cs | 1 + .../UI/ViewModels/MainWindowViewModel.cs | 30 +++++++++++ .../UI/Views/Main/MainViewControls.axaml | 13 +++++ src/Ryujinx/UI/Windows/MainWindow.axaml.cs | 5 ++ 8 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/Ryujinx.UI.Common/Resources/Icon_Folder.png diff --git a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs index 65cf7a9e6d..ccd7070585 100644 --- a/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs +++ b/src/Ryujinx.UI.Common/App/ApplicationLibrary.cs @@ -41,6 +41,7 @@ namespace Ryujinx.UI.App.Common private readonly byte[] _ncaIcon; private readonly byte[] _nroIcon; private readonly byte[] _nsoIcon; + private readonly byte[] _folderIcon; private readonly VirtualFileSystem _virtualFileSystem; private Language _desiredTitleLanguage; @@ -58,6 +59,7 @@ namespace Ryujinx.UI.App.Common _ncaIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NCA.png"); _nroIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NRO.png"); _nsoIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_NSO.png"); + _folderIcon = GetResourceBytes("Ryujinx.UI.Common.Resources.Icon_Folder.png"); } private static byte[] GetResourceBytes(string resourceName) @@ -113,7 +115,31 @@ namespace Ryujinx.UI.App.Common try { - IEnumerable files = Directory.EnumerateFiles(appDir, "*", SearchOption.AllDirectories).Where(file => + IEnumerable folders = Directory.EnumerateDirectories(appDir, "*", SearchOption.TopDirectoryOnly); + foreach (string folder in folders) + { + if (_cancellationToken.Token.IsCancellationRequested) + { + return; + } + + var fileInfo = new FileInfo(folder); + + var fullPath = fileInfo.ResolveLinkTarget(true)?.FullName ?? fileInfo.FullName; + ApplicationData folderData = new() + { + TitleName = fileInfo.Name, + FileExtension = "Folder", + Path = fullPath, + Icon = _folderIcon, + }; + OnApplicationAdded(new ApplicationAddedEventArgs + { + AppData = folderData, + }); + } + + IEnumerable files = Directory.EnumerateFiles(appDir, "*", SearchOption.TopDirectoryOnly).Where(file => { return (Path.GetExtension(file).ToLower() is ".nsp" && ConfigurationState.Instance.UI.ShownFileTypes.NSP.Value) || @@ -163,7 +189,26 @@ namespace Ryujinx.UI.App.Common return; } - long fileSize = new FileInfo(applicationPath).Length; + var fileInfo = new FileInfo(applicationPath); + + if ((fileInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory) + { + Console.WriteLine($"Found directory 2: {fileInfo.Name}"); + ApplicationData folder = new() + { + TitleName = fileInfo.Name, + FileExtension = "Folder", + Developer = "null", + Path = applicationPath, + Icon = _nsoIcon, + }; + OnApplicationAdded(new ApplicationAddedEventArgs + { + AppData = folder, + }); + } + + long fileSize = fileInfo.Length; string titleName = "Unknown"; string titleId = "0000000000000000"; string developer = "Unknown"; diff --git a/src/Ryujinx.UI.Common/Resources/Icon_Folder.png b/src/Ryujinx.UI.Common/Resources/Icon_Folder.png new file mode 100644 index 0000000000000000000000000000000000000000..dba7ff44d74db4fbf1ef51bfee016c55d43d1bd7 GIT binary patch literal 2091 zcmeAS@N?(olHy`uVBq!ia0y~yU}9ikV4TIl%)r3lx0$lbcS-&~sPKP>`2YQ~|94A+xQ7(}Zx{c+SNi{Qw*PB+ z{%;fczgrTdV4uwY!%F{8Y5YH_@&B~O|C8$fPpN~r=fNVURKX$||IaIc#80dLKdAkD0|R@Br>`sf zQ$|@nLq0px#yboQtd~7q978H@y}ixtJULY6z{BPyjTuWLxhF2mP`G8Ac&98;R&VnW zjn}{HryM)_NQ&pit$Y7J|K|Ar`OTi^Z|(-YTCh;s{5Eg@pYwOUUR9ds_4Pcf>uk7J z_WRt8ig&9yUc{E$OP%~H&bas22ma^(dK%(N@^!xFvXtyyIPuPT!3$5*{~zCZUU|Xn zTBCW!jD`09k}Cz27DW61|7|HOu-&>cL1_Uu?{goA2gm<=oMT~$`+so`=Z1eQ5%o+= zW|NE=&;4g%dFyzNh2>q`ITjZ?hQ4$r83xXdTgxqlA22#NT#)FLI#T|9{dvmNb2~gySo^Zhh`%s7Uua`u6BghBfsDjP8tE?)>Yj6Zw6IIWWuX2>EP`Q_I_{dJN?aH@-Jal4oLh_u7oXz2QLZWwr;d32&SoPKqc^zqGwg;P>o?_dJS4 zn_pHtciiEB>F(TdC+62l0j2LsdyQIde0N}A5MbcqPBwp;mJ@sZKDP<%tOVIZP17lG9s>gd6}?G;Ll_kpK!D8fzOtM_j7PDEo56)W zz_8^+C_@LIf~3=vAg}Ia0^5(8HK-qY{s{U1FOMc2@C|-~mO2 zAA$-?S2?<@-Nk;uSRrfm@7M239j=J+G3;P>*~k1Q%(%Pbs@`e%HU18`IP#MrF$|Pngvvv@*?VVsXNPEcNU6 zofWUu4>P z#ba)GsiMxQr|W0wg|jv)>C~&n?#sFxnXqC0->+G_qIy%~`S^3XPxqGat~IgcV*9Y! z{(g+-_3*8cn}vDKsqeqGW|>~dTAeMc&#(4h{eGSQ(#2czopr0MsoQSpWb4 literal 0 HcmV?d00001 diff --git a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj index 387e998b0b..eb84aad61c 100644 --- a/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj +++ b/src/Ryujinx.UI.Common/Ryujinx.UI.Common.csproj @@ -15,6 +15,7 @@ + @@ -33,6 +34,7 @@ + diff --git a/src/Ryujinx/UI/Helpers/Glyph.cs b/src/Ryujinx/UI/Helpers/Glyph.cs index f257dc02c3..d44f0875a8 100644 --- a/src/Ryujinx/UI/Helpers/Glyph.cs +++ b/src/Ryujinx/UI/Helpers/Glyph.cs @@ -4,6 +4,7 @@ namespace Ryujinx.Ava.UI.Helpers { List, Grid, + Back, Chip, } } diff --git a/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs b/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs index 7da23648e1..9731123e97 100644 --- a/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs +++ b/src/Ryujinx/UI/Helpers/GlyphValueConverter.cs @@ -13,6 +13,7 @@ namespace Ryujinx.Ava.UI.Helpers { { Glyph.List, char.ConvertFromUtf32((int)Symbol.List) }, { Glyph.Grid, char.ConvertFromUtf32((int)Symbol.ViewAll) }, + { Glyph.Back, char.ConvertFromUtf32((int)Symbol.Back) }, { Glyph.Chip, char.ConvertFromUtf32(59748) }, }; diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 17bd69b14c..c5de76f5ad 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -51,6 +51,7 @@ namespace Ryujinx.Ava.UI.ViewModels private const int HotKeyPressDelayMs = 500; private ObservableCollection _applications; + private Queue _pathHistory; private string _aspectStatusText; private string _loadHeading; @@ -120,6 +121,7 @@ namespace Ryujinx.Ava.UI.ViewModels .Bind(out _appsObservableList).AsObservableList(); _rendererWaitEvent = new AutoResetEvent(false); + _pathHistory = new Queue(); if (Program.PreviewerDetached) { @@ -1281,6 +1283,34 @@ namespace Ryujinx.Ava.UI.ViewModels ShowConsole = !ShowConsole; } + public void OpenFolder(string path) + { + _pathHistory.Enqueue(path); + Applications.Clear(); + List SearchPaths = new List(); + SearchPaths.Add(path); + ApplicationLibrary.LoadApplications(SearchPaths, ConfigurationState.Instance.System.Language); + } + + public void NavigateBack() + { + if (_pathHistory.Count != 0) + { + string path = _pathHistory.Dequeue(); + Applications.Clear(); + if (_pathHistory.Count == 0) + { + ApplicationLibrary.LoadApplications(ConfigurationState.Instance.UI.GameDirs, ConfigurationState.Instance.System.Language); + } + else + { + List SearchPaths = new List(); + SearchPaths.Add(path); + ApplicationLibrary.LoadApplications(SearchPaths, ConfigurationState.Instance.System.Language); + } + } + } + public void SetListMode() { Glyph = Glyph.List; diff --git a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml index cc21b5c60f..b49aaacc2a 100644 --- a/src/Ryujinx/UI/Views/Main/MainViewControls.axaml +++ b/src/Ryujinx/UI/Views/Main/MainViewControls.axaml @@ -18,6 +18,19 @@ Margin="0,0,0,5" Height="35" HorizontalAlignment="Stretch"> +