Amiibo Window Layout Adjustments + Other

This commit is contained in:
_Neo_ 2025-12-06 19:44:13 +02:00
parent 39653c5250
commit ed8cda4b0e
5 changed files with 154 additions and 160 deletions

View file

@ -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"
}
},
{

View file

@ -105,6 +105,7 @@
CommandParameter="{Binding}"
Header="{ext:Locale GameListContextMenuTrimXCI}"
IsEnabled="{Binding TrimXCIEnabled}"
IsVisible="{Binding IsXCIFile}"
Icon="{ext:Icon fa-solid fa-scissors}" />
<MenuItem Header="{ext:Locale GameListContextMenuCacheManagement}" Icon="{ext:Icon fa-solid fa-memory}">
<MenuItem

View file

@ -317,28 +317,21 @@ namespace Ryujinx.Ava.UI.ViewModels
_amiiboSeries.Clear();
_amiibos.Clear();
for (int i = 0; i < _amiiboList.Count; i++)
foreach (var amiibo in _amiiboList)
{
if (!_amiiboSeries.Contains(_amiiboList[i].AmiiboSeries))
if (!_amiiboSeries.Contains(amiibo.AmiiboSeries))
{
if (!ShowAllAmiibo)
{
foreach (AmiiboApiGamesSwitch game in _amiiboList[i].GamesSwitch)
bool compatible = amiibo.GamesSwitch.Any(game => 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<AmiiboApi> 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);
}

View file

@ -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);

View file

@ -16,40 +16,52 @@
WindowStartupLocation="CenterOwner"
Width="800"
MinHeight="650"
Height="650"
Height="700"
SizeToContent="Manual"
MinWidth="600"
Focusable="True">
<Design.DataContext>
<viewModels:AmiiboWindowViewModel />
</Design.DataContext>
<Grid RowDefinitions="Auto,Auto,*,Auto" Margin="15" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<Grid Name="FlushControls" ColumnDefinitions="Auto,Auto" Grid.Row="0" Margin="-15">
<controls:RyujinxLogo
<Grid Grid.Row="0" RowDefinitions="Auto,Auto,*,Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<!-- UI FlushControls -->
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto,Auto" Name="FlushControls">
<controls:RyujinxLogo
Grid.Column="0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Margin="7, 7, 0, 0"
Margin="7,0,7,0"
ToolTip.Tip="{ext:WindowTitle Amiibo}" />
<StackPanel Grid.Column="1" Orientation="Horizontal">
<StackPanel Spacing="10" Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock Margin="0,40,0,15" VerticalAlignment="Center" Text="{ext:Locale AmiiboSeriesLabel}" />
<ComboBox Margin="0,40,0,15" SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
</StackPanel>
<TextBlock Margin="8,0,0,0" VerticalAlignment="Center" Text="{ext:Locale AmiiboSeriesLabel}" />
<ComboBox Margin="5,5,0,5" SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
</StackPanel>
<CheckBox Grid.Column="2" Margin="15,0,0,0" IsChecked="{Binding ShowAllAmiibo}">
<TextBlock Text="{ext:Locale AmiiboOptionsShowAllLabel}" />
</CheckBox>
<CheckBox Grid.Column="3" Margin="15,0,0,0" HotKey="H" IsChecked="{Binding UseRandomUuid}" >
<TextBlock Text="{ext:Locale AmiiboOptionsUsRandomTagLabel}" />
</CheckBox>
</Grid>
<Grid Margin="20,0,0,0" Name="NormalControls" ColumnDefinitions="*,*" Grid.Row="1" HorizontalAlignment="Stretch" >
<StackPanel Spacing="10" Orientation="Horizontal" HorizontalAlignment="Left">
<TextBlock VerticalAlignment="Center" Text="{ext:Locale AmiiboSeriesLabel}" />
<ComboBox SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
<!-- UI NormalControls -->
<Grid Grid.Row="0" ColumnDefinitions="Auto,Auto,Auto" Name="NormalControls">
<StackPanel Grid.Column="0" Orientation="Horizontal">
<TextBlock Margin="15,0,0,0" VerticalAlignment="Center" Text="{ext:Locale AmiiboSeriesLabel}" />
<ComboBox Margin="5,5,0,5" SelectedIndex="{Binding SeriesSelectedIndex}" ItemsSource="{Binding AmiiboSeries}" MinWidth="100" />
</StackPanel>
<CheckBox Grid.Column="1" Margin="15,0,0,0" IsChecked="{Binding ShowAllAmiibo}">
<TextBlock Text="{ext:Locale AmiiboOptionsShowAllLabel}" />
</CheckBox>
<CheckBox Grid.Column="2" Margin="15,0,0,0" IsChecked="{Binding UseRandomUuid}" HotKey="H">
<TextBlock Text="{ext:Locale AmiiboOptionsUsRandomTagLabel}" />
</CheckBox>
</Grid>
<DockPanel Grid.Row="2">
<!-- Amiibo ListBox, Images, Buttons -->
<StackPanel Grid.Row="2" Margin="0,20,0,20" Orientation="Horizontal" HorizontalAlignment="Center" Spacing="50">
<ListBox
DockPanel.Dock="Left"
Width="300"
Margin="20"
Padding="10"
Width="250"
Padding="5"
SelectionMode="Single"
ItemsSource="{Binding AmiiboList}"
SelectedIndex="{Binding AmiiboSelectedIndex}">
@ -59,22 +71,14 @@
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<StackPanel Margin="20">
<Image Source="{Binding AmiiboImage}" Height="400" Width="200" HorizontalAlignment="Center" />
<ScrollViewer MaxHeight="120" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto"
Margin="20" VerticalAlignment="Top" HorizontalAlignment="Stretch">
<TextBlock TextWrapping="Wrap" Text="{Binding Usage}" HorizontalAlignment="Center"
TextAlignment="Center" />
<StackPanel Width="250">
<Image Source="{Binding AmiiboImage}" Height="400" Width="200" />
<ScrollViewer MaxHeight="120" HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Margin="20" VerticalAlignment="Top" HorizontalAlignment="Stretch">
<TextBlock TextWrapping="Wrap" Text="{Binding Usage}" HorizontalAlignment="Center" TextAlignment="Center" />
</ScrollViewer>
</StackPanel>
</DockPanel>
<Grid Grid.Row="3" Margin="10,0,0,0" ColumnDefinitions="Auto,Auto,*,Auto,Auto">
<CheckBox Margin="10" Grid.Column="0" IsChecked="{Binding ShowAllAmiibo}" >
<TextBlock Text="{ext:Locale AmiiboOptionsShowAllLabel}" />
</CheckBox>
<CheckBox HotKey="H" Margin="0,10,10,10" Grid.Column="1" IsChecked="{Binding UseRandomUuid}" >
<TextBlock Text="{ext:Locale AmiiboOptionsUsRandomTagLabel}" />
</CheckBox>
</StackPanel>
<Grid Grid.Row="3" Margin="0,0,10,10" ColumnDefinitions="Auto,Auto,*,Auto,Auto">
<Button Grid.Column="3"
IsEnabled="{Binding EnableScanning}"
Name="ScanButton"
@ -82,7 +86,7 @@
Content="{ext:Locale AmiiboScanButtonLabel}"
Click="ScanButton_Click" />
<Button Grid.Column="4"
Margin="10,0"
Margin="10,0,0,0"
Width="80"
Name="CancelButton"
HotKey="Escape"