misc: Code cleanups & remove references to Patreon & Twitter.

This commit is contained in:
Evan Husted 2024-10-11 17:56:59 -05:00
parent 26e9aa11d5
commit 4c237c4793
27 changed files with 91 additions and 307 deletions

View file

@ -6,7 +6,7 @@ on:
env: env:
POWERSHELL_TELEMETRY_OPTOUT: 1 POWERSHELL_TELEMETRY_OPTOUT: 1
DOTNET_CLI_TELEMETRY_OPTOUT: 1 DOTNET_CLI_TELEMETRY_OPTOUT: 1
RYUJINX_BASE_VERSION: "1.1.0" RYUJINX_BASE_VERSION: "1.2.0"
jobs: jobs:
build: build:

View file

@ -9,7 +9,6 @@ jobs:
pr_comment: pr_comment:
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: ${{ fromJSON(vars.JOB_TIMEOUT) }}
steps: steps:
- uses: actions/github-script@v6 - uses: actions/github-script@v6
with: with:
@ -39,24 +38,19 @@ jobs:
return core.error(`No artifacts found`); return core.error(`No artifacts found`);
} }
let body = `Download the artifacts for this pull request:\n`; let body = `Download the artifacts for this pull request:\n`;
let hidden_gtk_artifacts = `\n\n <details><summary>Old GUI (GTK3)</summary>\n`;
let hidden_headless_artifacts = `\n\n <details><summary>GUI-less (SDL2)</summary>\n`; let hidden_headless_artifacts = `\n\n <details><summary>GUI-less (SDL2)</summary>\n`;
let hidden_debug_artifacts = `\n\n <details><summary>Only for Developers</summary>\n`; let hidden_debug_artifacts = `\n\n <details><summary>Only for Developers</summary>\n`;
for (const art of artifacts) { for (const art of artifacts) {
if(art.name.includes('Debug')) { if(art.name.includes('Debug')) {
hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; hidden_debug_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
} else if(art.name.includes('gtk-ryujinx')) {
hidden_gtk_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
} else if(art.name.includes('sdl2-ryujinx-headless')) { } else if(art.name.includes('sdl2-ryujinx-headless')) {
hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; hidden_headless_artifacts += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
} else { } else {
body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; body += `\n* [${art.name}](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`;
} }
} }
hidden_gtk_artifacts += `\n</details>`;
hidden_headless_artifacts += `\n</details>`; hidden_headless_artifacts += `\n</details>`;
hidden_debug_artifacts += `\n</details>`; hidden_debug_artifacts += `\n</details>`;
body += hidden_gtk_artifacts;
body += hidden_headless_artifacts; body += hidden_headless_artifacts;
body += hidden_debug_artifacts; body += hidden_debug_artifacts;

View file

@ -3,19 +3,11 @@ using System.Threading;
namespace Ryujinx.Common namespace Ryujinx.Common
{ {
public class ObjectPool<T> public class ObjectPool<T>(Func<T> factory, int size)
where T : class where T : class
{ {
private T _firstItem; private T _firstItem;
private readonly T[] _items; private readonly T[] _items = new T[size - 1];
private readonly Func<T> _factory;
public ObjectPool(Func<T> factory, int size)
{
_items = new T[size - 1];
_factory = factory;
}
public T Allocate() public T Allocate()
{ {
@ -43,7 +35,7 @@ namespace Ryujinx.Common
} }
} }
return _factory(); return factory();
} }
public void Release(T obj) public void Release(T obj)

View file

@ -47,15 +47,9 @@ namespace Ryujinx.Common
} }
} }
public class ReactiveEventArgs<T> public class ReactiveEventArgs<T>(T oldValue, T newValue)
{ {
public T OldValue { get; } public T OldValue { get; } = oldValue;
public T NewValue { get; } public T NewValue { get; } = newValue;
public ReactiveEventArgs(T oldValue, T newValue)
{
OldValue = oldValue;
NewValue = newValue;
}
} }
} }

View file

@ -158,10 +158,7 @@ namespace Ryujinx.HLE.HOS.Applets.Error
if (message == "") if (message == "")
{ {
message = "An error has occured.\n\n" message = "An error has occured.\n\nPlease try again later.";
+ "Please try again later.\n\n"
+ "If the problem persists, please refer to the Ryujinx website.\n"
+ "www.ryujinx.org";
} }
string[] buttons = GetButtonsText(module, description, "DlgBtn"); string[] buttons = GetButtonsText(module, description, "DlgBtn");

View file

@ -659,7 +659,7 @@ namespace Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.Applicati
if (string.IsNullOrWhiteSpace(filePath)) if (string.IsNullOrWhiteSpace(filePath))
{ {
throw new InvalidSystemResourceException("JIT (010000000000003B) system title not found! The JIT will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx#requirements for more information)"); throw new InvalidSystemResourceException("JIT (010000000000003B) system title not found! The JIT will not work, provide the system archive to fix this error. (See https://github.com/GreemDev/Ryujinx#requirements for more information)");
} }
context.Device.LoadNca(filePath); context.Device.LoadNca(filePath);

View file

@ -105,7 +105,7 @@ namespace Ryujinx.HLE.HOS.Services.Sdb.Pl
titleName = "Unknown"; titleName = "Unknown";
} }
throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx#requirements for more information)"); throw new InvalidSystemResourceException($"{titleName} ({fontTitle:x8}) system title not found! This font will not work, provide the system archive to fix this error. (See https://github.com/GreemDev/Ryujinx#requirements for more information)");
} }
} }
else else

View file

@ -23,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl
{ {
private const long CertStoreTitleId = 0x0100000000000800; private const long CertStoreTitleId = 0x0100000000000800;
private const string CertStoreTitleMissingErrorMessage = "CertStore system title not found! SSL CA retrieving will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide#initial-setup-continued---installation-of-firmware for more information)"; private const string CertStoreTitleMissingErrorMessage = "CertStore system title not found! SSL CA retrieving will not work, provide the system archive to fix this error.";
private static BuiltInCertificateManager _instance; private static BuiltInCertificateManager _instance;

View file

@ -23,7 +23,7 @@ namespace Ryujinx.HLE.HOS.Services.Time.TimeZone
{ {
private const long TimeZoneBinaryTitleId = 0x010000000000080E; private const long TimeZoneBinaryTitleId = 0x010000000000080E;
private const string TimeZoneSystemTitleMissingErrorMessage = "TimeZoneBinary system title not found! TimeZone conversions will not work, provide the system archive to fix this error. (See https://github.com/Ryujinx/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide#initial-setup-continued---installation-of-firmware for more information)"; private const string TimeZoneSystemTitleMissingErrorMessage = "TimeZoneBinary system title not found! TimeZone conversions will not work, provide the system archive to fix this error.";
private VirtualFileSystem _virtualFileSystem; private VirtualFileSystem _virtualFileSystem;
private IntegrityCheckLevel _fsIntegrityCheckLevel; private IntegrityCheckLevel _fsIntegrityCheckLevel;

View file

@ -11,7 +11,7 @@ namespace Ryujinx.UI.Common.Helper
{ {
public static partial class FileAssociationHelper public static partial class FileAssociationHelper
{ {
private static readonly string[] _fileExtensions = { ".nca", ".nro", ".nso", ".nsp", ".xci" }; private static readonly string[] _fileExtensions = [".nca", ".nro", ".nso", ".nsp", ".xci"];
[SupportedOSPlatform("linux")] [SupportedOSPlatform("linux")]
private static readonly string _mimeDbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "share", "mime"); private static readonly string _mimeDbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".local", "share", "mime");

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View file

@ -18,9 +18,7 @@
<None Remove="Resources\Logo_Amiibo.png" /> <None Remove="Resources\Logo_Amiibo.png" />
<None Remove="Resources\Logo_Discord.png" /> <None Remove="Resources\Logo_Discord.png" />
<None Remove="Resources\Logo_GitHub.png" /> <None Remove="Resources\Logo_GitHub.png" />
<None Remove="Resources\Logo_Patreon.png" />
<None Remove="Resources\Logo_Ryujinx.png" /> <None Remove="Resources\Logo_Ryujinx.png" />
<None Remove="Resources\Logo_Twitter.png" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -39,10 +37,6 @@
<EmbeddedResource Include="Resources\Logo_Discord_Light.png" /> <EmbeddedResource Include="Resources\Logo_Discord_Light.png" />
<EmbeddedResource Include="Resources\Logo_GitHub_Dark.png" /> <EmbeddedResource Include="Resources\Logo_GitHub_Dark.png" />
<EmbeddedResource Include="Resources\Logo_GitHub_Light.png" /> <EmbeddedResource Include="Resources\Logo_GitHub_Light.png" />
<EmbeddedResource Include="Resources\Logo_Patreon_Dark.png" />
<EmbeddedResource Include="Resources\Logo_Patreon_Light.png" />
<EmbeddedResource Include="Resources\Logo_Twitter_Dark.png" />
<EmbeddedResource Include="Resources\Logo_Twitter_Light.png" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR '$(RuntimeIdentifier)' == 'linux-arm64' OR '$(RuntimeIdentifier)' == ''"> <ItemGroup Condition="'$(RuntimeIdentifier)' == 'linux-x64' OR '$(RuntimeIdentifier)' == 'linux-arm64' OR '$(RuntimeIdentifier)' == ''">

View file

@ -33,17 +33,13 @@ namespace Ryujinx.UI.Common.SystemInfo
public static SystemInfo Gather() public static SystemInfo Gather()
{ {
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
{
return new WindowsSystemInfo(); return new WindowsSystemInfo();
}
else if (OperatingSystem.IsLinux()) if (OperatingSystem.IsLinux())
{
return new LinuxSystemInfo(); return new LinuxSystemInfo();
}
else if (OperatingSystem.IsMacOS()) if (OperatingSystem.IsMacOS())
{
return new MacOSSystemInfo(); return new MacOSSystemInfo();
}
Logger.Error?.Print(LogClass.Application, "SystemInfo unsupported on this platform"); Logger.Error?.Print(LogClass.Application, "SystemInfo unsupported on this platform");

View file

@ -40,7 +40,7 @@ namespace Ryujinx.UI.Common.SystemInfo
} }
} }
return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").Trim(); return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER")?.Trim();
} }
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]

View file

@ -71,8 +71,7 @@ namespace Ryujinx.Ava
if (result == UserResult.Yes) if (result == UserResult.Yes)
{ {
var path = Environment.ProcessPath; _ = Process.Start(Environment.ProcessPath!, CommandLineState.Arguments);
var proc = Process.Start(path, CommandLineState.Arguments);
desktop.Shutdown(); desktop.Shutdown();
Environment.Exit(0); Environment.Exit(0);
} }

View file

@ -825,7 +825,7 @@ namespace Ryujinx.Ava
{ {
renderer = new VulkanRenderer( renderer = new VulkanRenderer(
Vk.GetApi(), Vk.GetApi(),
(RendererHost.EmbeddedWindow as EmbeddedWindowVulkan).CreateSurface, (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface,
VulkanHelper.GetRequiredInstanceExtensions, VulkanHelper.GetRequiredInstanceExtensions,
ConfigurationState.Instance.Graphics.PreferredGpu.Value); ConfigurationState.Instance.Graphics.PreferredGpu.Value);
} }
@ -845,36 +845,39 @@ namespace Ryujinx.Ava
Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}"); Logger.Info?.PrintMsg(LogClass.Gpu, $"Backend Threading ({threadingMode}): {isGALThreaded}");
// Initialize Configuration. // Initialize Configuration.
var memoryConfiguration = ConfigurationState.Instance.System.ExpandRam.Value ? MemoryConfiguration.MemoryConfiguration8GiB : MemoryConfiguration.MemoryConfiguration4GiB; var memoryConfiguration = ConfigurationState.Instance.System.ExpandRam
? MemoryConfiguration.MemoryConfiguration8GiB
: MemoryConfiguration.MemoryConfiguration4GiB;
HLEConfiguration configuration = new(VirtualFileSystem, Device = new Switch(new HLEConfiguration(
_viewModel.LibHacHorizonManager, VirtualFileSystem,
ContentManager, _viewModel.LibHacHorizonManager,
_accountManager, ContentManager,
_userChannelPersistence, _accountManager,
renderer, _userChannelPersistence,
InitializeAudio(), renderer,
memoryConfiguration, InitializeAudio(),
_viewModel.UiHandler, memoryConfiguration,
(SystemLanguage)ConfigurationState.Instance.System.Language.Value, _viewModel.UiHandler,
(RegionCode)ConfigurationState.Instance.System.Region.Value, (SystemLanguage)ConfigurationState.Instance.System.Language.Value,
ConfigurationState.Instance.Graphics.EnableVsync, (RegionCode)ConfigurationState.Instance.System.Region.Value,
ConfigurationState.Instance.System.EnableDockedMode, ConfigurationState.Instance.Graphics.EnableVsync,
ConfigurationState.Instance.System.EnablePtc, ConfigurationState.Instance.System.EnableDockedMode,
ConfigurationState.Instance.System.EnableInternetAccess, ConfigurationState.Instance.System.EnablePtc,
ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, ConfigurationState.Instance.System.EnableInternetAccess,
ConfigurationState.Instance.System.FsGlobalAccessLogMode, ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None,
ConfigurationState.Instance.System.SystemTimeOffset, ConfigurationState.Instance.System.FsGlobalAccessLogMode,
ConfigurationState.Instance.System.TimeZone, ConfigurationState.Instance.System.SystemTimeOffset,
ConfigurationState.Instance.System.MemoryManagerMode, ConfigurationState.Instance.System.TimeZone,
ConfigurationState.Instance.System.IgnoreMissingServices, ConfigurationState.Instance.System.MemoryManagerMode,
ConfigurationState.Instance.Graphics.AspectRatio, ConfigurationState.Instance.System.IgnoreMissingServices,
ConfigurationState.Instance.System.AudioVolume, ConfigurationState.Instance.Graphics.AspectRatio,
ConfigurationState.Instance.System.UseHypervisor, ConfigurationState.Instance.System.AudioVolume,
ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value, ConfigurationState.Instance.System.UseHypervisor,
ConfigurationState.Instance.Multiplayer.Mode); ConfigurationState.Instance.Multiplayer.LanInterfaceId,
ConfigurationState.Instance.Multiplayer.Mode
Device = new Switch(configuration); )
);
} }
private static IHardwareDeviceDriver InitializeAudio() private static IHardwareDeviceDriver InitializeAudio()

View file

@ -6,33 +6,23 @@ using System;
namespace Ryujinx.Ava.Common.Locale namespace Ryujinx.Ava.Common.Locale
{ {
internal class LocaleExtension : MarkupExtension internal class LocaleExtension(LocaleKeys key) : MarkupExtension
{ {
public LocaleExtension(LocaleKeys key) public LocaleKeys Key { get; } = key;
{
Key = key;
}
public LocaleKeys Key { get; }
public override object ProvideValue(IServiceProvider serviceProvider) public override object ProvideValue(IServiceProvider serviceProvider)
{ {
LocaleKeys keyToUse = Key;
var builder = new CompiledBindingPathBuilder(); var builder = new CompiledBindingPathBuilder();
builder builder.Property(
.Property(new ClrPropertyInfo("Item", new ClrPropertyInfo("Item",
obj => (LocaleManager.Instance[keyToUse]), _ => LocaleManager.Instance[Key],
null, null,
typeof(string)), (weakRef, iPropInfo) => typeof(string)
{ ),
return PropertyInfoAccessorFactory.CreateInpcPropertyAccessor(weakRef, iPropInfo); PropertyInfoAccessorFactory.CreateInpcPropertyAccessor);
});
var path = builder.Build(); var binding = new CompiledBindingExtension(builder.Build())
var binding = new CompiledBindingExtension(path)
{ {
Source = LocaleManager.Instance Source = LocaleManager.Instance
}; };

View file

@ -36,7 +36,7 @@ namespace Ryujinx.Ava
private const uint MbIconwarning = 0x30; private const uint MbIconwarning = 0x30;
public static void Main(string[] args) public static int Main(string[] args)
{ {
Version = ReleaseInformation.Version; Version = ReleaseInformation.Version;
@ -51,7 +51,7 @@ namespace Ryujinx.Ava
LoggerAdapter.Register(); LoggerAdapter.Register();
BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); return BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
} }
public static AppBuilder BuildAvaloniaApp() public static AppBuilder BuildAvaloniaApp()

View file

@ -5,25 +5,15 @@ using System;
namespace Ryujinx.Ava.UI.Applet namespace Ryujinx.Ava.UI.Applet
{ {
class AvaloniaHostUITheme : IHostUITheme class AvaloniaHostUITheme(MainWindow parent) : IHostUITheme
{ {
public AvaloniaHostUITheme(MainWindow parent) public string FontFamily { get; } = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) ? "Segoe UI Variable" : parent.FontFamily.Name;
{
FontFamily = OperatingSystem.IsWindows() && OperatingSystem.IsWindowsVersionAtLeast(10, 0, 22000) ? "Segoe UI Variable" : parent.FontFamily.Name;
DefaultBackgroundColor = BrushToThemeColor(parent.Background);
DefaultForegroundColor = BrushToThemeColor(parent.Foreground);
DefaultBorderColor = BrushToThemeColor(parent.BorderBrush);
SelectionBackgroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush);
SelectionForegroundColor = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush);
}
public string FontFamily { get; } public ThemeColor DefaultBackgroundColor { get; } = BrushToThemeColor(parent.Background);
public ThemeColor DefaultForegroundColor { get; } = BrushToThemeColor(parent.Foreground);
public ThemeColor DefaultBackgroundColor { get; } public ThemeColor DefaultBorderColor { get; } = BrushToThemeColor(parent.BorderBrush);
public ThemeColor DefaultForegroundColor { get; } public ThemeColor SelectionBackgroundColor { get; } = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionBrush);
public ThemeColor DefaultBorderColor { get; } public ThemeColor SelectionForegroundColor { get; } = BrushToThemeColor(parent.ViewControls.SearchBox.SelectionForegroundBrush);
public ThemeColor SelectionBackgroundColor { get; }
public ThemeColor SelectionForegroundColor { get; }
private static ThemeColor BrushToThemeColor(IBrush brush) private static ThemeColor BrushToThemeColor(IBrush brush)
{ {

View file

@ -1,22 +1,18 @@
using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.Common.Locale;
using Ryujinx.UI.Common; using Ryujinx.UI.Common;
using Ryujinx.UI.Common.Helper;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Ryujinx.Ava.UI.Helpers namespace Ryujinx.Ava.UI.Helpers
{ {
internal class UserErrorDialog internal class UserErrorDialog
{ {
private const string SetupGuideUrl = "https://github.com/Ryujinx/Ryujinx/wiki/Ryujinx-Setup-&-Configuration-Guide";
private static string GetErrorCode(UserError error) private static string GetErrorCode(UserError error)
{ {
return $"RYU-{(uint)error:X4}"; return $"RYU-{(uint)error:X4}";
} }
private static string GetErrorTitle(UserError error) private static string GetErrorTitle(UserError error) =>
{ error switch
return error switch
{ {
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeys], UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeys],
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmware], UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmware],
@ -25,11 +21,9 @@ namespace Ryujinx.Ava.UI.Helpers
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknown], UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknown],
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefined], _ => LocaleManager.Instance[LocaleKeys.UserErrorUndefined],
}; };
}
private static string GetErrorDescription(UserError error) private static string GetErrorDescription(UserError error) =>
{ error switch
return error switch
{ {
UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeysDescription], UserError.NoKeys => LocaleManager.Instance[LocaleKeys.UserErrorNoKeysDescription],
UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmwareDescription], UserError.NoFirmware => LocaleManager.Instance[LocaleKeys.UserErrorNoFirmwareDescription],
@ -38,53 +32,17 @@ namespace Ryujinx.Ava.UI.Helpers
UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknownDescription], UserError.Unknown => LocaleManager.Instance[LocaleKeys.UserErrorUnknownDescription],
_ => LocaleManager.Instance[LocaleKeys.UserErrorUndefinedDescription], _ => LocaleManager.Instance[LocaleKeys.UserErrorUndefinedDescription],
}; };
}
private static bool IsCoveredBySetupGuide(UserError error)
{
return error switch
{
UserError.NoKeys or
UserError.NoFirmware or
UserError.FirmwareParsingFailed => true,
_ => false,
};
}
private static string GetSetupGuideUrl(UserError error)
{
if (!IsCoveredBySetupGuide(error))
{
return null;
}
return error switch
{
UserError.NoKeys => SetupGuideUrl + "#initial-setup---placement-of-prodkeys",
UserError.NoFirmware => SetupGuideUrl + "#initial-setup-continued---installation-of-firmware",
_ => SetupGuideUrl,
};
}
public static async Task ShowUserErrorDialog(UserError error) public static async Task ShowUserErrorDialog(UserError error)
{ {
string errorCode = GetErrorCode(error); string errorCode = GetErrorCode(error);
bool isInSetupGuide = IsCoveredBySetupGuide(error); await ContentDialogHelper.CreateInfoDialog(
string setupButtonLabel = isInSetupGuide ? LocaleManager.Instance[LocaleKeys.OpenSetupGuideMessage] : "";
var result = await ContentDialogHelper.CreateInfoDialog(
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogMessage, errorCode, GetErrorTitle(error)), LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogMessage, errorCode, GetErrorTitle(error)),
GetErrorDescription(error) + (isInSetupGuide GetErrorDescription(error),
? LocaleManager.Instance[LocaleKeys.DialogUserErrorDialogInfoMessage] "",
: ""), setupButtonLabel, LocaleManager.Instance[LocaleKeys.InputDialogOk], LocaleManager.Instance[LocaleKeys.InputDialogOk],
LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogTitle, errorCode)); LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogUserErrorDialogTitle, errorCode));
if (result == UserResult.Ok)
{
OpenHelper.OpenUrl(GetSetupGuideUrl(error));
}
} }
} }
} }

View file

@ -17,11 +17,8 @@ namespace Ryujinx.Ava.UI.ViewModels
{ {
private Bitmap _githubLogo; private Bitmap _githubLogo;
private Bitmap _discordLogo; private Bitmap _discordLogo;
private Bitmap _patreonLogo;
private Bitmap _twitterLogo;
private string _version; private string _version;
private string _supporters;
public Bitmap GithubLogo public Bitmap GithubLogo
{ {
@ -43,36 +40,6 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
public Bitmap PatreonLogo
{
get => _patreonLogo;
set
{
_patreonLogo = value;
OnPropertyChanged();
}
}
public Bitmap TwitterLogo
{
get => _twitterLogo;
set
{
_twitterLogo = value;
OnPropertyChanged();
}
}
public string Supporters
{
get => _supporters;
set
{
_supporters = value;
OnPropertyChanged();
}
}
public string Version public string Version
{ {
get => _version; get => _version;
@ -83,13 +50,12 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
public string Developers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz"); public string Developers => LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.AboutPageDeveloperListMore, "gdkchan, Ac_K, marysaka, rip in peri peri, LDj3SNuD, emmaus, Thealexbarney, GoffyDude, TSRBerry, IsaacMarovitz, GreemDev");
public AboutWindowViewModel() public AboutWindowViewModel()
{ {
Version = Program.Version; Version = Program.Version;
UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value); UpdateLogoTheme(ConfigurationState.Instance.UI.BaseStyle.Value);
Dispatcher.UIThread.InvokeAsync(DownloadPatronsJson);
ThemeManager.ThemeChanged += ThemeManager_ThemeChanged; ThemeManager.ThemeChanged += ThemeManager_ThemeChanged;
} }
@ -108,8 +74,6 @@ namespace Ryujinx.Ava.UI.ViewModels
GithubLogo = LoadBitmap($"{basePath}Logo_GitHub_{themeSuffix}?assembly=Ryujinx.UI.Common"); GithubLogo = LoadBitmap($"{basePath}Logo_GitHub_{themeSuffix}?assembly=Ryujinx.UI.Common");
DiscordLogo = LoadBitmap($"{basePath}Logo_Discord_{themeSuffix}?assembly=Ryujinx.UI.Common"); DiscordLogo = LoadBitmap($"{basePath}Logo_Discord_{themeSuffix}?assembly=Ryujinx.UI.Common");
PatreonLogo = LoadBitmap($"{basePath}Logo_Patreon_{themeSuffix}?assembly=Ryujinx.UI.Common");
TwitterLogo = LoadBitmap($"{basePath}Logo_Twitter_{themeSuffix}?assembly=Ryujinx.UI.Common");
} }
private Bitmap LoadBitmap(string uri) private Bitmap LoadBitmap(string uri)
@ -122,28 +86,5 @@ namespace Ryujinx.Ava.UI.ViewModels
ThemeManager.ThemeChanged -= ThemeManager_ThemeChanged; ThemeManager.ThemeChanged -= ThemeManager_ThemeChanged;
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
private async Task DownloadPatronsJson()
{
if (!NetworkInterface.GetIsNetworkAvailable())
{
Supporters = LocaleManager.Instance[LocaleKeys.ConnectionError];
return;
}
HttpClient httpClient = new();
try
{
string patreonJsonString = await httpClient.GetStringAsync("https://patreon.ryujinx.org/");
Supporters = string.Join(", ", JsonHelper.Deserialize(patreonJsonString, CommonJsonContext.Default.StringArray)) + "\n\n";
}
catch
{
Supporters = LocaleManager.Instance[LocaleKeys.ApiError];
}
}
} }
} }

View file

@ -911,7 +911,8 @@ namespace Ryujinx.Ava.UI.ViewModels
public KeyGesture PauseKey public KeyGesture PauseKey
{ {
get => KeyGesture.Parse(_pauseKey); set get => KeyGesture.Parse(_pauseKey);
set
{ {
_pauseKey = value.ToString(); _pauseKey = value.ToString();

View file

@ -83,18 +83,13 @@
LineHeight="12" LineHeight="12"
Text="{Binding Version}" Text="{Binding Version}"
TextAlignment="Center" /> TextAlignment="Center" />
<Button <Border
Padding="5"
HorizontalAlignment="Center" Height="1"
Background="Transparent" Margin="0,20, 0, 20"
Click="Button_OnClick" HorizontalAlignment="Stretch"
Tag="https://github.com/Ryujinx/Ryujinx/wiki/Changelog#ryujinx-changelog"> BorderBrush="{DynamicResource ThemeControlBorderColor}"
<TextBlock BorderThickness="0,1,0,0" />
FontSize="10"
Text="{locale:Locale AboutChangelogButton}"
TextAlignment="Center"
ToolTip.Tip="{locale:Locale AboutChangelogButtonTooltipMessage}" />
</Button>
</StackPanel> </StackPanel>
<StackPanel <StackPanel
Grid.Row="2" Grid.Row="2"
@ -132,20 +127,7 @@
Background="Transparent" Background="Transparent"
Click="Button_OnClick" Click="Button_OnClick"
CornerRadius="15" CornerRadius="15"
Tag="https://www.patreon.com/ryujinx" Tag="https://github.com/GreemDev/Ryujinx"
ToolTip.Tip="{locale:Locale AboutPatreonUrlTooltipMessage}">
<Image Source="{Binding PatreonLogo}" />
</Button>
<Button
MinWidth="30"
MinHeight="30"
MaxWidth="30"
MaxHeight="30"
Padding="8"
Background="Transparent"
Click="Button_OnClick"
CornerRadius="15"
Tag="https://github.com/Ryujinx/Ryujinx"
ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}"> ToolTip.Tip="{locale:Locale AboutGithubUrlTooltipMessage}">
<Image Source="{Binding GithubLogo}" /> <Image Source="{Binding GithubLogo}" />
</Button> </Button>
@ -162,32 +144,6 @@
ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}"> ToolTip.Tip="{locale:Locale AboutDiscordUrlTooltipMessage}">
<Image Source="{Binding DiscordLogo}" /> <Image Source="{Binding DiscordLogo}" />
</Button> </Button>
<Button
MinWidth="30"
MinHeight="30"
MaxWidth="30"
MaxHeight="30"
Padding="8"
Background="Transparent"
Click="Button_OnClick"
CornerRadius="15"
Tag="https://twitter.com/RyujinxEmu"
ToolTip.Tip="{locale:Locale AboutTwitterUrlTooltipMessage}">
<Image Source="{Binding TwitterLogo}" />
</Button>
<Button
MinWidth="30"
MinHeight="30"
MaxWidth="30"
MaxHeight="30"
Padding="8"
Background="Transparent"
Click="Button_OnClick"
CornerRadius="15"
Tag="https://www.ryujinx.org"
ToolTip.Tip="{locale:Locale AboutUrlTooltipMessage}">
<ui:SymbolIcon Foreground="{DynamicResource ThemeForegroundColor}" Symbol="Link" />
</Button>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</Grid> </Grid>
@ -205,7 +161,6 @@
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel <StackPanel
Grid.Row="0" Grid.Row="0"
@ -237,7 +192,7 @@
HorizontalAlignment="Left" HorizontalAlignment="Left"
Background="Transparent" Background="Transparent"
Click="Button_OnClick" Click="Button_OnClick"
Tag="https://github.com/Ryujinx/Ryujinx/graphs/contributors?type=a"> Tag="https://github.com/GreemDev/Ryujinx/graphs/contributors?type=a">
<TextBlock <TextBlock
FontSize="10" FontSize="10"
Text="{locale:Locale AboutRyujinxContributorsButtonHeader}" Text="{locale:Locale AboutRyujinxContributorsButtonHeader}"
@ -245,26 +200,6 @@
ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" /> ToolTip.Tip="{locale:Locale AboutRyujinxMaintainersContentTooltipMessage}" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel
Grid.Row="2"
Margin="0,10,0,0"
Spacing="2">
<TextBlock
FontSize="15"
FontWeight="Bold"
Text="{locale:Locale AboutRyujinxSupprtersTitle}" />
<ScrollViewer
Height="70"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Visible">
<TextBlock
Name="SupportersTextBlock"
VerticalAlignment="Top"
FontSize="10"
Text="{Binding Supporters}"
TextWrapping="Wrap" />
</ScrollViewer>
</StackPanel>
</Grid> </Grid>
</Grid> </Grid>
</UserControl> </UserControl>