Compare commits
4 Commits
Canary-1.2
...
e3aa24c17c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3aa24c17c | ||
|
|
d0175a63f4 | ||
|
|
2d0b679338 | ||
|
|
aef1185978 |
File diff suppressed because it is too large
Load Diff
@@ -1564,7 +1564,7 @@
|
||||
"pl_PL": "Wersja",
|
||||
"pt_BR": "Versão",
|
||||
"ru_RU": "Версия",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Version",
|
||||
"th_TH": "เวอร์ชั่น",
|
||||
"tr_TR": "Sürüm",
|
||||
"uk_UA": "Версія",
|
||||
@@ -3264,7 +3264,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "Sistema",
|
||||
"ru_RU": "Система",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "System",
|
||||
"th_TH": "ระบบ",
|
||||
"tr_TR": "Sistem",
|
||||
"uk_UA": "Система",
|
||||
@@ -3339,7 +3339,7 @@
|
||||
"pl_PL": "Japonia",
|
||||
"pt_BR": "Japão",
|
||||
"ru_RU": "Япония",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Japan",
|
||||
"th_TH": "ญี่ปุ่น",
|
||||
"tr_TR": "Japonya",
|
||||
"uk_UA": "Японія",
|
||||
@@ -3364,7 +3364,7 @@
|
||||
"pl_PL": "Stany Zjednoczone",
|
||||
"pt_BR": "EUA",
|
||||
"ru_RU": "США",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "USA",
|
||||
"th_TH": "สหรัฐอเมริกา",
|
||||
"tr_TR": "ABD",
|
||||
"uk_UA": "США",
|
||||
@@ -3464,7 +3464,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "Coreia",
|
||||
"ru_RU": "Корея",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Korea",
|
||||
"th_TH": "เกาหลี",
|
||||
"tr_TR": "Kore",
|
||||
"uk_UA": "Корея",
|
||||
@@ -3489,7 +3489,7 @@
|
||||
"pl_PL": "Tajwan",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Тайвань",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Taiwan",
|
||||
"th_TH": "ไต้หวัน",
|
||||
"tr_TR": "Tayvan",
|
||||
"uk_UA": "Тайвань",
|
||||
@@ -4139,7 +4139,7 @@
|
||||
"pl_PL": "Atrapa",
|
||||
"pt_BR": "Nenhuma",
|
||||
"ru_RU": "Без звука",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Ingenting",
|
||||
"th_TH": "",
|
||||
"tr_TR": "Yapay",
|
||||
"uk_UA": "",
|
||||
@@ -5664,7 +5664,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Ok",
|
||||
"th_TH": "ตกลง",
|
||||
"tr_TR": "Tamam",
|
||||
"uk_UA": "Гаразд",
|
||||
@@ -12439,7 +12439,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "{0}: {1}",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "",
|
||||
@@ -14289,7 +14289,7 @@
|
||||
"pl_PL": "Seria Amiibo",
|
||||
"pt_BR": "Franquia Amiibo",
|
||||
"ru_RU": "Серия Amiibo",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Amiibo-serien",
|
||||
"th_TH": "",
|
||||
"tr_TR": "Amiibo Serisi",
|
||||
"uk_UA": "Серія Amiibo",
|
||||
@@ -17439,7 +17439,7 @@
|
||||
"pl_PL": "Wersja {0}",
|
||||
"pt_BR": "Versão {0}",
|
||||
"ru_RU": "Версия {0}",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Version {0}",
|
||||
"th_TH": "เวอร์ชั่น {0}",
|
||||
"tr_TR": "Sürüm {0}",
|
||||
"uk_UA": "Версія {0}",
|
||||
@@ -17664,7 +17664,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "Ryujinx - Informação",
|
||||
"ru_RU": "Ryujinx - Информация",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Ryujinx - Info",
|
||||
"th_TH": "Ryujinx – ข้อมูล",
|
||||
"tr_TR": "Ryujinx - Bilgi",
|
||||
"uk_UA": "Ryujin x - Інформація",
|
||||
@@ -19639,7 +19639,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "{0:n0} Мб",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "{0:n0} Mb",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "{0:n0} Мб",
|
||||
@@ -20914,7 +20914,7 @@
|
||||
"pl_PL": "Głoś",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Громкость",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "Vol",
|
||||
"th_TH": "ระดับเสียง",
|
||||
"tr_TR": "Ses",
|
||||
"uk_UA": "Гуч.",
|
||||
@@ -22214,7 +22214,7 @@
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Вертикальная синхронизация:",
|
||||
"sv_SE": "",
|
||||
"sv_SE": "VSync:",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Вертикальна синхронізація (VSync):",
|
||||
@@ -22823,4 +22823,4 @@
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,71 +1,50 @@
|
||||
using Gommon;
|
||||
using nietras.SeparatedValues;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Common.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
namespace Ryujinx.Ava.Utilities.Compat
|
||||
{
|
||||
public struct ColumnIndices(SepReaderHeader header)
|
||||
{
|
||||
public const string TitleIdCol = "\"title_id\"";
|
||||
public const string GameNameCol = "\"game_name\"";
|
||||
public const string LabelsCol = "\"labels\"";
|
||||
public const string StatusCol = "\"status\"";
|
||||
public const string LastUpdatedCol = "\"last_updated\"";
|
||||
|
||||
public readonly int TitleId = header.IndexOf(TitleIdCol);
|
||||
public readonly int GameName = header.IndexOf(GameNameCol);
|
||||
public readonly int Labels = header.IndexOf(LabelsCol);
|
||||
public readonly int Status = header.IndexOf(StatusCol);
|
||||
public readonly int LastUpdated = header.IndexOf(LastUpdatedCol);
|
||||
}
|
||||
|
||||
public class CompatibilityCsv
|
||||
{
|
||||
static CompatibilityCsv()
|
||||
{
|
||||
using Stream csvStream = Assembly.GetExecutingAssembly()
|
||||
.GetManifestResourceStream("RyujinxGameCompatibilityList")!;
|
||||
csvStream.Position = 0;
|
||||
|
||||
LoadFromStream(csvStream);
|
||||
}
|
||||
public static CompatibilityCsv Shared { get; set; }
|
||||
|
||||
public static void LoadFromStream(Stream stream)
|
||||
public CompatibilityCsv(SepReader reader)
|
||||
{
|
||||
var reader = Sep.Reader().From(stream);
|
||||
var columnIndices = new ColumnIndices(reader.Header);
|
||||
var entries = new List<CompatibilityEntry>();
|
||||
|
||||
Entries = reader
|
||||
.Enumerate(row => new CompatibilityEntry(ref columnIndices, row))
|
||||
.OrderBy(it => it.GameName)
|
||||
.ToArray();
|
||||
|
||||
Logger.Debug?.Print(LogClass.UI, "Compatibility CSV loaded.");
|
||||
foreach (var row in reader)
|
||||
{
|
||||
entries.Add(new CompatibilityEntry(reader.Header, row));
|
||||
}
|
||||
|
||||
Entries = entries.Where(x => x.Status != null)
|
||||
.OrderBy(it => it.GameName).ToArray();
|
||||
}
|
||||
|
||||
public static CompatibilityEntry[] Entries { get; private set; }
|
||||
public CompatibilityEntry[] Entries { get; }
|
||||
}
|
||||
|
||||
public class CompatibilityEntry
|
||||
{
|
||||
public CompatibilityEntry(ref ColumnIndices indices, SepReader.Row row)
|
||||
public CompatibilityEntry(SepReaderHeader header, SepReader.Row row)
|
||||
{
|
||||
var titleIdRow = ColStr(row[indices.TitleId]);
|
||||
if (row.ColCount != header.ColNames.Count)
|
||||
throw new InvalidDataException($"CSV row {row.RowIndex} ({row.ToString()}) has mismatched column count");
|
||||
|
||||
var titleIdRow = ColStr(row[header.IndexOf("\"title_id\"")]);
|
||||
TitleId = !string.IsNullOrEmpty(titleIdRow)
|
||||
? titleIdRow
|
||||
: default(Optional<string>);
|
||||
|
||||
GameName = ColStr(row[indices.GameName]).Trim().Trim('"');
|
||||
GameName = ColStr(row[header.IndexOf("\"game_name\"")]).Trim().Trim('"');
|
||||
|
||||
Labels = ColStr(row[indices.Labels]).Split(';');
|
||||
Status = ColStr(row[indices.Status]).ToLower() switch
|
||||
IssueLabels = ColStr(row[header.IndexOf("\"labels\"")]).Split(';');
|
||||
Status = ColStr(row[header.IndexOf("\"status\"")]).ToLower() switch
|
||||
{
|
||||
"playable" => LocaleKeys.CompatibilityListPlayable,
|
||||
"ingame" => LocaleKeys.CompatibilityListIngame,
|
||||
@@ -75,8 +54,8 @@ namespace Ryujinx.Ava.Utilities.Compat
|
||||
_ => null
|
||||
};
|
||||
|
||||
if (DateTime.TryParse(ColStr(row[indices.LastUpdated]), out var dt))
|
||||
LastUpdated = dt;
|
||||
if (DateTime.TryParse(ColStr(row[header.IndexOf("\"last_updated\"")]), out var dt))
|
||||
LastEvent = dt;
|
||||
|
||||
return;
|
||||
|
||||
@@ -85,15 +64,15 @@ namespace Ryujinx.Ava.Utilities.Compat
|
||||
|
||||
public string GameName { get; }
|
||||
public Optional<string> TitleId { get; }
|
||||
public string[] Labels { get; }
|
||||
public string[] IssueLabels { get; }
|
||||
public LocaleKeys? Status { get; }
|
||||
public DateTime LastUpdated { get; }
|
||||
public DateTime LastEvent { get; }
|
||||
|
||||
public string LocalizedStatus => LocaleManager.Instance[Status!.Value];
|
||||
public string FormattedTitleId => TitleId
|
||||
.OrElse(new string(' ', 16));
|
||||
|
||||
public string FormattedIssueLabels => Labels
|
||||
public string FormattedIssueLabels => IssueLabels
|
||||
.Where(it => !it.StartsWithIgnoreCase("status"))
|
||||
.Select(FormatLabelName)
|
||||
.JoinToString(", ");
|
||||
@@ -103,9 +82,9 @@ namespace Ryujinx.Ava.Utilities.Compat
|
||||
var sb = new StringBuilder("CompatibilityEntry: {");
|
||||
sb.Append($"{nameof(GameName)}=\"{GameName}\", ");
|
||||
sb.Append($"{nameof(TitleId)}={TitleId}, ");
|
||||
sb.Append($"{nameof(Labels)}=\"{Labels}\", ");
|
||||
sb.Append($"{nameof(IssueLabels)}=\"{IssueLabels}\", ");
|
||||
sb.Append($"{nameof(Status)}=\"{Status}\", ");
|
||||
sb.Append($"{nameof(LastUpdated)}=\"{LastUpdated}\"");
|
||||
sb.Append($"{nameof(LastEvent)}=\"{LastEvent}\"");
|
||||
sb.Append('}');
|
||||
|
||||
return sb.ToString();
|
||||
|
||||
@@ -14,6 +14,15 @@ namespace Ryujinx.Ava.Utilities.Compat
|
||||
{
|
||||
public static async Task Show()
|
||||
{
|
||||
if (CompatibilityCsv.Shared is null)
|
||||
{
|
||||
await using Stream csvStream = Assembly.GetExecutingAssembly()
|
||||
.GetManifestResourceStream("RyujinxGameCompatibilityList")!;
|
||||
csvStream.Position = 0;
|
||||
|
||||
CompatibilityCsv.Shared = new CompatibilityCsv(Sep.Reader().From(csvStream));
|
||||
}
|
||||
|
||||
ContentDialog contentDialog = new()
|
||||
{
|
||||
PrimaryButtonText = string.Empty,
|
||||
|
||||
@@ -11,13 +11,14 @@ namespace Ryujinx.Ava.Utilities.Compat
|
||||
{
|
||||
[ObservableProperty] private bool _onlyShowOwnedGames = true;
|
||||
|
||||
private IEnumerable<CompatibilityEntry> _currentEntries = CompatibilityCsv.Entries;
|
||||
private IEnumerable<CompatibilityEntry> _currentEntries = CompatibilityCsv.Shared.Entries;
|
||||
private readonly string[] _ownedGameTitleIds = [];
|
||||
private readonly ApplicationLibrary _appLibrary;
|
||||
|
||||
public IEnumerable<CompatibilityEntry> CurrentEntries => OnlyShowOwnedGames
|
||||
? _currentEntries.Where(x =>
|
||||
x.TitleId.Check(tid => _ownedGameTitleIds.ContainsIgnoreCase(tid)))
|
||||
x.TitleId.Check(tid => _ownedGameTitleIds.ContainsIgnoreCase(tid))
|
||||
|| _appLibrary.Applications.Items.Any(a => a.Name.EqualsIgnoreCase(x.GameName)))
|
||||
: _currentEntries;
|
||||
|
||||
public CompatibilityViewModel() {}
|
||||
@@ -38,11 +39,11 @@ namespace Ryujinx.Ava.Utilities.Compat
|
||||
{
|
||||
if (string.IsNullOrEmpty(searchTerm))
|
||||
{
|
||||
SetEntries(CompatibilityCsv.Entries);
|
||||
SetEntries(CompatibilityCsv.Shared.Entries);
|
||||
return;
|
||||
}
|
||||
|
||||
SetEntries(CompatibilityCsv.Entries.Where(x =>
|
||||
SetEntries(CompatibilityCsv.Shared.Entries.Where(x =>
|
||||
x.GameName.ContainsIgnoreCase(searchTerm)
|
||||
|| x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm))));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user