Compare commits

...

3 Commits

9 changed files with 300 additions and 22 deletions

View File

@@ -1673,7 +1673,132 @@
}
},
{
"ID": "GameListHeaderPath",
"ID": "GameListSortDeveloper",
"Translations": {
"ar_SA": "المطور",
"de_DE": "Entwickler",
"el_GR": "Προγραμματιστής",
"en_US": "Developer",
"es_ES": "Desarrollador",
"fr_FR": "Développeur",
"he_IL": "מפתח",
"it_IT": "Sviluppatore",
"ja_JP": "開発元",
"ko_KR": "개발자",
"no_NO": "Utvikler",
"pl_PL": "Twórca",
"pt_BR": "Desenvolvedor",
"ru_RU": "Разработчик",
"sv_SE": "Utvecklare",
"th_TH": "ผู้พัฒนา",
"tr_TR": "Geliştirici",
"uk_UA": "Розробник",
"zh_CN": "制作商",
"zh_TW": "開發者"
}
},
{
"ID": "GameListSortTimePlayed",
"Translations": {
"ar_SA": "وقت اللعب",
"de_DE": "Spielzeit",
"el_GR": "Χρόνος",
"en_US": "Play Time",
"es_ES": "Tiempo jugado",
"fr_FR": "Temps de jeu",
"he_IL": "זמן משחק",
"it_IT": "Tempo di gioco",
"ja_JP": "プレイ時間",
"ko_KR": "플레이 타임",
"no_NO": "Spilletid",
"pl_PL": "Czas w grze:",
"pt_BR": "Tempo de jogo",
"ru_RU": "Время в игре",
"sv_SE": "Speltid",
"th_TH": "เล่นไปแล้ว",
"tr_TR": "Oynama Süresi",
"uk_UA": "Зіграно часу",
"zh_CN": "游玩时长",
"zh_TW": "遊玩時數"
}
},
{
"ID": "GameListSortLastPlayed",
"Translations": {
"ar_SA": "آخر مرة لُعبت",
"de_DE": "Zuletzt gespielt",
"el_GR": "Παίχτηκε",
"en_US": "Last Played",
"es_ES": "Jugado por última vez",
"fr_FR": "Dernière partie jouée",
"he_IL": "שוחק לאחרונה",
"it_IT": "Ultima partita",
"ja_JP": "最終プレイ日時",
"ko_KR": "마지막 플레이",
"no_NO": "Sist Spilt",
"pl_PL": "Ostatnio grane",
"pt_BR": "Último jogo",
"ru_RU": "Последний запуск",
"sv_SE": "Senast spelad",
"th_TH": "เล่นล่าสุด",
"tr_TR": "Son Oynama Tarihi",
"uk_UA": "Востаннє зіграно",
"zh_CN": "最近游玩",
"zh_TW": "最近遊玩"
}
},
{
"ID": "GameListSortFileExtension",
"Translations": {
"ar_SA": "صيغة الملف",
"de_DE": "Dateiformat",
"el_GR": "Κατάληξη",
"en_US": "File Ext",
"es_ES": "Extensión",
"fr_FR": "Extension du Fichier",
"he_IL": "סיומת קובץ",
"it_IT": "Estensione",
"ja_JP": "ファイル拡張子",
"ko_KR": "파일 확장자",
"no_NO": "Fil Eks.",
"pl_PL": "Rozszerzenie pliku",
"pt_BR": "Extensão",
"ru_RU": "Расширение файла",
"sv_SE": "Filänd",
"th_TH": "นามสกุลไฟล์",
"tr_TR": "Dosya Uzantısı",
"uk_UA": "Розширення файлу",
"zh_CN": "扩展名",
"zh_TW": "副檔名"
}
},
{
"ID": "GameListSortFileSize",
"Translations": {
"ar_SA": "حجم الملف",
"de_DE": "Dateigröße",
"el_GR": "Μέγεθος Αρχείου",
"en_US": "File Size",
"es_ES": "Tamaño del archivo",
"fr_FR": "Taille du Fichier",
"he_IL": "גודל הקובץ",
"it_IT": "Dimensione file",
"ja_JP": "ファイルサイズ",
"ko_KR": "파일 크기",
"no_NO": "Fil Størrelse",
"pl_PL": "Rozmiar pliku",
"pt_BR": "Tamanho",
"ru_RU": "Размер файла",
"sv_SE": "Filstorlek",
"th_TH": "ขนาดไฟล์",
"tr_TR": "Dosya Boyutu",
"uk_UA": "Розмір файлу",
"zh_CN": "大小",
"zh_TW": "檔案大小"
}
},
{
"ID": "GameListSortPath",
"Translations": {
"ar_SA": "المسار",
"de_DE": "Pfad",
@@ -23372,6 +23497,131 @@
"zh_TW": "無法啟動"
}
},
{
"ID": "CompatibilityListPlayableTooltip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Boots and plays without any crashes or GPU bugs of any kind, and at a speed fast enough to reasonably enjoy on an average PC.",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "CompatibilityListIngameTooltip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Boots and goes in-game but suffers from one or more of the following: crashes, deadlocks, GPU bugs, distractingly bad audio, or is simply too slow. Game still might able to be played all the way through, but not as the game is intended to play.",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "CompatibilityListMenusTooltip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Boots and goes past the title screen but does not make it into main gameplay.",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "CompatibilityListBootsTooltip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Boots but does not make it past the title screen.",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "CompatibilityListNothingTooltip",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Does not boot or shows no signs of activity.",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "ExtractAocListHeader",
"Translations": {

View File

@@ -41,13 +41,12 @@
HorizontalAlignment="Left"
Orientation="Vertical"
Spacing="5">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal" IsVisible="{Binding AppData.HasPlayabilityInfo}">
<TextBlock Padding="0, 0, 5, 0" Text="{ext:Locale GameListHeaderCompatibilityStatus}" />
<Button
Click="PlayabilityStatus_OnClick"
HorizontalContentAlignment="Left"
VerticalAlignment="Center"
IsVisible="{Binding AppData.HasPlayabilityInfo}"
Background="{DynamicResource AppListBackgroundColor}"
Padding="0">
<TextBlock
@@ -55,6 +54,7 @@
Tag="{Binding AppData.IdString}"
Text="{Binding AppData.LocalizedStatus}"
Foreground="{Binding AppData.PlayabilityStatus, Converter={x:Static helpers:PlayabilityStatusConverter.Shared}}"
ToolTip.Tip="{Binding AppData.LocalizedStatusTooltip}"
TextAlignment="Start"
TextWrapping="Wrap" />
<Button.Styles>

View File

@@ -93,7 +93,8 @@
IsVisible="{Binding HasPlayabilityInfo}"
Background="{DynamicResource AppListBackgroundColor}"
Margin="-1, 0, 0, 0"
Padding="0" >
Padding="0"
ToolTip.Tip="{Binding LocalizedStatusTooltip}">
<TextBlock
Margin="1.5"
Tag="{Binding IdString}"
@@ -141,7 +142,7 @@
<TextBlock
HorizontalAlignment="Stretch"
IsVisible="{Binding HasLdnGames}"
Text="{Binding Converter={helpers:MultiplayerInfoConverter}}"
Text="{Binding Converter={x:Static helpers:MultiplayerInfoConverter.Instance}}"
TextAlignment="Start"
TextWrapping="Wrap"/>
</StackPanel>

View File

@@ -11,7 +11,7 @@ namespace Ryujinx.Ava.UI.Helpers
{
internal class MultiplayerInfoConverter : MarkupExtension, IValueConverter
{
private static readonly MultiplayerInfoConverter _instance = new();
public static readonly MultiplayerInfoConverter Instance = new();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
@@ -35,7 +35,7 @@ namespace Ryujinx.Ava.UI.Helpers
public override object ProvideValue(IServiceProvider serviceProvider)
{
return _instance;
return Instance;
}
}
}

View File

@@ -633,15 +633,15 @@ namespace Ryujinx.Ava.UI.ViewModels
{
return SortMode switch
{
ApplicationSort.Title => LocaleManager.Instance[LocaleKeys.GameListHeaderApplication],
ApplicationSort.Developer => LocaleManager.Instance[LocaleKeys.GameListHeaderDeveloper],
ApplicationSort.LastPlayed => LocaleManager.Instance[LocaleKeys.GameListHeaderLastPlayed],
ApplicationSort.TotalTimePlayed => LocaleManager.Instance[LocaleKeys.GameListHeaderTimePlayed],
ApplicationSort.FileType => LocaleManager.Instance[LocaleKeys.GameListHeaderFileExtension],
ApplicationSort.FileSize => LocaleManager.Instance[LocaleKeys.GameListHeaderFileSize],
ApplicationSort.Path => LocaleManager.Instance[LocaleKeys.GameListHeaderPath],
ApplicationSort.Favorite => LocaleManager.Instance[LocaleKeys.CommonFavorite],
ApplicationSort.TitleId => LocaleManager.Instance[LocaleKeys.DlcManagerTableHeadingTitleIdLabel],
ApplicationSort.Title => LocaleManager.Instance[LocaleKeys.GameListHeaderApplication],
ApplicationSort.Developer => LocaleManager.Instance[LocaleKeys.GameListSortDeveloper],
ApplicationSort.LastPlayed => LocaleManager.Instance[LocaleKeys.GameListSortLastPlayed],
ApplicationSort.TotalTimePlayed => LocaleManager.Instance[LocaleKeys.GameListSortTimePlayed],
ApplicationSort.FileType => LocaleManager.Instance[LocaleKeys.GameListSortFileExtension],
ApplicationSort.FileSize => LocaleManager.Instance[LocaleKeys.GameListSortFileSize],
ApplicationSort.Path => LocaleManager.Instance[LocaleKeys.GameListSortPath],
_ => string.Empty,
};
}

View File

@@ -113,37 +113,37 @@
Tag="TitleId" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale GameListHeaderDeveloper}"
Content="{ext:Locale GameListSortDeveloper}"
GroupName="Sort"
IsChecked="{Binding IsSortedByDeveloper, Mode=OneTime}"
Tag="Developer" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale GameListHeaderTimePlayed}"
Content="{ext:Locale GameListSortTimePlayed}"
GroupName="Sort"
IsChecked="{Binding IsSortedByTimePlayed, Mode=OneTime}"
Tag="TotalTimePlayed" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale GameListHeaderLastPlayed}"
Content="{ext:Locale GameListSortLastPlayed}"
GroupName="Sort"
IsChecked="{Binding IsSortedByLastPlayed, Mode=OneTime}"
Tag="LastPlayed" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale GameListHeaderFileExtension}"
Content="{ext:Locale GameListSortFileExtension}"
GroupName="Sort"
IsChecked="{Binding IsSortedByType, Mode=OneTime}"
Tag="FileType" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale GameListHeaderFileSize}"
Content="{ext:Locale GameListSortFileSize}"
GroupName="Sort"
IsChecked="{Binding IsSortedBySize, Mode=OneTime}"
Tag="FileSize" />
<RadioButton
Checked="Sort_Checked"
Content="{ext:Locale GameListHeaderPath}"
Content="{ext:Locale GameListSortPath}"
GroupName="Sort"
IsChecked="{Binding IsSortedByPath, Mode=OneTime}"
Tag="Path" />

View File

@@ -46,7 +46,19 @@ namespace Ryujinx.Ava.Utilities.AppLibrary
: string.Empty;
public LocaleKeys? PlayabilityStatus { get; set; }
public string LocalizedStatusTooltip =>
PlayabilityStatus.HasValue
#pragma warning disable CS8509 // It is exhaustive for any value this property can contain.
? LocaleManager.Instance[PlayabilityStatus!.Value switch
#pragma warning restore CS8509
{
LocaleKeys.CompatibilityListPlayable => LocaleKeys.CompatibilityListPlayableTooltip,
LocaleKeys.CompatibilityListIngame => LocaleKeys.CompatibilityListIngameTooltip,
LocaleKeys.CompatibilityListMenus => LocaleKeys.CompatibilityListMenusTooltip,
LocaleKeys.CompatibilityListBoots => LocaleKeys.CompatibilityListBootsTooltip,
LocaleKeys.CompatibilityListNothing => LocaleKeys.CompatibilityListNothingTooltip,
}]
: string.Empty;
public int PlayerCount { get; set; }
public int GameCount { get; set; }

View File

@@ -100,12 +100,25 @@ namespace Ryujinx.Ava.Utilities.Compat
public Optional<string> TitleId { get; }
public string[] Labels { get; }
public LocaleKeys? Status { get; }
public LocaleKeys? StatusDescription
=> Status switch
{
LocaleKeys.CompatibilityListPlayable => LocaleKeys.CompatibilityListPlayableTooltip,
LocaleKeys.CompatibilityListIngame => LocaleKeys.CompatibilityListIngameTooltip,
LocaleKeys.CompatibilityListMenus => LocaleKeys.CompatibilityListMenusTooltip,
LocaleKeys.CompatibilityListBoots => LocaleKeys.CompatibilityListBootsTooltip,
LocaleKeys.CompatibilityListNothing => LocaleKeys.CompatibilityListNothingTooltip,
_ => null
};
public DateTime LastUpdated { get; }
public string LocalizedLastUpdated =>
LocaleManager.FormatDynamicValue(LocaleKeys.CompatibilityListLastUpdated, LastUpdated.Humanize());
public string LocalizedStatus => LocaleManager.Instance[Status!.Value];
public string LocalizedStatusDescription => LocaleManager.Instance[StatusDescription!.Value];
public string FormattedTitleId => TitleId
.OrElse(new string(' ', 16));

View File

@@ -64,6 +64,8 @@
VerticalAlignment="Center"
Text="{Binding LocalizedStatus}"
Width="85"
Background="Transparent"
ToolTip.Tip="{Binding LocalizedStatusDescription}"
Foreground="{Binding Status, Converter={x:Static helpers:PlayabilityStatusConverter.Shared}}"
TextWrapping="NoWrap" />
<TextBlock Grid.Column="3"