Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
baf8752e74 | ||
|
d5e4378aea | ||
|
6dbcdfea47 | ||
|
c5258cf082 |
@@ -13,7 +13,7 @@
|
|||||||
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
||||||
<PackageVersion Include="Concentus" Version="1.1.7" />
|
<PackageVersion Include="Concentus" Version="1.1.7" />
|
||||||
<PackageVersion Include="DiscordRichPresence" Version="1.1.3.18" />
|
<PackageVersion Include="DiscordRichPresence" Version="1.1.3.18" />
|
||||||
<PackageVersion Include="DynamicData" Version="7.13.1" />
|
<PackageVersion Include="DynamicData" Version="7.13.5" />
|
||||||
<PackageVersion Include="FluentAvaloniaUI" Version="1.4.5" />
|
<PackageVersion Include="FluentAvaloniaUI" Version="1.4.5" />
|
||||||
<PackageVersion Include="GtkSharp.Dependencies" Version="1.1.1" />
|
<PackageVersion Include="GtkSharp.Dependencies" Version="1.1.1" />
|
||||||
<PackageVersion Include="GtkSharp.Dependencies.osx" Version="0.0.5" />
|
<PackageVersion Include="GtkSharp.Dependencies.osx" Version="0.0.5" />
|
||||||
|
@@ -429,6 +429,7 @@
|
|||||||
"DlcManagerEnableAllButton": "Enable All",
|
"DlcManagerEnableAllButton": "Enable All",
|
||||||
"DlcManagerDisableAllButton": "Disable All",
|
"DlcManagerDisableAllButton": "Disable All",
|
||||||
"MenuBarOptionsChangeLanguage": "Change Language",
|
"MenuBarOptionsChangeLanguage": "Change Language",
|
||||||
|
"MenuBarShowFileTypes": "Show File Types",
|
||||||
"CommonSort": "Sort",
|
"CommonSort": "Sort",
|
||||||
"CommonShowNames": "Show Names",
|
"CommonShowNames": "Show Names",
|
||||||
"CommonFavorite": "Favorite",
|
"CommonFavorite": "Favorite",
|
||||||
|
@@ -13,6 +13,7 @@ using LibHac.Tools.Fs;
|
|||||||
using LibHac.Tools.FsSystem;
|
using LibHac.Tools.FsSystem;
|
||||||
using LibHac.Tools.FsSystem.NcaUtils;
|
using LibHac.Tools.FsSystem.NcaUtils;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
|
using Ryujinx.Ava.UI.Controls;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.Windows;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
@@ -152,24 +153,16 @@ namespace Ryujinx.Ava.Common
|
|||||||
string destination = await folderDialog.ShowAsync(_owner);
|
string destination = await folderDialog.ShowAsync(_owner);
|
||||||
var cancellationToken = new CancellationTokenSource();
|
var cancellationToken = new CancellationTokenSource();
|
||||||
|
|
||||||
|
UpdateWaitWindow waitingDialog = new(
|
||||||
|
LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle],
|
||||||
|
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, ncaSectionType, Path.GetFileName(titleFilePath)),
|
||||||
|
cancellationToken);
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(destination))
|
if (!string.IsNullOrWhiteSpace(destination))
|
||||||
{
|
{
|
||||||
Thread extractorThread = new(() =>
|
Thread extractorThread = new(() =>
|
||||||
{
|
{
|
||||||
Dispatcher.UIThread.Post(async () =>
|
Dispatcher.UIThread.Post(waitingDialog.Show);
|
||||||
{
|
|
||||||
UserResult result = await ContentDialogHelper.CreateConfirmationDialog(
|
|
||||||
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogNcaExtractionMessage, ncaSectionType, Path.GetFileName(titleFilePath)),
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
LocaleManager.Instance[LocaleKeys.InputDialogCancel],
|
|
||||||
LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle]);
|
|
||||||
|
|
||||||
if (result == UserResult.Cancel)
|
|
||||||
{
|
|
||||||
cancellationToken.Cancel();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
using FileStream file = new(titleFilePath, FileMode.Open, FileAccess.Read);
|
using FileStream file = new(titleFilePath, FileMode.Open, FileAccess.Read);
|
||||||
|
|
||||||
@@ -222,6 +215,8 @@ namespace Ryujinx.Ava.Common
|
|||||||
|
|
||||||
Dispatcher.UIThread.InvokeAsync(async () =>
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
|
waitingDialog.Close();
|
||||||
|
|
||||||
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionMainNcaNotFoundErrorMessage]);
|
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionMainNcaNotFoundErrorMessage]);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -263,11 +258,15 @@ namespace Ryujinx.Ava.Common
|
|||||||
|
|
||||||
Dispatcher.UIThread.InvokeAsync(async () =>
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
|
waitingDialog.Close();
|
||||||
|
|
||||||
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionCheckLogErrorMessage]);
|
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogNcaExtractionCheckLogErrorMessage]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (resultCode.Value.IsSuccess())
|
else if (resultCode.Value.IsSuccess())
|
||||||
{
|
{
|
||||||
|
Dispatcher.UIThread.Post(waitingDialog.Close);
|
||||||
|
|
||||||
NotificationHelper.Show(
|
NotificationHelper.Show(
|
||||||
LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle],
|
LocaleManager.Instance[LocaleKeys.DialogNcaExtractionTitle],
|
||||||
$"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}",
|
$"{titleName}\n\n{LocaleManager.Instance[LocaleKeys.DialogNcaExtractionSuccessMessage]}",
|
||||||
@@ -284,6 +283,8 @@ namespace Ryujinx.Ava.Common
|
|||||||
|
|
||||||
Dispatcher.UIThread.InvokeAsync(async () =>
|
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
|
waitingDialog.Close();
|
||||||
|
|
||||||
await ContentDialogHelper.CreateErrorDialog(ex.Message);
|
await ContentDialogHelper.CreateErrorDialog(ex.Message);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -730,7 +730,7 @@ namespace Ryujinx.Modules
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return files;
|
return files.Where(f => !new FileInfo(f).Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void MoveAllFilesOver(string root, string dest, TaskDialog taskDialog)
|
private static void MoveAllFilesOver(string root, string dest, TaskDialog taskDialog)
|
||||||
|
@@ -48,6 +48,7 @@
|
|||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
|
Focusable="True"
|
||||||
KeyUp="Message_KeyUp"
|
KeyUp="Message_KeyUp"
|
||||||
Text="{Binding Message}"
|
Text="{Binding Message}"
|
||||||
TextInput="Message_TextInput"
|
TextInput="Message_TextInput"
|
||||||
|
@@ -45,6 +45,13 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnGotFocus(GotFocusEventArgs e)
|
||||||
|
{
|
||||||
|
// FIXME: This does not work. Might be a bug in Avalonia with DialogHost
|
||||||
|
// Currently focus will be redirected to the overlay window instead.
|
||||||
|
Input.Focus();
|
||||||
|
}
|
||||||
|
|
||||||
public string Message { get; set; } = "";
|
public string Message { get; set; } = "";
|
||||||
public string MainText { get; set; } = "";
|
public string MainText { get; set; } = "";
|
||||||
public string SecondaryText { get; set; } = "";
|
public string SecondaryText { get; set; } = "";
|
||||||
@@ -59,24 +66,6 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
|
|
||||||
string input = string.Empty;
|
string input = string.Empty;
|
||||||
|
|
||||||
var overlay = new ContentDialogOverlayWindow()
|
|
||||||
{
|
|
||||||
Height = window.Bounds.Height,
|
|
||||||
Width = window.Bounds.Width,
|
|
||||||
Position = window.PointToScreen(new Point())
|
|
||||||
};
|
|
||||||
|
|
||||||
window.PositionChanged += OverlayOnPositionChanged;
|
|
||||||
|
|
||||||
void OverlayOnPositionChanged(object sender, PixelPointEventArgs e)
|
|
||||||
{
|
|
||||||
overlay.Position = window.PointToScreen(new Point());
|
|
||||||
}
|
|
||||||
|
|
||||||
contentDialog = overlay.ContentDialog;
|
|
||||||
|
|
||||||
bool opened = false;
|
|
||||||
|
|
||||||
content.SetInputLengthValidation(args.StringLengthMin, args.StringLengthMax);
|
content.SetInputLengthValidation(args.StringLengthMin, args.StringLengthMax);
|
||||||
|
|
||||||
content._host = contentDialog;
|
content._host = contentDialog;
|
||||||
@@ -97,25 +86,7 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
};
|
};
|
||||||
contentDialog.Closed += handler;
|
contentDialog.Closed += handler;
|
||||||
|
|
||||||
overlay.Opened += OverlayOnActivated;
|
await ContentDialogHelper.ShowAsync(contentDialog);
|
||||||
|
|
||||||
async void OverlayOnActivated(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (opened)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
opened = true;
|
|
||||||
|
|
||||||
overlay.Position = window.PointToScreen(new Point());
|
|
||||||
|
|
||||||
await contentDialog.ShowAsync(overlay);
|
|
||||||
contentDialog.Closed -= handler;
|
|
||||||
overlay.Close();
|
|
||||||
};
|
|
||||||
|
|
||||||
await overlay.ShowDialog(window);
|
|
||||||
|
|
||||||
return (result, input);
|
return (result, input);
|
||||||
}
|
}
|
||||||
|
@@ -1,32 +0,0 @@
|
|||||||
<UserControl
|
|
||||||
x:Class="Ryujinx.Ava.UI.Controls.InputDialog"
|
|
||||||
xmlns="https://github.com/avaloniaui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
mc:Ignorable="d"
|
|
||||||
Focusable="True">
|
|
||||||
<Grid
|
|
||||||
Margin="5,10,5,5"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
<Grid.RowDefinitions>
|
|
||||||
<RowDefinition Height="Auto" />
|
|
||||||
<RowDefinition Height="Auto" />
|
|
||||||
<RowDefinition Height="Auto" />
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
<TextBlock HorizontalAlignment="Center" Text="{Binding Message}" />
|
|
||||||
<TextBox
|
|
||||||
Grid.Row="1"
|
|
||||||
Width="300"
|
|
||||||
Margin="10"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
MaxLength="{Binding MaxLength}"
|
|
||||||
Text="{Binding Input, Mode=TwoWay}" />
|
|
||||||
<TextBlock
|
|
||||||
Grid.Row="2"
|
|
||||||
Margin="5,5,5,10"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Text="{Binding SubMessage}" />
|
|
||||||
</Grid>
|
|
||||||
</UserControl>
|
|
@@ -1,57 +0,0 @@
|
|||||||
using Avalonia.Controls;
|
|
||||||
using FluentAvalonia.UI.Controls;
|
|
||||||
using Ryujinx.Ava.Common.Locale;
|
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
|
||||||
using Ryujinx.Ava.UI.Models;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Controls
|
|
||||||
{
|
|
||||||
public partial class InputDialog : UserControl
|
|
||||||
{
|
|
||||||
public string Message { get; set; }
|
|
||||||
public string Input { get; set; }
|
|
||||||
public string SubMessage { get; set; }
|
|
||||||
|
|
||||||
public uint MaxLength { get; }
|
|
||||||
|
|
||||||
public InputDialog(string message, string input = "", string subMessage = "", uint maxLength = int.MaxValue)
|
|
||||||
{
|
|
||||||
Message = message;
|
|
||||||
Input = input;
|
|
||||||
SubMessage = subMessage;
|
|
||||||
MaxLength = maxLength;
|
|
||||||
|
|
||||||
DataContext = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public InputDialog()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<(UserResult Result, string Input)> ShowInputDialog(string title, string message,
|
|
||||||
string input = "", string subMessage = "", uint maxLength = int.MaxValue)
|
|
||||||
{
|
|
||||||
UserResult result = UserResult.Cancel;
|
|
||||||
|
|
||||||
InputDialog content = new InputDialog(message, input, subMessage, maxLength);
|
|
||||||
ContentDialog contentDialog = new ContentDialog
|
|
||||||
{
|
|
||||||
Title = title,
|
|
||||||
PrimaryButtonText = LocaleManager.Instance[LocaleKeys.InputDialogOk],
|
|
||||||
SecondaryButtonText = "",
|
|
||||||
CloseButtonText = LocaleManager.Instance[LocaleKeys.InputDialogCancel],
|
|
||||||
Content = content,
|
|
||||||
PrimaryButtonCommand = MiniCommand.Create(() =>
|
|
||||||
{
|
|
||||||
result = UserResult.Ok;
|
|
||||||
input = content.Input;
|
|
||||||
})
|
|
||||||
};
|
|
||||||
await contentDialog.ShowAsync();
|
|
||||||
|
|
||||||
return (result, input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,15 +1,26 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Ryujinx.Ava.UI.Windows;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Controls
|
namespace Ryujinx.Ava.UI.Controls
|
||||||
{
|
{
|
||||||
public partial class UpdateWaitWindow : StyleableWindow
|
public partial class UpdateWaitWindow : StyleableWindow
|
||||||
{
|
{
|
||||||
|
public UpdateWaitWindow(string primaryText, string secondaryText, CancellationTokenSource cancellationToken) : this(primaryText, secondaryText)
|
||||||
|
{
|
||||||
|
SystemDecorations = SystemDecorations.Full;
|
||||||
|
ShowInTaskbar = true;
|
||||||
|
|
||||||
|
Closing += (_, _) => cancellationToken.Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
public UpdateWaitWindow(string primaryText, string secondaryText) : this()
|
public UpdateWaitWindow(string primaryText, string secondaryText) : this()
|
||||||
{
|
{
|
||||||
PrimaryText.Text = primaryText;
|
PrimaryText.Text = primaryText;
|
||||||
SecondaryText.Text = secondaryText;
|
SecondaryText.Text = secondaryText;
|
||||||
WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
WindowStartupLocation = WindowStartupLocation.CenterOwner;
|
||||||
|
SystemDecorations = SystemDecorations.BorderOnly;
|
||||||
|
ShowInTaskbar = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UpdateWaitWindow()
|
public UpdateWaitWindow()
|
||||||
|
@@ -27,7 +27,6 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
string closeButton,
|
string closeButton,
|
||||||
UserResult primaryButtonResult = UserResult.Ok,
|
UserResult primaryButtonResult = UserResult.Ok,
|
||||||
ManualResetEvent deferResetEvent = null,
|
ManualResetEvent deferResetEvent = null,
|
||||||
Func<Window, Task> doWhileDeferred = null,
|
|
||||||
TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
|
TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
|
||||||
{
|
{
|
||||||
UserResult result = UserResult.None;
|
UserResult result = UserResult.None;
|
||||||
@@ -78,12 +77,11 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
int iconSymbol,
|
int iconSymbol,
|
||||||
UserResult primaryButtonResult = UserResult.Ok,
|
UserResult primaryButtonResult = UserResult.Ok,
|
||||||
ManualResetEvent deferResetEvent = null,
|
ManualResetEvent deferResetEvent = null,
|
||||||
Func<Window, Task> doWhileDeferred = null,
|
|
||||||
TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
|
TypedEventHandler<ContentDialog, ContentDialogButtonClickEventArgs> deferCloseAction = null)
|
||||||
{
|
{
|
||||||
Grid content = CreateTextDialogContent(primaryText, secondaryText, iconSymbol);
|
Grid content = CreateTextDialogContent(primaryText, secondaryText, iconSymbol);
|
||||||
|
|
||||||
return await ShowContentDialog(title, content, primaryButton, secondaryButton, closeButton, primaryButtonResult, deferResetEvent, doWhileDeferred, deferCloseAction);
|
return await ShowContentDialog(title, content, primaryButton, secondaryButton, closeButton, primaryButtonResult, deferResetEvent, deferCloseAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async static Task<UserResult> ShowDeferredContentDialog(
|
public async static Task<UserResult> ShowDeferredContentDialog(
|
||||||
@@ -111,7 +109,6 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
iconSymbol,
|
iconSymbol,
|
||||||
primaryButton == LocaleManager.Instance[LocaleKeys.InputDialogYes] ? UserResult.Yes : UserResult.Ok,
|
primaryButton == LocaleManager.Instance[LocaleKeys.InputDialogYes] ? UserResult.Yes : UserResult.Ok,
|
||||||
deferResetEvent,
|
deferResetEvent,
|
||||||
doWhileDeferred,
|
|
||||||
DeferClose);
|
DeferClose);
|
||||||
|
|
||||||
async void DeferClose(ContentDialog sender, ContentDialogButtonClickEventArgs args)
|
async void DeferClose(ContentDialog sender, ContentDialogButtonClickEventArgs args)
|
||||||
@@ -236,11 +233,6 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
primaryButtonResult);
|
primaryButtonResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static UpdateWaitWindow CreateWaitingDialog(string mainText, string secondaryText)
|
|
||||||
{
|
|
||||||
return new(mainText, secondaryText);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText)
|
internal static async Task CreateUpdaterInfoDialog(string primary, string secondaryText)
|
||||||
{
|
{
|
||||||
await ShowTextDialog(
|
await ShowTextDialog(
|
||||||
@@ -319,28 +311,6 @@ namespace Ryujinx.Ava.UI.Helpers
|
|||||||
LocaleManager.Instance[LocaleKeys.DialogExitSubMessage]);
|
LocaleManager.Instance[LocaleKeys.DialogExitSubMessage]);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task<string> CreateInputDialog(
|
|
||||||
string title,
|
|
||||||
string mainText,
|
|
||||||
string subText,
|
|
||||||
uint maxLength = int.MaxValue,
|
|
||||||
string input = "")
|
|
||||||
{
|
|
||||||
var result = await InputDialog.ShowInputDialog(
|
|
||||||
title,
|
|
||||||
mainText,
|
|
||||||
input,
|
|
||||||
subText,
|
|
||||||
maxLength);
|
|
||||||
|
|
||||||
if (result.Result == UserResult.Ok)
|
|
||||||
{
|
|
||||||
return result.Input;
|
|
||||||
}
|
|
||||||
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<ContentDialogResult> ShowAsync(ContentDialog contentDialog)
|
public static async Task<ContentDialogResult> ShowAsync(ContentDialog contentDialog)
|
||||||
{
|
{
|
||||||
ContentDialogResult result;
|
ContentDialogResult result;
|
||||||
|
@@ -972,7 +972,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
LocaleManager.Instance[LocaleKeys.InputDialogNo],
|
LocaleManager.Instance[LocaleKeys.InputDialogNo],
|
||||||
LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
|
LocaleManager.Instance[LocaleKeys.RyujinxConfirm]);
|
||||||
|
|
||||||
UpdateWaitWindow waitingDialog = ContentDialogHelper.CreateWaitingDialog(dialogTitle, LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallWaitMessage]);
|
UpdateWaitWindow waitingDialog = new(dialogTitle, LocaleManager.Instance[LocaleKeys.DialogFirmwareInstallerFirmwareInstallWaitMessage]);
|
||||||
|
|
||||||
if (result == UserResult.Yes)
|
if (result == UserResult.Yes)
|
||||||
{
|
{
|
||||||
@@ -1336,6 +1336,23 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ToggleFileType(string fileType)
|
||||||
|
{
|
||||||
|
_ = fileType switch
|
||||||
|
{
|
||||||
|
"NSP" => ConfigurationState.Instance.Ui.ShownFileTypes.NSP.Value = !ConfigurationState.Instance.Ui.ShownFileTypes.NSP,
|
||||||
|
"PFS0" => ConfigurationState.Instance.Ui.ShownFileTypes.PFS0.Value = !ConfigurationState.Instance.Ui.ShownFileTypes.PFS0,
|
||||||
|
"XCI" => ConfigurationState.Instance.Ui.ShownFileTypes.XCI.Value = !ConfigurationState.Instance.Ui.ShownFileTypes.XCI,
|
||||||
|
"NCA" => ConfigurationState.Instance.Ui.ShownFileTypes.NCA.Value = !ConfigurationState.Instance.Ui.ShownFileTypes.NCA,
|
||||||
|
"NRO" => ConfigurationState.Instance.Ui.ShownFileTypes.NRO.Value = !ConfigurationState.Instance.Ui.ShownFileTypes.NRO,
|
||||||
|
"NSO" => ConfigurationState.Instance.Ui.ShownFileTypes.NSO.Value = !ConfigurationState.Instance.Ui.ShownFileTypes.NSO,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(fileType),
|
||||||
|
};
|
||||||
|
|
||||||
|
ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
|
||||||
|
LoadApplications();
|
||||||
|
}
|
||||||
|
|
||||||
public async void ManageProfiles()
|
public async void ManageProfiles()
|
||||||
{
|
{
|
||||||
await NavigationDialogHost.Show(AccountManager, ContentManager, VirtualFileSystem, LibHacHorizonManager.RyujinxClient);
|
await NavigationDialogHost.Show(AccountManager, ContentManager, VirtualFileSystem, LibHacHorizonManager.RyujinxClient);
|
||||||
|
@@ -78,6 +78,7 @@
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
<Separator />
|
<Separator />
|
||||||
<MenuItem Name="ChangeLanguageMenuItem" Header="{locale:Locale MenuBarOptionsChangeLanguage}" />
|
<MenuItem Name="ChangeLanguageMenuItem" Header="{locale:Locale MenuBarOptionsChangeLanguage}" />
|
||||||
|
<MenuItem Name="ToggleFileTypesMenuItem" Header="{locale:Locale MenuBarShowFileTypes}" />
|
||||||
<Separator />
|
<Separator />
|
||||||
<MenuItem
|
<MenuItem
|
||||||
Click="OpenSettings"
|
Click="OpenSettings"
|
||||||
|
@@ -11,6 +11,8 @@ using Ryujinx.Common;
|
|||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
using Ryujinx.HLE.HOS;
|
using Ryujinx.HLE.HOS;
|
||||||
using Ryujinx.Modules;
|
using Ryujinx.Modules;
|
||||||
|
using Ryujinx.Ui.Common;
|
||||||
|
using Ryujinx.Ui.Common.Configuration;
|
||||||
using Ryujinx.Ui.Common.Helper;
|
using Ryujinx.Ui.Common.Helper;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -29,6 +31,30 @@ namespace Ryujinx.Ava.UI.Views.Main
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
|
ToggleFileTypesMenuItem.Items = GenerateToggleFileTypeItems();
|
||||||
|
ChangeLanguageMenuItem.Items = GenerateLanguageMenuItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
private CheckBox[] GenerateToggleFileTypeItems()
|
||||||
|
{
|
||||||
|
List<CheckBox> checkBoxes = new();
|
||||||
|
|
||||||
|
foreach (var item in Enum.GetValues(typeof (FileTypes)))
|
||||||
|
{
|
||||||
|
string fileName = Enum.GetName(typeof (FileTypes), item);
|
||||||
|
checkBoxes.Add(new CheckBox()
|
||||||
|
{
|
||||||
|
Content = $".{fileName}",
|
||||||
|
IsChecked = ((FileTypes)item).GetConfigValue(ConfigurationState.Instance.Ui.ShownFileTypes),
|
||||||
|
Command = MiniCommand.Create(() => ViewModel.ToggleFileType(fileName))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return checkBoxes.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MenuItem[] GenerateLanguageMenuItems()
|
||||||
|
{
|
||||||
List<MenuItem> menuItems = new();
|
List<MenuItem> menuItems = new();
|
||||||
|
|
||||||
string localePath = "Ryujinx.Ava/Assets/Locales";
|
string localePath = "Ryujinx.Ava/Assets/Locales";
|
||||||
@@ -61,7 +87,7 @@ namespace Ryujinx.Ava.UI.Views.Main
|
|||||||
menuItems.Add(menuItem);
|
menuItems.Add(menuItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChangeLanguageMenuItem.Items = menuItems.ToArray();
|
return menuItems.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
|
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
|
||||||
|
@@ -10,20 +10,16 @@
|
|||||||
d:DesignHeight="450"
|
d:DesignHeight="450"
|
||||||
x:Class="Ryujinx.Ava.UI.Windows.ContentDialogOverlayWindow"
|
x:Class="Ryujinx.Ava.UI.Windows.ContentDialogOverlayWindow"
|
||||||
Title="ContentDialogOverlayWindow"
|
Title="ContentDialogOverlayWindow"
|
||||||
Focusable="True">
|
Focusable="False">
|
||||||
<window:StyleableWindow.Styles>
|
<window:StyleableWindow.Styles>
|
||||||
<Style Selector="ui|ContentDialog /template/ Panel#LayoutRoot">
|
<Style Selector="ui|ContentDialog /template/ Panel#LayoutRoot">
|
||||||
<Setter Property="Background"
|
<Setter Property="Background"
|
||||||
Value="Transparent" />
|
Value="Transparent" />
|
||||||
</Style>
|
</Style>
|
||||||
</window:StyleableWindow.Styles>
|
</window:StyleableWindow.Styles>
|
||||||
<ContentControl
|
|
||||||
Focusable="False"
|
|
||||||
IsVisible="False"
|
|
||||||
KeyboardNavigation.IsTabStop="False">
|
|
||||||
<ui:ContentDialog Name="ContentDialog"
|
<ui:ContentDialog Name="ContentDialog"
|
||||||
IsPrimaryButtonEnabled="True"
|
IsPrimaryButtonEnabled="True"
|
||||||
IsSecondaryButtonEnabled="True"
|
IsSecondaryButtonEnabled="True"
|
||||||
IsVisible="False" />
|
IsVisible="False"
|
||||||
</ContentControl>
|
Focusable="True"/>
|
||||||
</window:StyleableWindow>
|
</window:StyleableWindow>
|
||||||
|
@@ -14,9 +14,11 @@ using Ryujinx.Common.Utilities;
|
|||||||
using Ryujinx.HLE.FileSystem;
|
using Ryujinx.HLE.FileSystem;
|
||||||
using Ryujinx.HLE.HOS.SystemState;
|
using Ryujinx.HLE.HOS.SystemState;
|
||||||
using Ryujinx.HLE.Loaders.Npdm;
|
using Ryujinx.HLE.Loaders.Npdm;
|
||||||
|
using Ryujinx.Ui.Common.Configuration;
|
||||||
using Ryujinx.Ui.Common.Configuration.System;
|
using Ryujinx.Ui.Common.Configuration.System;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
@@ -109,7 +111,18 @@ namespace Ryujinx.Ui.App.Common
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
foreach (string app in Directory.EnumerateFiles(appDir, "*", SearchOption.AllDirectories))
|
IEnumerable<string> files = Directory.EnumerateFiles(appDir, "*", SearchOption.AllDirectories).Where(file =>
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(Path.GetExtension(file).ToLower() is ".nsp" && ConfigurationState.Instance.Ui.ShownFileTypes.NSP.Value) ||
|
||||||
|
(Path.GetExtension(file).ToLower() is ".pfs0" && ConfigurationState.Instance.Ui.ShownFileTypes.PFS0.Value) ||
|
||||||
|
(Path.GetExtension(file).ToLower() is ".xci" && ConfigurationState.Instance.Ui.ShownFileTypes.XCI.Value) ||
|
||||||
|
(Path.GetExtension(file).ToLower() is ".nca" && ConfigurationState.Instance.Ui.ShownFileTypes.NCA.Value) ||
|
||||||
|
(Path.GetExtension(file).ToLower() is ".nro" && ConfigurationState.Instance.Ui.ShownFileTypes.NRO.Value) ||
|
||||||
|
(Path.GetExtension(file).ToLower() is ".nso" && ConfigurationState.Instance.Ui.ShownFileTypes.NSO.Value);
|
||||||
|
});
|
||||||
|
|
||||||
|
foreach (string app in files)
|
||||||
{
|
{
|
||||||
if (_cancellationToken.Token.IsCancellationRequested)
|
if (_cancellationToken.Token.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
|
@@ -14,7 +14,7 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The current version of the file format
|
/// The current version of the file format
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int CurrentVersion = 44;
|
public const int CurrentVersion = 45;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version of the configuration file format
|
/// Version of the configuration file format
|
||||||
@@ -246,6 +246,11 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<string> GameDirs { get; set; }
|
public List<string> GameDirs { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A list of file types to be hidden in the games List
|
||||||
|
/// </summary>
|
||||||
|
public ShownFileTypes ShownFileTypes { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Language Code for the UI
|
/// Language Code for the UI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@@ -60,6 +60,29 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to toggle which file types are shown in the UI
|
||||||
|
/// </summary>
|
||||||
|
public class ShownFileTypeSettings
|
||||||
|
{
|
||||||
|
public ReactiveObject<bool> NSP { get; private set; }
|
||||||
|
public ReactiveObject<bool> PFS0 { get; private set; }
|
||||||
|
public ReactiveObject<bool> XCI { get; private set; }
|
||||||
|
public ReactiveObject<bool> NCA { get; private set; }
|
||||||
|
public ReactiveObject<bool> NRO { get; private set; }
|
||||||
|
public ReactiveObject<bool> NSO { get; private set; }
|
||||||
|
|
||||||
|
public ShownFileTypeSettings()
|
||||||
|
{
|
||||||
|
NSP = new ReactiveObject<bool>();
|
||||||
|
PFS0 = new ReactiveObject<bool>();
|
||||||
|
XCI = new ReactiveObject<bool>();
|
||||||
|
NCA = new ReactiveObject<bool>();
|
||||||
|
NRO = new ReactiveObject<bool>();
|
||||||
|
NSO = new ReactiveObject<bool>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used to toggle columns in the GUI
|
/// Used to toggle columns in the GUI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -75,6 +98,11 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ReactiveObject<List<string>> GameDirs { get; private set; }
|
public ReactiveObject<List<string>> GameDirs { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A list of file types to be hidden in the games List
|
||||||
|
/// </summary>
|
||||||
|
public ShownFileTypeSettings ShownFileTypes { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Language Code for the UI
|
/// Language Code for the UI
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -135,6 +163,7 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
GuiColumns = new Columns();
|
GuiColumns = new Columns();
|
||||||
ColumnSort = new ColumnSortSettings();
|
ColumnSort = new ColumnSortSettings();
|
||||||
GameDirs = new ReactiveObject<List<string>>();
|
GameDirs = new ReactiveObject<List<string>>();
|
||||||
|
ShownFileTypes = new ShownFileTypeSettings();
|
||||||
EnableCustomTheme = new ReactiveObject<bool>();
|
EnableCustomTheme = new ReactiveObject<bool>();
|
||||||
CustomThemePath = new ReactiveObject<string>();
|
CustomThemePath = new ReactiveObject<string>();
|
||||||
BaseStyle = new ReactiveObject<string>();
|
BaseStyle = new ReactiveObject<string>();
|
||||||
@@ -618,6 +647,15 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
SortAscending = Ui.ColumnSort.SortAscending
|
SortAscending = Ui.ColumnSort.SortAscending
|
||||||
},
|
},
|
||||||
GameDirs = Ui.GameDirs,
|
GameDirs = Ui.GameDirs,
|
||||||
|
ShownFileTypes = new ShownFileTypes
|
||||||
|
{
|
||||||
|
NSP = Ui.ShownFileTypes.NSP,
|
||||||
|
PFS0 = Ui.ShownFileTypes.PFS0,
|
||||||
|
XCI = Ui.ShownFileTypes.XCI,
|
||||||
|
NCA = Ui.ShownFileTypes.NCA,
|
||||||
|
NRO = Ui.ShownFileTypes.NRO,
|
||||||
|
NSO = Ui.ShownFileTypes.NSO,
|
||||||
|
},
|
||||||
LanguageCode = Ui.LanguageCode,
|
LanguageCode = Ui.LanguageCode,
|
||||||
EnableCustomTheme = Ui.EnableCustomTheme,
|
EnableCustomTheme = Ui.EnableCustomTheme,
|
||||||
CustomThemePath = Ui.CustomThemePath,
|
CustomThemePath = Ui.CustomThemePath,
|
||||||
@@ -702,7 +740,13 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
Ui.ColumnSort.SortColumnId.Value = 0;
|
Ui.ColumnSort.SortColumnId.Value = 0;
|
||||||
Ui.ColumnSort.SortAscending.Value = false;
|
Ui.ColumnSort.SortAscending.Value = false;
|
||||||
Ui.GameDirs.Value = new List<string>();
|
Ui.GameDirs.Value = new List<string>();
|
||||||
Ui.EnableCustomTheme.Value = false;
|
Ui.ShownFileTypes.NSP.Value = true;
|
||||||
|
Ui.ShownFileTypes.PFS0.Value = true;
|
||||||
|
Ui.ShownFileTypes.XCI.Value = true;
|
||||||
|
Ui.ShownFileTypes.NCA.Value = true;
|
||||||
|
Ui.ShownFileTypes.NRO.Value = true;
|
||||||
|
Ui.ShownFileTypes.NSO.Value = true;
|
||||||
|
Ui.EnableCustomTheme.Value = true;
|
||||||
Ui.LanguageCode.Value = "en_US";
|
Ui.LanguageCode.Value = "en_US";
|
||||||
Ui.CustomThemePath.Value = "";
|
Ui.CustomThemePath.Value = "";
|
||||||
Ui.BaseStyle.Value = "Dark";
|
Ui.BaseStyle.Value = "Dark";
|
||||||
@@ -1238,7 +1282,7 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
|
|
||||||
if (configurationFileFormat.Version < 44)
|
if (configurationFileFormat.Version < 44)
|
||||||
{
|
{
|
||||||
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 42.");
|
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 44.");
|
||||||
|
|
||||||
configurationFileFormat.AntiAliasing = AntiAliasing.None;
|
configurationFileFormat.AntiAliasing = AntiAliasing.None;
|
||||||
configurationFileFormat.ScalingFilter = ScalingFilter.Bilinear;
|
configurationFileFormat.ScalingFilter = ScalingFilter.Bilinear;
|
||||||
@@ -1247,6 +1291,23 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
configurationFileUpdated = true;
|
configurationFileUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (configurationFileFormat.Version < 45)
|
||||||
|
{
|
||||||
|
Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 45.");
|
||||||
|
|
||||||
|
configurationFileFormat.ShownFileTypes = new ShownFileTypes
|
||||||
|
{
|
||||||
|
NSP = true,
|
||||||
|
PFS0 = true,
|
||||||
|
XCI = true,
|
||||||
|
NCA = true,
|
||||||
|
NRO = true,
|
||||||
|
NSO = true
|
||||||
|
};
|
||||||
|
|
||||||
|
configurationFileUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog;
|
||||||
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
Graphics.ResScale.Value = configurationFileFormat.ResScale;
|
||||||
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom;
|
||||||
@@ -1305,6 +1366,12 @@ namespace Ryujinx.Ui.Common.Configuration
|
|||||||
Ui.ColumnSort.SortColumnId.Value = configurationFileFormat.ColumnSort.SortColumnId;
|
Ui.ColumnSort.SortColumnId.Value = configurationFileFormat.ColumnSort.SortColumnId;
|
||||||
Ui.ColumnSort.SortAscending.Value = configurationFileFormat.ColumnSort.SortAscending;
|
Ui.ColumnSort.SortAscending.Value = configurationFileFormat.ColumnSort.SortAscending;
|
||||||
Ui.GameDirs.Value = configurationFileFormat.GameDirs;
|
Ui.GameDirs.Value = configurationFileFormat.GameDirs;
|
||||||
|
Ui.ShownFileTypes.NSP.Value = configurationFileFormat.ShownFileTypes.NSP;
|
||||||
|
Ui.ShownFileTypes.PFS0.Value = configurationFileFormat.ShownFileTypes.PFS0;
|
||||||
|
Ui.ShownFileTypes.XCI.Value = configurationFileFormat.ShownFileTypes.XCI;
|
||||||
|
Ui.ShownFileTypes.NCA.Value = configurationFileFormat.ShownFileTypes.NCA;
|
||||||
|
Ui.ShownFileTypes.NRO.Value = configurationFileFormat.ShownFileTypes.NRO;
|
||||||
|
Ui.ShownFileTypes.NSO.Value = configurationFileFormat.ShownFileTypes.NSO;
|
||||||
Ui.EnableCustomTheme.Value = configurationFileFormat.EnableCustomTheme;
|
Ui.EnableCustomTheme.Value = configurationFileFormat.EnableCustomTheme;
|
||||||
Ui.LanguageCode.Value = configurationFileFormat.LanguageCode;
|
Ui.LanguageCode.Value = configurationFileFormat.LanguageCode;
|
||||||
Ui.CustomThemePath.Value = configurationFileFormat.CustomThemePath;
|
Ui.CustomThemePath.Value = configurationFileFormat.CustomThemePath;
|
||||||
|
12
Ryujinx.Ui.Common/Configuration/FileTypes.cs
Normal file
12
Ryujinx.Ui.Common/Configuration/FileTypes.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
namespace Ryujinx.Ui.Common
|
||||||
|
{
|
||||||
|
public enum FileTypes
|
||||||
|
{
|
||||||
|
NSP,
|
||||||
|
PFS0,
|
||||||
|
XCI,
|
||||||
|
NCA,
|
||||||
|
NRO,
|
||||||
|
NSO
|
||||||
|
}
|
||||||
|
}
|
12
Ryujinx.Ui.Common/Configuration/Ui/ShownFileTypes.cs
Normal file
12
Ryujinx.Ui.Common/Configuration/Ui/ShownFileTypes.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
namespace Ryujinx.Ui.Common.Configuration.Ui
|
||||||
|
{
|
||||||
|
public struct ShownFileTypes
|
||||||
|
{
|
||||||
|
public bool NSP { get; set; }
|
||||||
|
public bool PFS0 { get; set; }
|
||||||
|
public bool XCI { get; set; }
|
||||||
|
public bool NCA { get; set; }
|
||||||
|
public bool NRO { get; set; }
|
||||||
|
public bool NSO { get; set; }
|
||||||
|
}
|
||||||
|
}
|
25
Ryujinx.Ui.Common/Extensions/FileTypeExtensions.cs
Normal file
25
Ryujinx.Ui.Common/Extensions/FileTypeExtensions.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using static Ryujinx.Ui.Common.Configuration.ConfigurationState.UiSection;
|
||||||
|
|
||||||
|
namespace Ryujinx.Ui.Common
|
||||||
|
{
|
||||||
|
public static class FileTypesExtensions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the current <see cref="ShownFileTypeSettings"/> value for the correlating FileType name.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type">The name of the <see cref="ShownFileTypeSettings"/> parameter to get the value of.</param>
|
||||||
|
/// <param name="config">The config instance to get the value from.</param>
|
||||||
|
/// <returns>The current value of the setting. Value is <see langword="true"/> if the file type is the be shown on the games list, <see langword="false"/> otherwise.</returns>
|
||||||
|
public static bool GetConfigValue(this FileTypes type, ShownFileTypeSettings config) => type switch
|
||||||
|
{
|
||||||
|
FileTypes.NSP => config.NSP.Value,
|
||||||
|
FileTypes.PFS0 => config.PFS0.Value,
|
||||||
|
FileTypes.XCI => config.XCI.Value,
|
||||||
|
FileTypes.NCA => config.NCA.Value,
|
||||||
|
FileTypes.NRO => config.NRO.Value,
|
||||||
|
FileTypes.NSO => config.NSO.Value,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(type), type, null)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@@ -577,7 +577,7 @@ namespace Ryujinx.Modules
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return files;
|
return files.Where(f => !new FileInfo(f).Attributes.HasFlag(FileAttributes.Hidden | FileAttributes.System));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void MoveAllFilesOver(string root, string dest, UpdateDialog dialog)
|
private static void MoveAllFilesOver(string root, string dest, UpdateDialog dialog)
|
||||||
|
@@ -119,6 +119,12 @@ namespace Ryujinx.Ui
|
|||||||
[GUI] CheckMenuItem _fileExtToggle;
|
[GUI] CheckMenuItem _fileExtToggle;
|
||||||
[GUI] CheckMenuItem _pathToggle;
|
[GUI] CheckMenuItem _pathToggle;
|
||||||
[GUI] CheckMenuItem _fileSizeToggle;
|
[GUI] CheckMenuItem _fileSizeToggle;
|
||||||
|
[GUI] CheckMenuItem _nspShown;
|
||||||
|
[GUI] CheckMenuItem _pfs0Shown;
|
||||||
|
[GUI] CheckMenuItem _xciShown;
|
||||||
|
[GUI] CheckMenuItem _ncaShown;
|
||||||
|
[GUI] CheckMenuItem _nroShown;
|
||||||
|
[GUI] CheckMenuItem _nsoShown;
|
||||||
[GUI] Label _gpuBackend;
|
[GUI] Label _gpuBackend;
|
||||||
[GUI] Label _dockedMode;
|
[GUI] Label _dockedMode;
|
||||||
[GUI] Label _aspectRatio;
|
[GUI] Label _aspectRatio;
|
||||||
@@ -220,6 +226,20 @@ namespace Ryujinx.Ui
|
|||||||
_pauseEmulation.Sensitive = false;
|
_pauseEmulation.Sensitive = false;
|
||||||
_resumeEmulation.Sensitive = false;
|
_resumeEmulation.Sensitive = false;
|
||||||
|
|
||||||
|
_nspShown.Active = ConfigurationState.Instance.Ui.ShownFileTypes.NSP.Value;
|
||||||
|
_pfs0Shown.Active = ConfigurationState.Instance.Ui.ShownFileTypes.PFS0.Value;
|
||||||
|
_xciShown.Active = ConfigurationState.Instance.Ui.ShownFileTypes.XCI.Value;
|
||||||
|
_ncaShown.Active = ConfigurationState.Instance.Ui.ShownFileTypes.NCA.Value;
|
||||||
|
_nroShown.Active = ConfigurationState.Instance.Ui.ShownFileTypes.NRO.Value;
|
||||||
|
_nsoShown.Active = ConfigurationState.Instance.Ui.ShownFileTypes.NSO.Value;
|
||||||
|
|
||||||
|
_nspShown.Toggled += NSP_Shown_Toggled;
|
||||||
|
_pfs0Shown.Toggled += PFS0_Shown_Toggled;
|
||||||
|
_xciShown.Toggled += XCI_Shown_Toggled;
|
||||||
|
_ncaShown.Toggled += NCA_Shown_Toggled;
|
||||||
|
_nroShown.Toggled += NRO_Shown_Toggled;
|
||||||
|
_nsoShown.Toggled += NSO_Shown_Toggled;
|
||||||
|
|
||||||
_fileTypesSubMenu.Visible = FileAssociationHelper.IsTypeAssociationSupported;
|
_fileTypesSubMenu.Visible = FileAssociationHelper.IsTypeAssociationSupported;
|
||||||
|
|
||||||
if (ConfigurationState.Instance.Ui.GuiColumns.FavColumn) _favToggle.Active = true;
|
if (ConfigurationState.Instance.Ui.GuiColumns.FavColumn) _favToggle.Active = true;
|
||||||
@@ -1757,6 +1777,54 @@ namespace Ryujinx.Ui
|
|||||||
UpdateColumns();
|
UpdateColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void NSP_Shown_Toggled(object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ConfigurationState.Instance.Ui.ShownFileTypes.NSP.Value = _nspShown.Active;
|
||||||
|
|
||||||
|
SaveConfig();
|
||||||
|
UpdateGameTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PFS0_Shown_Toggled(object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ConfigurationState.Instance.Ui.ShownFileTypes.PFS0.Value = _pfs0Shown.Active;
|
||||||
|
|
||||||
|
SaveConfig();
|
||||||
|
UpdateGameTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void XCI_Shown_Toggled (object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ConfigurationState.Instance.Ui.ShownFileTypes.XCI.Value = _xciShown.Active;
|
||||||
|
|
||||||
|
SaveConfig();
|
||||||
|
UpdateGameTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NCA_Shown_Toggled (object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ConfigurationState.Instance.Ui.ShownFileTypes.NCA.Value = _ncaShown.Active;
|
||||||
|
|
||||||
|
SaveConfig();
|
||||||
|
UpdateGameTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NRO_Shown_Toggled (object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ConfigurationState.Instance.Ui.ShownFileTypes.NRO.Value = _nroShown.Active;
|
||||||
|
|
||||||
|
SaveConfig();
|
||||||
|
UpdateGameTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NSO_Shown_Toggled (object sender, EventArgs args)
|
||||||
|
{
|
||||||
|
ConfigurationState.Instance.Ui.ShownFileTypes.NSO.Value = _nsoShown.Active;
|
||||||
|
|
||||||
|
SaveConfig();
|
||||||
|
UpdateGameTable();
|
||||||
|
}
|
||||||
|
|
||||||
private void RefreshList_Pressed(object sender, ButtonReleaseEventArgs args)
|
private void RefreshList_Pressed(object sender, ButtonReleaseEventArgs args)
|
||||||
{
|
{
|
||||||
UpdateGameTable();
|
UpdateGameTable();
|
||||||
|
@@ -262,6 +262,75 @@
|
|||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkMenuItem" id="ShownFileTypes">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Select which file types to show</property>
|
||||||
|
<property name="label" translatable="yes">Show File Types</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
<child type="submenu">
|
||||||
|
<object class="GtkMenu">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="_nspShown">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Shows .NSP files in the games list</property>
|
||||||
|
<property name="label" translatable="yes">.NSP</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="_pfs0Shown">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Shows .PFS0 files in the games list</property>
|
||||||
|
<property name="label" translatable="yes">.PFS0</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="_xciShown">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Shows .XCI files in the games list</property>
|
||||||
|
<property name="label" translatable="yes">.XCI</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="_ncaShown">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Shows .NCA files in the games list</property>
|
||||||
|
<property name="label" translatable="yes">.NCA</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="_nroShown">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Shows .NRO files in the games list</property>
|
||||||
|
<property name="label" translatable="yes">.NRO</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="_nsoShown">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="tooltip-text" translatable="yes">Shows .NSO files in the games list</property>
|
||||||
|
<property name="label" translatable="yes">.NSO</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorMenuItem">
|
<object class="GtkSeparatorMenuItem">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
Reference in New Issue
Block a user