diff --git a/assets/locales.json b/assets/locales.json index 9db7f6258..2844d649b 100644 --- a/assets/locales.json +++ b/assets/locales.json @@ -2995,26 +2995,26 @@ { "ID": "GameListContextMenuTrimXCI", "Translations": { - "ar_SA": "فحص & تقليم XCI", - "de_DE": "Überprüfen & Zuschneiden der XCI", - "el_GR": "Έλεγχος & Κοπή XCI", - "en_US": "Check & Trim XCI", - "es_ES": "Verificar & Recortar XCI", - "fr_FR": "Vérifier & Réduire le XCI", - "he_IL": "בדוק & חתוך XCI", - "it_IT": "Controlla & Riduci il XCI", - "ja_JP": "XCIを確認 & トリム", - "ko_KR": "XCI 확인 & 트림", - "no_NO": "Kontroller & trim XCI", - "pl_PL": "Sprawdź & Przytnij XCI", - "pt_BR": "Verificar & Reduzir o XCI", - "ru_RU": "Проверить & обрезать XCI", - "sv_SE": "Kontrollera & optimera XCI", - "th_TH": "ตรวจสอบ & ลดขนาด XCI", - "tr_TR": "XCI'yi Kontrol Et & Kırp", - "uk_UA": "Перевірка & нарізка XCI", - "zh_CN": "检查并精简 XCI", - "zh_TW": "檢查 & 修剪 XCI" + "ar_SA": "تقليم XCI", + "de_DE": "Zuschneiden der XCI", + "el_GR": "Κοπή XCI", + "en_US": "Trim XCI", + "es_ES": "Recortar XCI", + "fr_FR": "Réduire le XCI", + "he_IL": "חתוך XCI", + "it_IT": "Riduci il XCI", + "ja_JP": "XCIをトリム", + "ko_KR": "XCI 트림", + "no_NO": null, + "pl_PL": "Przytnij XCI", + "pt_BR": "Reduzir o XCI", + "ru_RU": "Обрезать XCI", + "sv_SE": "Optimera XCI", + "th_TH": "ลดขนาด XCI", + "tr_TR": "XCI'yi Kırp", + "uk_UA": "Нарізка XCI", + "zh_CN": "精简 XCI", + "zh_TW": "修剪 XCI" } }, { @@ -15445,26 +15445,26 @@ { "ID": "AmiiboSeriesLabel", "Translations": { - "ar_SA": "مجموعة أميبو", - "de_DE": "Amiibo-Serie", - "el_GR": "Σειρά Amiibo", - "en_US": "Amiibo Series", - "es_ES": "Serie de Amiibo", - "fr_FR": "Séries Amiibo", - "he_IL": "סדרת אמיבו", - "it_IT": "Serie Amiibo", - "ja_JP": "Amiibo シリーズ", - "ko_KR": "Amiibo 시리즈", - "no_NO": "Amibo Serie", - "pl_PL": "Seria Amiibo", - "pt_BR": "Franquia Amiibo", - "ru_RU": "Серия Amiibo", - "sv_SE": "Amiibo-serie", - "th_TH": "ชุดซีรีส์ Amiibo", - "tr_TR": "Amiibo Serisi", - "uk_UA": "Серія Amiibo", - "zh_CN": "Amiibo 系列", - "zh_TW": "Amiibo 系列" + "ar_SA": "سلسلة", + "de_DE": "Serie", + "el_GR": "Σειρά", + "en_US": "Series", + "es_ES": "Serie", + "fr_FR": "Séries", + "he_IL": "סדרה", + "it_IT": "Serie", + "ja_JP": "シリーズ", + "ko_KR": "시리즈", + "no_NO": "Serie", + "pl_PL": "Seria", + "pt_BR": "Série", + "ru_RU": "Серия", + "sv_SE": "Serie", + "th_TH": "ซีรีส์", + "tr_TR": "Seri", + "uk_UA": "Серія", + "zh_CN": "系列", + "zh_TW": "系列" } }, { @@ -15520,26 +15520,26 @@ { "ID": "AmiiboOptionsUsRandomTagLabel", "Translations": { - "ar_SA": "هاك: استخدم UUID عشوائي للتاج", - "de_DE": "Hack: Benutze zufällige Tag-UUID", - "el_GR": "Hack: Χρησιμοποιήστε τυχαίο UUID για το Tag", - "en_US": "Hack: Use Random Tag UUID", - "es_ES": "Hack: Usar UUID de Etiqueta Aleatorio", - "fr_FR": "Hack : Utiliser un Tag UUID Aléatoire", - "he_IL": "האצה: השתמש ב-UUID אקראי לתג", - "it_IT": "Espediente: Usa un UUID del tag casuale", - "ja_JP": "ハック: ランダムなタグ UUID を使用", - "ko_KR": "핵 : 무작위 태그 UUID 사용", - "no_NO": "Hack: Bruk tilfeldig tag-UUID", - "pl_PL": "Hack: Użyj losowego UUID tagu", - "pt_BR": "Hack: Usar UUID de tag Aleatório", - "ru_RU": "Хак: Использовать случайный тег UUID", - "sv_SE": "Hack: Använd slumpmässig tagg för UUID", - "th_TH": "แฮ็ค: ใช้ UUID แท็กแบบสุ่ม", - "tr_TR": "Hack: Rastgele bir UUID kullan", - "uk_UA": "Хак: Використовувати випадковий тег UUID", - "zh_CN": "破解:使用随机标签 UUID", - "zh_TW": "破解:使用隨機標籤 UUID" + "ar_SA": "هاك: UUID عشوائي للتاج", + "de_DE": "Hack: Zufällige Tag-UUID", + "el_GR": "Hack: Τυχαίο UUID για το Tag", + "en_US": "Hack: Random UUID Tag", + "es_ES": "Hack: UUID de Etiqueta Aleatorio", + "fr_FR": "Hack : Tag UUID Aléatoire", + "he_IL": "האצה: UUID אקראי לתג", + "it_IT": "Espediente: UUID del tag casuale", + "ja_JP": "ハック: ランダムなタグ UUID", + "ko_KR": "핵 : 무작위 태그 UUID", + "no_NO": "Hack: Tilfeldig tag-UUID", + "pl_PL": "Hack: Losowy UUID tagu", + "pt_BR": "Hack: UUID de tag Aleatório", + "ru_RU": "Хак: Случайный тег UUID", + "sv_SE": "Hack: Slumpmässig tagg för UUID", + "th_TH": "แฮ็ค: UUID แท็กแบบสุ่ม", + "tr_TR": "Hack: Rastgele UUID tag", + "uk_UA": "Хак: Випадковий тег UUID", + "zh_CN": "破解:随机标签 UUID", + "zh_TW": "破解:隨機標籤 UUID" } }, { diff --git a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml index 16d9a1cfb..c3978466e 100755 --- a/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml +++ b/src/Ryujinx/UI/Controls/ApplicationContextMenu.axaml @@ -105,6 +105,7 @@ CommandParameter="{Binding}" Header="{ext:Locale GameListContextMenuTrimXCI}" IsEnabled="{Binding TrimXCIEnabled}" + IsVisible="{Binding IsXCIFile}" Icon="{ext:Icon fa-solid fa-scissors}" /> game != null && game.GameId.Contains(TitleId)); + if (compatible) { - if (game != null) - { - if (game.GameId.Contains(TitleId)) - { - AmiiboSeries.Add(_amiiboList[i].AmiiboSeries); - - break; - } - } + _amiiboSeries.Add(amiibo.AmiiboSeries); } } else { - AmiiboSeries.Add(_amiiboList[i].AmiiboSeries); + _amiiboSeries.Add(amiibo.AmiiboSeries); } } } @@ -347,10 +340,16 @@ namespace Ryujinx.Ava.UI.ViewModels { SelectLastScannedAmiibo(); } - else + else if (_amiiboSeries.Count > 0) { SeriesSelectedIndex = 0; } + else + { + SeriesSelectedIndex = -1; + } + + FilterAmiibo(); } private void SelectLastScannedAmiibo() @@ -360,59 +359,59 @@ namespace Ryujinx.Ava.UI.ViewModels SeriesSelectedIndex = AmiiboSeries.IndexOf(scanned.AmiiboSeries); AmiiboSelectedIndex = AmiiboList.IndexOf(scanned); } - + private void FilterAmiibo() { _amiibos.Clear(); List amiiboSortedList; - // If no series selected, just display all available amiibos if (_seriesSelectedIndex < 0) { amiiboSortedList = _amiiboList .OrderBy(amiibo => amiibo.AmiiboSeries) - .ThenBy(x => x.Name) + .ThenBy(amiibo => amiibo.Name) .ToList(); } else { + string selectedSeries = _amiiboSeries[SeriesSelectedIndex]; + amiiboSortedList = _amiiboList - .Where(amiibo => amiibo.AmiiboSeries == _amiiboSeries[SeriesSelectedIndex]) - .OrderBy(amiibo => amiibo.Name).ToList(); + .Where(amiibo => amiibo.AmiiboSeries == selectedSeries) + .OrderBy(amiibo => amiibo.Name) + .ToList(); } - - - for (int i = 0; i < amiiboSortedList.Count; i++) + foreach (var amiibo in amiiboSortedList) { - if (!_amiibos.Contains(amiiboSortedList[i])) + if (!_showAllAmiibo) { - if (!_showAllAmiibo) - { - foreach (AmiiboApiGamesSwitch game in amiiboSortedList[i].GamesSwitch) - { - if (game != null) - { - if (game.GameId.Contains(TitleId)) - { - _amiibos.Add(amiiboSortedList[i]); + bool compatible = amiibo.GamesSwitch.Any(game => game != null && game.GameId.Contains(TitleId)); - break; - } - } - } - } - else + if (compatible) { - _amiibos.Add(amiiboSortedList[i]); + _amiibos.Add(amiibo); } } + else + { + _amiibos.Add(amiibo); + } } - AmiiboSelectedIndex = 0; - } + int restoredIndex = -1; + for (int i = 0; i < _amiibos.Count; i++) + { + if (_amiibos[i].GetId() == LastScannedAmiiboId) + { + restoredIndex = i; + break; + } + } + AmiiboSelectedIndex = restoredIndex != -1 ? restoredIndex : (_amiibos.Count > 0 ? 0 : -1); + } private void SetAmiiboDetails() { ResetAmiiboPreview(); @@ -420,44 +419,32 @@ namespace Ryujinx.Ava.UI.ViewModels Usage = string.Empty; if (_amiiboSelectedIndex < 0 || _amiibos.Count < 1) - { return; - } AmiiboApi selected = _amiibos[_amiiboSelectedIndex]; - string imageUrl = _amiiboList.FirstOrDefault(amiibo => amiibo.Equals(selected)).Image; + string imageUrl = selected.Image; StringBuilder usageStringBuilder = new(); - for (int i = 0; i < _amiiboList.Count; i++) + foreach (var game in selected.GamesSwitch) { - if (_amiiboList[i].Equals(selected)) + if (game != null && game.GameId.Contains(TitleId)) { - bool writable = false; - - foreach (AmiiboApiGamesSwitch item in _amiiboList[i].GamesSwitch) + foreach (var usageItem in game.AmiiboUsage) { - if (item.GameId.Contains(TitleId)) - { - foreach (AmiiboApiUsage usageItem in item.AmiiboUsage) - { - usageStringBuilder.Append($"{Environment.NewLine}- {usageItem.Usage.Replace("/", Environment.NewLine + "-")}"); - - writable = usageItem.Write; - } - } + usageStringBuilder.Append($"{Environment.NewLine}- {usageItem.Usage.Replace("/", Environment.NewLine + "-")}"); } - - if (usageStringBuilder.Length == 0) - { - usageStringBuilder.Append($"{LocaleManager.Instance[LocaleKeys.Unknown]}."); - } - - Usage = $"{LocaleManager.Instance[LocaleKeys.AmiiboUsage]}{(writable ? $"({LocaleManager.Instance[LocaleKeys.Writable]})" : string.Empty)}{usageStringBuilder}"; } } + if (usageStringBuilder.Length == 0) + { + usageStringBuilder.Append($"{LocaleManager.Instance[LocaleKeys.Unknown]}."); + } + + Usage = $"{LocaleManager.Instance[LocaleKeys.AmiiboUsage]}{usageStringBuilder}"; + _ = UpdateAmiiboPreview(imageUrl); } diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs index 58bf3a043..05e9de1e3 100644 --- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs @@ -456,6 +456,8 @@ namespace Ryujinx.Ava.UI.ViewModels } public bool HasCompatibilityEntry => SelectedApplication.HasPlayabilityInfo; + + public bool IsXCIFile => Path.GetExtension(SelectedApplication.Path)?.ToLower() == ".xci"; public bool HasDlc => ApplicationLibrary.HasDlcs(SelectedApplication.Id); diff --git a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml index 02aa8dbe1..b0372970e 100644 --- a/src/Ryujinx/UI/Windows/AmiiboWindow.axaml +++ b/src/Ryujinx/UI/Windows/AmiiboWindow.axaml @@ -16,40 +16,52 @@ WindowStartupLocation="CenterOwner" Width="800" MinHeight="650" - Height="650" + Height="700" SizeToContent="Manual" MinWidth="600" Focusable="True"> - - - + + + + - - - - + + + + + + + + - - - - + + + + + + + + + + + + - + + + @@ -59,22 +71,14 @@ - - - - + + + + - - - - - - - - + +