Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2666a15ffb | |||
| bc6de21846 | |||
| 8052a5480c | |||
| 2df1d50901 | |||
| 95a8890bc2 |
+3433
-3422
File diff suppressed because it is too large
Load Diff
@@ -10435,7 +10435,7 @@
|
|||||||
"it_IT": "Finestra di input",
|
"it_IT": "Finestra di input",
|
||||||
"ja_JP": "入力ダイアログ",
|
"ja_JP": "入力ダイアログ",
|
||||||
"ko_KR": "대화 상자 입력",
|
"ko_KR": "대화 상자 입력",
|
||||||
"no_NO": "",
|
"no_NO": "Dialogboksen Inndata",
|
||||||
"pl_PL": "Okno Dialogowe Wprowadzania",
|
"pl_PL": "Okno Dialogowe Wprowadzania",
|
||||||
"pt_BR": "Diálogo de texto",
|
"pt_BR": "Diálogo de texto",
|
||||||
"ru_RU": "Диалоговое окно ввода",
|
"ru_RU": "Диалоговое окно ввода",
|
||||||
@@ -22610,7 +22610,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Denne kompatibilitetslisten kan inneholde oppføringer som er tomme for data.\nVær ikke imot å teste spill i statusen «Ingame».",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22635,7 +22635,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Søk i kompatibilitetsoppføringer...",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22660,7 +22660,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Åpne kompatibilitetslisten",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22685,7 +22685,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Vis bare eide spill",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22710,7 +22710,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Spillbar",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22760,7 +22760,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Menyer",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22785,7 +22785,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Starter",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22810,7 +22810,7 @@
|
|||||||
"it_IT": "",
|
"it_IT": "",
|
||||||
"ja_JP": "",
|
"ja_JP": "",
|
||||||
"ko_KR": "",
|
"ko_KR": "",
|
||||||
"no_NO": "",
|
"no_NO": "Ingenting",
|
||||||
"pl_PL": "",
|
"pl_PL": "",
|
||||||
"pt_BR": "",
|
"pt_BR": "",
|
||||||
"ru_RU": "",
|
"ru_RU": "",
|
||||||
@@ -22823,4 +22823,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,71 +1,50 @@
|
|||||||
using Gommon;
|
using Gommon;
|
||||||
using nietras.SeparatedValues;
|
using nietras.SeparatedValues;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Common.Logging;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Utilities.Compat
|
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
|
public class CompatibilityCsv
|
||||||
{
|
{
|
||||||
static CompatibilityCsv()
|
public static CompatibilityCsv Shared { get; set; }
|
||||||
{
|
|
||||||
using Stream csvStream = Assembly.GetExecutingAssembly()
|
|
||||||
.GetManifestResourceStream("RyujinxGameCompatibilityList")!;
|
|
||||||
csvStream.Position = 0;
|
|
||||||
|
|
||||||
LoadFromStream(csvStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void LoadFromStream(Stream stream)
|
public CompatibilityCsv(SepReader reader)
|
||||||
{
|
{
|
||||||
var reader = Sep.Reader().From(stream);
|
var entries = new List<CompatibilityEntry>();
|
||||||
var columnIndices = new ColumnIndices(reader.Header);
|
|
||||||
|
|
||||||
Entries = reader
|
foreach (var row in reader)
|
||||||
.Enumerate(row => new CompatibilityEntry(ref columnIndices, row))
|
{
|
||||||
.OrderBy(it => it.GameName)
|
entries.Add(new CompatibilityEntry(reader.Header, row));
|
||||||
.ToArray();
|
}
|
||||||
|
|
||||||
Logger.Debug?.Print(LogClass.UI, "Compatibility CSV loaded.");
|
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 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)
|
TitleId = !string.IsNullOrEmpty(titleIdRow)
|
||||||
? titleIdRow
|
? titleIdRow
|
||||||
: default(Optional<string>);
|
: 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(';');
|
IssueLabels = ColStr(row[header.IndexOf("\"labels\"")]).Split(';');
|
||||||
Status = ColStr(row[indices.Status]).ToLower() switch
|
Status = ColStr(row[header.IndexOf("\"status\"")]).ToLower() switch
|
||||||
{
|
{
|
||||||
"playable" => LocaleKeys.CompatibilityListPlayable,
|
"playable" => LocaleKeys.CompatibilityListPlayable,
|
||||||
"ingame" => LocaleKeys.CompatibilityListIngame,
|
"ingame" => LocaleKeys.CompatibilityListIngame,
|
||||||
@@ -75,8 +54,8 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
_ => null
|
_ => null
|
||||||
};
|
};
|
||||||
|
|
||||||
if (DateTime.TryParse(ColStr(row[indices.LastUpdated]), out var dt))
|
if (DateTime.TryParse(ColStr(row[header.IndexOf("\"last_updated\"")]), out var dt))
|
||||||
LastUpdated = dt;
|
LastEvent = dt;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -85,15 +64,15 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
|
|
||||||
public string GameName { get; }
|
public string GameName { get; }
|
||||||
public Optional<string> TitleId { get; }
|
public Optional<string> TitleId { get; }
|
||||||
public string[] Labels { get; }
|
public string[] IssueLabels { get; }
|
||||||
public LocaleKeys? Status { get; }
|
public LocaleKeys? Status { get; }
|
||||||
public DateTime LastUpdated { get; }
|
public DateTime LastEvent { get; }
|
||||||
|
|
||||||
public string LocalizedStatus => LocaleManager.Instance[Status!.Value];
|
public string LocalizedStatus => LocaleManager.Instance[Status!.Value];
|
||||||
public string FormattedTitleId => TitleId
|
public string FormattedTitleId => TitleId
|
||||||
.OrElse(new string(' ', 16));
|
.OrElse(new string(' ', 16));
|
||||||
|
|
||||||
public string FormattedIssueLabels => Labels
|
public string FormattedIssueLabels => IssueLabels
|
||||||
.Where(it => !it.StartsWithIgnoreCase("status"))
|
.Where(it => !it.StartsWithIgnoreCase("status"))
|
||||||
.Select(FormatLabelName)
|
.Select(FormatLabelName)
|
||||||
.JoinToString(", ");
|
.JoinToString(", ");
|
||||||
@@ -103,9 +82,9 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
var sb = new StringBuilder("CompatibilityEntry: {");
|
var sb = new StringBuilder("CompatibilityEntry: {");
|
||||||
sb.Append($"{nameof(GameName)}=\"{GameName}\", ");
|
sb.Append($"{nameof(GameName)}=\"{GameName}\", ");
|
||||||
sb.Append($"{nameof(TitleId)}={TitleId}, ");
|
sb.Append($"{nameof(TitleId)}={TitleId}, ");
|
||||||
sb.Append($"{nameof(Labels)}=\"{Labels}\", ");
|
sb.Append($"{nameof(IssueLabels)}=\"{IssueLabels}\", ");
|
||||||
sb.Append($"{nameof(Status)}=\"{Status}\", ");
|
sb.Append($"{nameof(Status)}=\"{Status}\", ");
|
||||||
sb.Append($"{nameof(LastUpdated)}=\"{LastUpdated}\"");
|
sb.Append($"{nameof(LastEvent)}=\"{LastEvent}\"");
|
||||||
sb.Append('}');
|
sb.Append('}');
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|||||||
@@ -14,6 +14,15 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
{
|
{
|
||||||
public static async Task Show()
|
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()
|
ContentDialog contentDialog = new()
|
||||||
{
|
{
|
||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
|
|||||||
@@ -11,13 +11,14 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
{
|
{
|
||||||
[ObservableProperty] private bool _onlyShowOwnedGames = true;
|
[ObservableProperty] private bool _onlyShowOwnedGames = true;
|
||||||
|
|
||||||
private IEnumerable<CompatibilityEntry> _currentEntries = CompatibilityCsv.Entries;
|
private IEnumerable<CompatibilityEntry> _currentEntries = CompatibilityCsv.Shared.Entries;
|
||||||
private readonly string[] _ownedGameTitleIds = [];
|
private readonly string[] _ownedGameTitleIds = [];
|
||||||
private readonly ApplicationLibrary _appLibrary;
|
private readonly ApplicationLibrary _appLibrary;
|
||||||
|
|
||||||
public IEnumerable<CompatibilityEntry> CurrentEntries => OnlyShowOwnedGames
|
public IEnumerable<CompatibilityEntry> CurrentEntries => OnlyShowOwnedGames
|
||||||
? _currentEntries.Where(x =>
|
? _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;
|
: _currentEntries;
|
||||||
|
|
||||||
public CompatibilityViewModel() {}
|
public CompatibilityViewModel() {}
|
||||||
@@ -38,11 +39,11 @@ namespace Ryujinx.Ava.Utilities.Compat
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(searchTerm))
|
if (string.IsNullOrEmpty(searchTerm))
|
||||||
{
|
{
|
||||||
SetEntries(CompatibilityCsv.Entries);
|
SetEntries(CompatibilityCsv.Shared.Entries);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEntries(CompatibilityCsv.Entries.Where(x =>
|
SetEntries(CompatibilityCsv.Shared.Entries.Where(x =>
|
||||||
x.GameName.ContainsIgnoreCase(searchTerm)
|
x.GameName.ContainsIgnoreCase(searchTerm)
|
||||||
|| x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm))));
|
|| x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm))));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user