diff --git a/Ryujinx.Ava/UI/ViewModels/DownloadableContentManagerViewModel.cs b/Ryujinx.Ava/UI/ViewModels/DownloadableContentManagerViewModel.cs index 8d100f987..96965137c 100644 --- a/Ryujinx.Ava/UI/ViewModels/DownloadableContentManagerViewModel.cs +++ b/Ryujinx.Ava/UI/ViewModels/DownloadableContentManagerViewModel.cs @@ -36,6 +36,16 @@ namespace Ryujinx.Ava.UI.ViewModels private ulong _titleId; private string _titleName; + public AvaloniaList DownloadableContents + { + get => _downloadableContents; + set + { + _downloadableContents = value; + OnPropertyChanged(); + } + } + public DownloadableContentManagerViewModel(VirtualFileSystem virtualFileSystem, ulong titleId, string titleName) { _virtualFileSystem = virtualFileSystem; @@ -187,12 +197,12 @@ namespace Ryujinx.Ava.UI.ViewModels { AvaloniaList removedItems = new(); - foreach (var item in DlcDataGrid.SelectedItems) + /*foreach (var item in DlcDataGrid.SelectedItems) { removedItems.Add(item as DownloadableContentModel); } - DlcDataGrid.SelectedItems.Clear(); + DlcDataGrid.SelectedItems.Clear();*/ foreach (var item in removedItems) { diff --git a/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs b/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs index a4ccac2da..43c47658d 100644 --- a/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs +++ b/Ryujinx.Ava/UI/ViewModels/MainWindowViewModel.cs @@ -5,17 +5,14 @@ using Avalonia.Media; using Avalonia.Threading; using DynamicData; using DynamicData.Binding; -using LibHac.Common; using LibHac.Fs; using LibHac.FsSystem; -using LibHac.Tools.Fs; using Ryujinx.Ava.Common; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Input; using Ryujinx.Ava.UI.Controls; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.Models; -using Ryujinx.Ava.UI.Renderer; using Ryujinx.Ava.UI.Windows; using Ryujinx.Common; using Ryujinx.Common.Configuration; @@ -90,7 +87,7 @@ namespace Ryujinx.Ava.UI.ViewModels private float _volume; private string _backendText; - private bool _canUpdate = true; + private bool _canUpdate; private Cursor _cursor; private string _title; private string _currentEmulatedGamePath; @@ -179,10 +176,11 @@ namespace Ryujinx.Ava.UI.ViewModels public bool CanUpdate { - get => _canUpdate && EnableNonGameRunningControls && Modules.Updater.CanUpdate(false); + get => _canUpdate; set { _canUpdate = value; + OnPropertyChanged(); } } @@ -344,12 +342,6 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public bool EnabledUserSaveDirectory => !Utilities.IsZeros(SelectedApplication.ControlHolder.ByteSpan) && SelectedApplication.ControlHolder.Value.UserAccountSaveDataSize > 0; - - public bool EnabledDeviceSaveDirectory => !Utilities.IsZeros(SelectedApplication.ControlHolder.ByteSpan) && SelectedApplication.ControlHolder.Value.DeviceSaveDataSize > 0; - - public bool EnabledBcatSaveDirectory => !Utilities.IsZeros(SelectedApplication.ControlHolder.ByteSpan) && SelectedApplication.ControlHolder.Value.BcatDeliveryCacheStorageSize > 0; - public string LoadHeading { get => _loadHeading; @@ -683,11 +675,6 @@ namespace Ryujinx.Ava.UI.ViewModels get => ConsoleHelper.SetConsoleWindowStateSupported; } - public bool ManageFileTypesVisible - { - get => FileAssociationHelper.IsTypeAssociationSupported; - } - public ObservableCollection Applications { get => _applications; @@ -746,14 +733,19 @@ namespace Ryujinx.Ava.UI.ViewModels { get { - return ConfigurationState.Instance.Ui.GridSize.Value switch + switch (ConfigurationState.Instance.Ui.GridSize) { - 1 => 78, - 2 => 100, - 3 => 120, - 4 => 140, - _ => 16, - }; + case 1: + return 78; + case 2: + return 100; + case 3: + return 120; + case 4: + return 140; + default: + return 16; + } } } @@ -761,14 +753,19 @@ namespace Ryujinx.Ava.UI.ViewModels { get { - return ConfigurationState.Instance.Ui.GridSize.Value switch + switch (ConfigurationState.Instance.Ui.GridSize) { - 1 => 120, - 2 => ShowNames ? 210 : 150, - 3 => ShowNames ? 240 : 180, - 4 => ShowNames ? 280 : 220, - _ => 16, - }; + case 1: + return 120; + case 2: + return ShowNames ? 210 : 150; + case 3: + return ShowNames ? 240 : 180; + case 4: + return ShowNames ? 280 : 220; + default: + return 16; + } } } @@ -873,7 +870,7 @@ namespace Ryujinx.Ava.UI.ViewModels public Action SwitchToGameControl { get; private set; } public Action SetMainContent { get; private set; } public TopLevel TopLevel { get; private set; } - public RendererHost RendererHostControl { get; private set; } + public RendererHost RendererControl { get; private set; } public bool IsClosing { get; set; } public LibHacHorizonManager LibHacHorizonManager { get; internal set; } public IHostUiHandler UiHandler { get; internal set; } @@ -950,18 +947,20 @@ namespace Ryujinx.Ava.UI.ViewModels if (firmwareVersion == null) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallerFirmwareNotFoundErrorMessage, filename)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareNotFoundErrorMessage], filename)); return; } - string dialogTitle = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallerFirmwareInstallTitle, firmwareVersion.VersionString); - string dialogMessage = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallerFirmwareInstallMessage, firmwareVersion.VersionString); + string dialogTitle = string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallTitle], firmwareVersion.VersionString); SystemVersion currentVersion = ContentManager.GetCurrentFirmwareVersion(); + + string dialogMessage = string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallMessage], firmwareVersion.VersionString); + if (currentVersion != null) { - dialogMessage += LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallerFirmwareInstallSubMessage, currentVersion.VersionString); + dialogMessage += string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallSubMessage], currentVersion.VersionString); } dialogMessage += LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallConfirmMessage]; @@ -994,7 +993,7 @@ namespace Ryujinx.Ava.UI.ViewModels { waitingDialog.Close(); - string message = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogFirmwareInstallerFirmwareInstallSuccessMessage, firmwareVersion.VersionString); + string message = string.Format(LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallSuccessMessage], firmwareVersion.VersionString); await ContentDialogHelper.CreateInfoDialog(dialogTitle, message, LocaleManager.Instance[LocaleKeys.InputDialogOk], "", LocaleManager.Instance[LocaleKeys.RyujinxInfo]); @@ -1064,7 +1063,7 @@ namespace Ryujinx.Ava.UI.ViewModels IsLoadingIndeterminate = false; break; case LoadState.Loaded: - LoadHeading = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.LoadingHeading, TitleName); + LoadHeading = string.Format(LocaleManager.Instance[LocaleKeys.LoadingHeading], TitleName); IsLoadingIndeterminate = true; CacheLoadStatus = ""; break; @@ -1080,7 +1079,7 @@ namespace Ryujinx.Ava.UI.ViewModels IsLoadingIndeterminate = false; break; case ShaderCacheLoadingState.Loaded: - LoadHeading = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.LoadingHeading, TitleName); + LoadHeading = string.Format(LocaleManager.Instance[LocaleKeys.LoadingHeading], TitleName); IsLoadingIndeterminate = true; CacheLoadStatus = ""; break; @@ -1092,27 +1091,35 @@ namespace Ryujinx.Ava.UI.ViewModels })); } + private void OpenSaveDirectory(in SaveDataFilter filter, ApplicationData data, ulong titleId) + { + ApplicationHelper.OpenSaveDir(in filter, titleId, data.ControlHolder, data.TitleName); + } + private async void ExtractLogo() { - if (SelectedApplication != null) + var selection = SelectedApplication; + if (selection != null) { - await ApplicationHelper.ExtractSection(NcaSectionType.Logo, SelectedApplication.Path, SelectedApplication.TitleName); + await ApplicationHelper.ExtractSection(NcaSectionType.Logo, selection.Path); } } private async void ExtractRomFs() { - if (SelectedApplication != null) + var selection = SelectedApplication; + if (selection != null) { - await ApplicationHelper.ExtractSection(NcaSectionType.Data, SelectedApplication.Path, SelectedApplication.TitleName); + await ApplicationHelper.ExtractSection(NcaSectionType.Data, selection.Path); } } private async void ExtractExeFs() { - if (SelectedApplication != null) + var selection = SelectedApplication; + if (selection != null) { - await ApplicationHelper.ExtractSection(NcaSectionType.Code, SelectedApplication.Path, SelectedApplication.TitleName); + await ApplicationHelper.ExtractSection(NcaSectionType.Code, selection.Path); } } @@ -1137,7 +1144,7 @@ namespace Ryujinx.Ava.UI.ViewModels private void InitializeGame() { - RendererHostControl.WindowCreated += RendererHost_Created; + RendererControl.RendererInitialized += GlRenderer_Created; AppHost.StatusUpdatedEvent += Update_StatusBar; AppHost.AppExit += AppHost_AppExit; @@ -1196,7 +1203,7 @@ namespace Ryujinx.Ava.UI.ViewModels } } - private void RendererHost_Created(object sender, EventArgs e) + private void GlRenderer_Created(object sender, EventArgs e) { ShowLoading(false); @@ -1326,15 +1333,10 @@ namespace Ryujinx.Ava.UI.ViewModels } } - public void ChangeLanguage(object languageCode) + public void ChangeLanguage(object obj) { - LocaleManager.Instance.LoadLanguage((string)languageCode); - - if (Program.PreviewerDetached) - { - ConfigurationState.Instance.Ui.LanguageCode.Value = (string)languageCode; - ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath); - } + LocaleManager.Instance.LoadDefaultLanguage(); + LocaleManager.Instance.LoadLanguage((string)obj); } public async void ManageProfiles() @@ -1372,7 +1374,7 @@ namespace Ryujinx.Ava.UI.ViewModels // FIXME: Found a way to reproduce the bold effect on the title name (fork?). UserResult result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance[LocaleKeys.DialogWarning], - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionMessage, selection.TitleName), + string.Format(LocaleManager.Instance[LocaleKeys.DialogPPTCDeletionMessage], selection.TitleName), LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogNo], LocaleManager.Instance[LocaleKeys.RyujinxConfirm]); @@ -1399,7 +1401,7 @@ namespace Ryujinx.Ava.UI.ViewModels } catch (Exception e) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionErrorMessage, file.Name, e)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogPPTCDeletionErrorMessage], file.Name, e)); } } } @@ -1436,7 +1438,7 @@ namespace Ryujinx.Ava.UI.ViewModels // FIXME: Found a way to reproduce the bold effect on the title name (fork?). UserResult result = await ContentDialogHelper.CreateConfirmationDialog(LocaleManager.Instance[LocaleKeys.DialogWarning], - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogShaderDeletionMessage, selection.TitleName), + string.Format(LocaleManager.Instance[LocaleKeys.DialogShaderDeletionMessage], selection.TitleName), LocaleManager.Instance[LocaleKeys.InputDialogYes], LocaleManager.Instance[LocaleKeys.InputDialogNo], LocaleManager.Instance[LocaleKeys.RyujinxConfirm]); @@ -1461,7 +1463,7 @@ namespace Ryujinx.Ava.UI.ViewModels } catch (Exception e) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogPPTCDeletionErrorMessage, directory.Name, e)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.DialogPPTCDeletionErrorMessage], directory.Name, e)); } } } @@ -1474,12 +1476,62 @@ namespace Ryujinx.Ava.UI.ViewModels } catch (Exception e) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.ShaderCachePurgeError, file.Name, e)); + await ContentDialogHelper.CreateErrorDialog(string.Format(LocaleManager.Instance[LocaleKeys.ShaderCachePurgeError], file.Name, e)); } } } } + public void OpenDeviceSaveDirectory() + { + ApplicationData selection = SelectedApplication; + if (selection != null) + { + Task.Run(() => + { + if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) + { + async void Action() + { + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); + } + + Dispatcher.UIThread.Post(Action); + + return; + } + + var saveDataFilter = SaveDataFilter.Make(titleIdNumber, SaveDataType.Device, userId: default, saveDataId: default, index: default); + OpenSaveDirectory(in saveDataFilter, selection, titleIdNumber); + }); + } + } + + public void OpenBcatSaveDirectory() + { + ApplicationData selection = SelectedApplication; + if (selection != null) + { + Task.Run(() => + { + if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) + { + async void Action() + { + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); + } + + Dispatcher.UIThread.Post(Action); + + return; + } + + var saveDataFilter = SaveDataFilter.Make(titleIdNumber, SaveDataType.Bcat, userId: default, saveDataId: default, index: default); + OpenSaveDirectory(in saveDataFilter, selection, titleIdNumber); + }); + } + } + public void ToggleFavorite() { ApplicationData selection = SelectedApplication; @@ -1498,45 +1550,37 @@ namespace Ryujinx.Ava.UI.ViewModels public void OpenUserSaveDirectory() { - OpenSaveDirectory(SaveDataType.Account, userId: new UserId((ulong)AccountManager.LastOpenedUser.UserId.High, (ulong)AccountManager.LastOpenedUser.UserId.Low)); - } - - public void OpenDeviceSaveDirectory() - { - OpenSaveDirectory(SaveDataType.Device, userId: default); - } - - public void OpenBcatSaveDirectory() - { - OpenSaveDirectory(SaveDataType.Bcat, userId: default); - } - - private void OpenSaveDirectory(SaveDataType saveDataType, UserId userId) - { - if (SelectedApplication != null) + ApplicationData selection = SelectedApplication; + if (selection != null) { - if (!ulong.TryParse(SelectedApplication.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) + Task.Run(() => { - Dispatcher.UIThread.InvokeAsync(async () => + if (!ulong.TryParse(selection.TitleId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out ulong titleIdNumber)) { - await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); - }); + async void Action() + { + await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogRyujinxErrorMessage], LocaleManager.Instance[LocaleKeys.DialogInvalidTitleIdErrorMessage]); + } - return; - } + Dispatcher.UIThread.Post(Action); - var saveDataFilter = SaveDataFilter.Make(titleIdNumber, saveDataType, userId, saveDataId: default, index: default); + return; + } - ApplicationHelper.OpenSaveDir(in saveDataFilter, titleIdNumber, SelectedApplication.ControlHolder, SelectedApplication.TitleName); + UserId userId = new((ulong)AccountManager.LastOpenedUser.UserId.High, (ulong)AccountManager.LastOpenedUser.UserId.Low); + SaveDataFilter saveDataFilter = SaveDataFilter.Make(titleIdNumber, saveType: default, userId, saveDataId: default, index: default); + OpenSaveDirectory(in saveDataFilter, selection, titleIdNumber); + }); } } public void OpenModsDirectory() { - if (SelectedApplication != null) + ApplicationData selection = SelectedApplication; + if (selection != null) { string modsBasePath = VirtualFileSystem.ModLoader.GetModsBasePath(); - string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(modsBasePath, SelectedApplication.TitleId); + string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(modsBasePath, selection.TitleId); OpenHelper.OpenFolder(titleModsPath); } @@ -1544,10 +1588,12 @@ namespace Ryujinx.Ava.UI.ViewModels public void OpenSdModsDirectory() { - if (SelectedApplication != null) + ApplicationData selection = SelectedApplication; + + if (selection != null) { string sdModsBasePath = VirtualFileSystem.ModLoader.GetSdModsBasePath(); - string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(sdModsBasePath, SelectedApplication.TitleId); + string titleModsPath = VirtualFileSystem.ModLoader.GetTitleDir(sdModsBasePath, selection.TitleId); OpenHelper.OpenFolder(titleModsPath); } @@ -1563,17 +1609,25 @@ namespace Ryujinx.Ava.UI.ViewModels public async void OpenDownloadableContentManager() { - if (SelectedApplication != null) + ApplicationData selection = SelectedApplication; + if (selection != null) { - await new DownloadableContentManagerWindow(VirtualFileSystem, ulong.Parse(SelectedApplication.TitleId, NumberStyles.HexNumber), SelectedApplication.TitleName).ShowDialog(TopLevel as Window); + if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + await DownloadableContentManagerWindow.Show(VirtualFileSystem, ulong.Parse(selection.TitleId, NumberStyles.HexNumber), selection.TitleName); + } } } public async void OpenCheatManager() { - if (SelectedApplication != null) + ApplicationData selection = SelectedApplication; + if (selection != null) { - await new CheatWindow(VirtualFileSystem, SelectedApplication.TitleId, SelectedApplication.TitleName).ShowDialog(TopLevel as Window); + if (Avalonia.Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + await new CheatWindow(VirtualFileSystem, selection.TitleId, selection.TitleName).ShowDialog(desktop.MainWindow); + } } } @@ -1587,7 +1641,7 @@ namespace Ryujinx.Ava.UI.ViewModels StatusBarProgressMaximum = 0; StatusBarProgressValue = 0; - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarGamesLoaded, 0, 0); + LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarGamesLoaded, 0, 0); }); ReloadGameList?.Invoke(); @@ -1677,10 +1731,18 @@ namespace Ryujinx.Ava.UI.ViewModels PrepareLoadScreen(); - RendererHostControl = new RendererHost(); + RendererControl = new RendererHost(ConfigurationState.Instance.Logger.GraphicsDebugLevel); + if (ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.OpenGl) + { + RendererControl.CreateOpenGL(); + } + else + { + RendererControl.CreateVulkan(); + } AppHost = new AppHost( - RendererHostControl, + RendererControl, InputManager, path, VirtualFileSystem, @@ -1701,14 +1763,8 @@ namespace Ryujinx.Ava.UI.ViewModels } CanUpdate = false; - - LoadHeading = TitleName = titleName; - - if (string.IsNullOrWhiteSpace(titleName)) - { - LoadHeading = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.LoadingHeading, AppHost.Device.Application.TitleName); - TitleName = AppHost.Device.Application.TitleName; - } + LoadHeading = string.IsNullOrWhiteSpace(titleName) ? string.Format(LocaleManager.Instance[LocaleKeys.LoadingHeading], AppHost.Device.Application.TitleName) : titleName; + TitleName = string.IsNullOrWhiteSpace(titleName) ? AppHost.Device.Application.TitleName : titleName; SwitchToRenderer(startFullscreen); @@ -1727,9 +1783,9 @@ namespace Ryujinx.Ava.UI.ViewModels { SwitchToGameControl(startFullscreen); - SetMainContent(RendererHostControl); + SetMainContent(RendererControl); - RendererHostControl.Focus(); + RendererControl.Focus(); }); } @@ -1759,13 +1815,14 @@ namespace Ryujinx.Ava.UI.ViewModels if (version != null) { - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarSystemVersion, version.VersionString); + LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarSystemVersion, + version.VersionString); hasApplet = version.Major > 3; } else { - LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.StatusBarSystemVersion, "0.0"); + LocaleManager.Instance.UpdateDynamicValue(LocaleKeys.StatusBarSystemVersion, "0.0"); } IsAppletMenuActive = hasApplet; @@ -1796,8 +1853,8 @@ namespace Ryujinx.Ava.UI.ViewModels HandleRelaunch(); }); - RendererHostControl.WindowCreated -= RendererHost_Created; - RendererHostControl = null; + RendererControl.RendererInitialized -= GlRenderer_Created; + RendererControl = null; SelectedIcon = null; diff --git a/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml b/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml index 9549ba77b..293b7d662 100644 --- a/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml +++ b/Ryujinx.Ava/UI/Windows/DownloadableContentManagerWindow.axaml @@ -6,30 +6,18 @@ xmlns:locale="clr-namespace:Ryujinx.Ava.Common.Locale" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels" - Width="800" - Height="500" + xmlns:models="clr-namespace:Ryujinx.Ava.UI.Models" + Width="500" + Height="300" mc:Ignorable="d" x:CompileBindings="True" x:DataType="viewModels:DownloadableContentManagerViewModel" Focusable="True"> - + - - - - - - - - - - - - + Items="{Binding DownloadableContents}" + SelectionMode="Extended"> - + + - - + - - + + - - + + \ No newline at end of file