Compare commits

...

8 Commits

13 changed files with 228 additions and 169 deletions

View File

@@ -440,7 +440,7 @@
<x:Double x:Key="ControlContentThemeFontSize">13</x:Double>
<x:Double x:Key="MenuItemHeight">26</x:Double>
<x:Double x:Key="TabItemMinHeight">28</x:Double>
<x:Double x:Key="ContentDialogMaxWidth">900</x:Double>
<x:Double x:Key="ContentDialogMaxWidth">700</x:Double>
<x:Double x:Key="ContentDialogMaxHeight">756</x:Double>
</Styles.Resources>
</Styles>

View File

@@ -469,7 +469,7 @@
"tr_TR": "",
"uk_UA": "Відкрити теку скріншотів",
"zh_CN": "打开截图文件夹",
"zh_TW": ""
"zh_TW": "開啟螢幕擷取畫面資料夾"
}
},
{
@@ -619,7 +619,7 @@
"tr_TR": "",
"uk_UA": "Запускати ігри з прихованим інтерфейсом",
"zh_CN": "启动游戏时隐藏 UI",
"zh_TW": ""
"zh_TW": "開啟遊戲時隱藏 UI"
}
},
{
@@ -1569,7 +1569,7 @@
"tr_TR": "",
"uk_UA": "Розроблено: {0}",
"zh_CN": "由 {0} 开发",
"zh_TW": ""
"zh_TW": "由 {0} 開發"
}
},
{
@@ -1869,7 +1869,7 @@
"tr_TR": "",
"uk_UA": "Сумісність:",
"zh_CN": "兼容性:",
"zh_TW": ""
"zh_TW": "相容性:"
}
},
{
@@ -1894,7 +1894,7 @@
"tr_TR": "",
"uk_UA": "ID гри:",
"zh_CN": "标题 ID:",
"zh_TW": ""
"zh_TW": "標題 ID:"
}
},
{
@@ -1919,7 +1919,7 @@
"tr_TR": "",
"uk_UA": "Розміщені ігри: {0}",
"zh_CN": "服务的游戏: {0}",
"zh_TW": ""
"zh_TW": "LDN 上主持的遊戲數量: {0}"
}
},
{
@@ -1944,7 +1944,7 @@
"tr_TR": "",
"uk_UA": "Гравців онлайн: {0}",
"zh_CN": "在线玩家: {0}",
"zh_TW": ""
"zh_TW": "LDN 上在線的玩家數量: {0}"
}
},
{
@@ -2294,7 +2294,7 @@
"tr_TR": "",
"uk_UA": "Очистити кеш PPTC",
"zh_CN": "清理 PPTC 缓存",
"zh_TW": ""
"zh_TW": "清除 PPTC"
}
},
{
@@ -2319,7 +2319,7 @@
"tr_TR": "",
"uk_UA": "Видаляє всі файли кешу PPTC для застосунку",
"zh_CN": "删除应用程序的所有 PPTC 缓存",
"zh_TW": ""
"zh_TW": "清除應用程式的 PPTC"
}
},
{
@@ -2369,7 +2369,7 @@
"tr_TR": "Uygulamanın shader önbelleğini temizler",
"uk_UA": "Видаляє кеш шейдерів застосунку (гри)",
"zh_CN": "删除游戏的着色器缓存文件,下次启动游戏时重新生成着色器缓存文件",
"zh_TW": "除應用程式的著色器快取"
"zh_TW": "除應用程式的著色器快取檔案"
}
},
{
@@ -2644,7 +2644,7 @@
"tr_TR": "",
"uk_UA": "Витягти RomFS з обраного файлу DLC",
"zh_CN": "从选定的 DLC 文件中解压 RomFS",
"zh_TW": ""
"zh_TW": "從已選擇的 DLC 檔案中提取 RomFS"
}
},
{
@@ -2769,7 +2769,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
"zh_TW": "建立遊戲獨立自訂 (per-game) 設定檔"
}
},
{
@@ -2794,7 +2794,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
"zh_TW": "編輯遊戲獨立自訂 (per-game) 設定檔"
}
},
{
@@ -2844,7 +2844,7 @@
"tr_TR": "Mevcut oyun için bağımsız bir yapılandırma oluşturur",
"uk_UA": "Створює незалежну конфігурацію для поточної гри",
"zh_CN": "为当前游戏创建独立的配置",
"zh_TW": "為當前遊戲創建獨立的配置"
"zh_TW": "為已選擇的遊戲建立遊戲獨立自訂 (game-specific) 的設定檔"
}
},
{
@@ -2869,7 +2869,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
"zh_TW": "為已選擇的遊戲編輯遊戲獨立自訂 (game-specific) 的設定檔"
}
},
{
@@ -2894,7 +2894,7 @@
"tr_TR": "",
"uk_UA": "Iнформація про сумісність",
"zh_CN": "显示兼容性项目",
"zh_TW": ""
"zh_TW": "顯示相容性資訊"
}
},
{
@@ -2919,7 +2919,7 @@
"tr_TR": "",
"uk_UA": "Показати цю гру в Списку Сумісності. Список сумісності також можна зайти в меню Довідки.",
"zh_CN": "在兼容性列表中显示选定的游戏,您通常可以通过帮助菜单访问。",
"zh_TW": ""
"zh_TW": "在相容性列表中顯示已選擇的遊戲。你也可以透過「說明」選單開啟。"
}
},
{
@@ -2944,7 +2944,7 @@
"tr_TR": "",
"uk_UA": "Інформація про гру",
"zh_CN": "显示游戏信息",
"zh_TW": ""
"zh_TW": "顯示遊戲資訊"
}
},
{
@@ -2969,7 +2969,7 @@
"tr_TR": "",
"uk_UA": "Показати статистику та деталі обраної гри.",
"zh_CN": "显示当前选定游戏的状态与详细信息。",
"zh_TW": ""
"zh_TW": "顯示目前已選擇遊戲的狀態及詳細資訊。"
}
},
{
@@ -3519,7 +3519,7 @@
"tr_TR": "",
"uk_UA": "Перевірка оновлень:",
"zh_CN": "检查更新",
"zh_TW": ""
"zh_TW": "檢查更新:"
}
},
{
@@ -3544,7 +3544,7 @@
"tr_TR": "",
"uk_UA": "Вимкнути",
"zh_CN": "关闭",
"zh_TW": ""
"zh_TW": "關閉"
}
},
{
@@ -3569,7 +3569,7 @@
"tr_TR": "",
"uk_UA": "Запитувати щоразу",
"zh_CN": "提示",
"zh_TW": ""
"zh_TW": "提示"
}
},
{
@@ -3594,7 +3594,7 @@
"tr_TR": "",
"uk_UA": "Оновлювати в фоні",
"zh_CN": "背景",
"zh_TW": ""
"zh_TW": "背景"
}
},
{
@@ -3619,7 +3619,7 @@
"tr_TR": "",
"uk_UA": "При втраті фокуса емулятором:",
"zh_CN": "当模拟器在后台时:",
"zh_TW": ""
"zh_TW": "當模擬器「失去焦點」(如切換工作)時:"
}
},
{
@@ -3644,7 +3644,7 @@
"tr_TR": "",
"uk_UA": "Нічого не робити",
"zh_CN": "什么事情也不做",
"zh_TW": ""
"zh_TW": "沒有動作"
}
},
{
@@ -3669,7 +3669,7 @@
"tr_TR": "",
"uk_UA": "Блокувати введення",
"zh_CN": "禁用输入",
"zh_TW": ""
"zh_TW": "停用輸入"
}
},
{
@@ -3694,7 +3694,7 @@
"tr_TR": "",
"uk_UA": "Вимкнути звук",
"zh_CN": "静音",
"zh_TW": ""
"zh_TW": "靜音"
}
},
{
@@ -3719,7 +3719,7 @@
"tr_TR": "",
"uk_UA": "Блокувати введення та Вимкнути звук",
"zh_CN": "阻止输入且静音",
"zh_TW": ""
"zh_TW": "停用輸入且靜音"
}
},
{
@@ -3744,7 +3744,7 @@
"tr_TR": "",
"uk_UA": "Поставити на паузу",
"zh_CN": "暂停模拟",
"zh_TW": ""
"zh_TW": "暫停模擬"
}
},
{
@@ -3819,7 +3819,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "在后台时禁用输入",
"zh_TW": ""
"zh_TW": "在「失去焦點」時停用輸入"
}
},
{
@@ -4844,7 +4844,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "与系统时间同步",
"zh_TW": ""
"zh_TW": "與系統時間同步"
}
},
{
@@ -5269,7 +5269,7 @@
"tr_TR": "",
"uk_UA": "Ігнорувати Аплет Контролера",
"zh_CN": "忽略控制器小程序",
"zh_TW": ""
"zh_TW": "忽略控制器小程式"
}
},
{
@@ -6119,7 +6119,7 @@
"tr_TR": "",
"uk_UA": "Увімкнути журнали інтерфейсу",
"zh_CN": "启用 UI 日志",
"zh_TW": ""
"zh_TW": "啟用 UI 日誌"
}
},
{
@@ -6519,7 +6519,7 @@
"tr_TR": "",
"uk_UA": "Скинути налаштування",
"zh_CN": "重置设置",
"zh_TW": ""
"zh_TW": "重設設定"
}
},
{
@@ -6544,7 +6544,7 @@
"tr_TR": "",
"uk_UA": "Я хочу скинути налаштування.",
"zh_CN": "我要重置我的设置。",
"zh_TW": ""
"zh_TW": "我想重設我的設定。"
}
},
{
@@ -8469,7 +8469,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "关闭",
"zh_TW": ""
"zh_TW": "關閉"
}
},
{
@@ -8494,7 +8494,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "彩虹",
"zh_TW": ""
"zh_TW": "彩虹"
}
},
{
@@ -8519,7 +8519,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "彩虹滚动速度",
"zh_TW": ""
"zh_TW": "彩虹滾動速度"
}
},
{
@@ -8544,7 +8544,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "颜色",
"zh_TW": ""
"zh_TW": "顏色"
}
},
{
@@ -13819,7 +13819,7 @@
"tr_TR": "",
"uk_UA": "Ви збираєтесь видалити всі дані PPTC з:\n\n{0}\n\nБажаєте продовжити цю операцію?",
"zh_CN": "您正要清理 PPTC 数据:\n\n{0}\n\n您确实要继续吗?",
"zh_TW": ""
"zh_TW": "您將要刪除以下遊戲的 PPTC:\n\n{0}\n\n您確定要繼續嗎?"
}
},
{
@@ -16669,7 +16669,7 @@
"tr_TR": "",
"uk_UA": "Діалогове вікно Аплету Контролера не з'явиться, якщо геймпад було відключено під час роботи програми.\n\nЗалиште вимкненим якщо не впевнені.",
"zh_CN": "在应用程序运行时如果游戏手柄断开连接则不会显示控制器小程序对话框。\n\n如果不确定请保持关闭状态。",
"zh_TW": ""
"zh_TW": "在模擬應用程式時如果遊戲手柄中斷連線則不會顯示控制器小程式。\n\n如果不確定請保持關閉狀態。"
}
},
{
@@ -17144,7 +17144,7 @@
"tr_TR": "",
"uk_UA": "Виводити повідомлення журналу Avalonia (UI) в консоль",
"zh_CN": "在控制台显示 Avalonia (UI) 的日志信息",
"zh_TW": ""
"zh_TW": "在控制台中輸出 Avalonia (UI) 日誌訊息。"
}
},
{
@@ -17344,7 +17344,7 @@
"tr_TR": "",
"uk_UA": "Відкрити теку куди зберігаються скріншоти Ryujinx",
"zh_CN": "打开 Ryujinx 截图文件夹",
"zh_TW": ""
"zh_TW": "開啟 Ryujinx 螢幕擷取畫面資料夾"
}
},
{
@@ -18094,7 +18094,7 @@
"tr_TR": "",
"uk_UA": "Доступне оновлення!",
"zh_CN": "有可用的更新!",
"zh_TW": ""
"zh_TW": "有可用的更新!"
}
},
{
@@ -19919,7 +19919,7 @@
"tr_TR": "",
"uk_UA": "Налаштування LED",
"zh_CN": "LED 设置",
"zh_TW": ""
"zh_TW": "LED 設定"
}
},
{
@@ -21769,7 +21769,7 @@
"tr_TR": "Yeniden Doku Sıkıştırılmasını Aktif Et",
"uk_UA": "Увімкнути рекомпресію текстури",
"zh_CN": "启用纹理压缩",
"zh_TW": "啟材質重新壓縮"
"zh_TW": "啟材質重新壓縮"
}
},
{
@@ -23822,6 +23822,31 @@
"zh_TW": "上次更新時間: {0}"
}
},
{
"ID": "CompatibilityListTitle",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Compatibility List - {0} entries",
"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": "CompatibilityListWarning",
"Translations": {
@@ -23872,6 +23897,31 @@
"zh_TW": "搜尋相容性列表紀錄..."
}
},
{
"ID": "CompatibilityListSearchBoxWatermarkWithCount",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Search {0} compatibility entries...",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "Søk i {0} kompatibilitetsoppføringer...",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "CompatibilityListOpen",
"Translations": {
@@ -24069,7 +24119,7 @@
"tr_TR": "",
"uk_UA": "Запускається та оптимально працює (без збоїв або графічних багів) на середньостатистичному комп'ютері.",
"zh_CN": "启动和游戏时不会出现任何崩溃或任何类型的 GPU bug 且速度足够快可以在一般 PC 上尽情游玩。",
"zh_TW": ""
"zh_TW": "啟動和遊玩時不會出現任何崩潰或任何類型的 GPU bug 且速度足夠快可以在一般 PC 上盡情遊玩。"
}
},
{
@@ -24094,7 +24144,7 @@
"tr_TR": "",
"uk_UA": "Запускається, але в грі на вас чекатимуть одна або декілька наступних проблем: збої, зависання, графічні баги, спотворений звук або ж гра загалом працюватиме надто повільно. Можливо, її все ще можна пройти, але досвід буде не найкращим.",
"zh_CN": "可以成功启动并进入游戏但可能会遇到以下一种或多种问题: 崩溃、卡死、GPU bug、令人无法接受的音频,或者只是太慢。仍然可以继续进行游戏,但是可能无法达到预期。",
"zh_TW": ""
"zh_TW": "能啟動並進入遊戲但可能會遇到下列狀況崩潰、卡死、GPU bug、令人無法接受的聲音、或遊戲過慢。遊戲或可繼續進行但是可能無法達到預期效果。"
}
},
{
@@ -24119,7 +24169,7 @@
"tr_TR": "",
"uk_UA": "Запускається та проходить початковий екран, але пограти не вийде.",
"zh_CN": "可以启动并通过标题画面但是无法进入到主要的游戏流程。",
"zh_TW": ""
"zh_TW": "能啟動並通過標題畫面,但是無法進入主要的遊戲畫面。"
}
},
{
@@ -24144,7 +24194,7 @@
"tr_TR": "",
"uk_UA": "Запускається, але не відображає навіть початкового екрану.",
"zh_CN": "可以启动但是无法通过标题画面。",
"zh_TW": ""
"zh_TW": "能啟動,但是無法通過標題畫面。"
}
},
{
@@ -24169,7 +24219,7 @@
"tr_TR": "",
"uk_UA": "Взагалі не запускається.",
"zh_CN": "无法启动或显示无任何动静。",
"zh_TW": ""
"zh_TW": "無法啟動"
}
},
{
@@ -24194,7 +24244,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
"zh_TW": "遊戲獨立自訂 (game-specific) 設定"
}
},
{
@@ -24219,7 +24269,7 @@
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
"zh_TW": "(全域)"
}
},
{
@@ -24244,7 +24294,7 @@
"tr_TR": "",
"uk_UA": "Оберіть DLC які бажаєте вилучити",
"zh_CN": "选择一个要解压的 DLC",
"zh_TW": ""
"zh_TW": "選擇要提取的 DLC"
}
},
{
@@ -24269,7 +24319,7 @@
"tr_TR": "",
"uk_UA": "Зображення картки активності Discord",
"zh_CN": "Rich Presence 图像",
"zh_TW": ""
"zh_TW": "Rich Presence 圖像"
}
},
{
@@ -24294,7 +24344,7 @@
"tr_TR": "",
"uk_UA": "Динамічна картка активності Discord",
"zh_CN": "动态 Rich Presence",
"zh_TW": ""
"zh_TW": "動態 Rich Presence"
}
}
]

View File

@@ -1,4 +1,5 @@
using Gommon;
using Ryujinx.Ava.Systems;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Common;
@@ -25,7 +26,21 @@ namespace Ryujinx.Ava.Common.Locale
public LocaleManager()
{
_localeStrings = new Dictionary<LocaleKeys, string>();
_dynamicValues = new ConcurrentDictionary<LocaleKeys, object[]>();
_dynamicValues = new ConcurrentDictionary<LocaleKeys, object[]>(new Dictionary<LocaleKeys, object[]>
{
{ LocaleKeys.DialogConfirmationTitle, [RyujinxApp.FullAppName] },
{ LocaleKeys.DialogUpdaterTitle, [RyujinxApp.FullAppName] },
{ LocaleKeys.DialogErrorTitle, [RyujinxApp.FullAppName] },
{ LocaleKeys.DialogWarningTitle, [RyujinxApp.FullAppName] },
{ LocaleKeys.DialogExitTitle, [RyujinxApp.FullAppName] },
{ LocaleKeys.DialogStopEmulationTitle, [RyujinxApp.FullAppName] },
{ LocaleKeys.RyujinxInfo, [RyujinxApp.FullAppName] },
{ LocaleKeys.RyujinxConfirm, [RyujinxApp.FullAppName] },
{ LocaleKeys.RyujinxUpdater, [RyujinxApp.FullAppName] },
{ LocaleKeys.RyujinxRebooter, [RyujinxApp.FullAppName] },
{ LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, [CompatibilityCsv.Entries.Length] },
{ LocaleKeys.CompatibilityListTitle, [CompatibilityCsv.Entries.Length] }
});
Load();
}
@@ -44,17 +59,6 @@ namespace Ryujinx.Ava.Common.Locale
ConfigurationState.Instance.ToFileFormat().SaveConfig(Program.ConfigurationPath);
}
SetDynamicValues(LocaleKeys.DialogConfirmationTitle, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.DialogUpdaterTitle, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.DialogErrorTitle, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.DialogWarningTitle, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.DialogExitTitle, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.DialogStopEmulationTitle, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.RyujinxInfo, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.RyujinxConfirm, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.RyujinxUpdater, RyujinxApp.FullAppName);
SetDynamicValues(LocaleKeys.RyujinxRebooter, RyujinxApp.FullAppName);
}
public string this[LocaleKeys key]

View File

@@ -407,7 +407,7 @@ namespace Ryujinx.Ava.UI.Controls
public async void OpenApplicationCompatibility_Click(object sender, RoutedEventArgs args)
{
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
await CompatibilityList.Show(viewModel.SelectedApplication.IdString);
await CompatibilityListWindow.Show(viewModel.SelectedApplication.IdString);
}
public async void OpenApplicationData_Click(object sender, RoutedEventArgs args)

View File

@@ -1,6 +1,7 @@
using Gommon;
using Ryujinx.Ava.Systems;
using Ryujinx.Ava.Systems.AppLibrary;
using Ryujinx.Ava.UI.Windows;
using System.Collections.Generic;
using System.Linq;

View File

@@ -51,7 +51,7 @@ namespace Ryujinx.Ava.UI.Views.Main
UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes);
XciTrimmerMenuItem.Command = Commands.Create(XCITrimmerWindow.Show);
AboutWindowMenuItem.Command = Commands.Create(AboutWindow.Show);
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityList.Show());
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show());
UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand;

View File

@@ -44,21 +44,18 @@ namespace Ryujinx.Ava.UI.Views.Misc
if (RyujinxApp.AppLifetime.Windows.TryGetFirst(x => x is ContentDialogOverlayWindow, out Window window))
window.Close(ContentDialogResult.None);
await CompatibilityList.Show((string)playabilityLabel.Tag);
await CompatibilityListWindow.Show((string)playabilityLabel.Tag);
}
private async void IdString_OnClick(object sender, RoutedEventArgs e)
{
if (DataContext is not MainWindowViewModel mwvm)
return;
if (sender is not Button { Content: TextBlock idText })
return;
if (!RyujinxApp.IsClipboardAvailable(out IClipboard clipboard))
return;
ApplicationData appData = mwvm.Applications.FirstOrDefault(it => it.IdString == idText.Text);
ApplicationData appData = RyujinxApp.MainWindow.ViewModel.Applications.FirstOrDefault(it => it.IdString == idText.Text);
if (appData is null)
return;

View File

@@ -6,6 +6,7 @@ using Ryujinx.Ava.UI.Controls;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.Systems.AppLibrary;
using Ryujinx.Ava.UI.Windows;
using System;
using System.Linq;
@@ -35,7 +36,7 @@ namespace Ryujinx.Ava.UI.Views.Misc
if (sender is not Button { Content: TextBlock playabilityLabel })
return;
await CompatibilityList.Show((string)playabilityLabel.Tag);
await CompatibilityListWindow.Show((string)playabilityLabel.Tag);
}
private async void IdString_OnClick(object sender, RoutedEventArgs e)

View File

@@ -1,48 +0,0 @@
using Avalonia.Controls;
using Avalonia.Styling;
using FluentAvalonia.UI.Controls;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using System.Threading.Tasks;
namespace Ryujinx.Ava.UI.Views.Misc
{
public partial class CompatibilityList : UserControl
{
public static async Task Show(string titleId = null)
{
ContentDialog contentDialog = new()
{
PrimaryButtonText = string.Empty,
SecondaryButtonText = string.Empty,
CloseButtonText = LocaleManager.Instance[LocaleKeys.SettingsButtonClose],
Content = new CompatibilityList
{
DataContext = new CompatibilityViewModel(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary),
SearchBox = {
Text = titleId ?? ""
}
}
};
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
}
public CompatibilityList()
{
InitializeComponent();
}
private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
{
if (DataContext is not CompatibilityViewModel cvm)
return;
if (sender is not TextBox searchBox)
return;
cvm.Search(searchBox.Text);
}
}
}

View File

@@ -1,82 +1,82 @@
<UserControl xmlns="https://github.com/avaloniaui"
<window:StyleableAppWindow xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:helpers="using:Ryujinx.Ava.UI.Helpers"
xmlns:ext="using:Ryujinx.Ava.Common.Markup"
xmlns:ui="using:FluentAvalonia.UI.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
xmlns:systems="clr-namespace:Ryujinx.Ava.Systems"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Ryujinx.Ava.UI.Views.Misc.CompatibilityList"
xmlns:window="clr-namespace:Ryujinx.Ava.UI.Windows"
CanResize="False"
mc:Ignorable="d"
MinWidth="800"
MinHeight="745"
x:Class="Ryujinx.Ava.UI.Windows.CompatibilityListWindow"
x:DataType="viewModels:CompatibilityViewModel">
<UserControl.DataContext>
<window:StyleableAppWindow.DataContext>
<viewModels:CompatibilityViewModel />
</UserControl.DataContext>
<Grid RowDefinitions="*,Auto,*">
<Grid
Grid.Row="0"
HorizontalAlignment="Center"
ColumnDefinitions="Auto,*"
Margin="0 0 0 10">
<ui:FontIcon
Grid.Column="0"
Margin="0"
HorizontalAlignment="Stretch"
FontFamily="avares://FluentAvalonia/Fonts#Symbols"
Glyph="{helpers:GlyphValueConverter Important}" />
<!-- NOTE: aligning to bottom for better visual alignment with glyph -->
<TextBlock
Grid.Column="1"
Margin="5, 0, 0, 0"
FontStyle="Italic"
VerticalAlignment="Center"
TextWrapping="Wrap"
Text="{ext:Locale CompatibilityListWarning}" />
</window:StyleableAppWindow.DataContext>
<Grid RowDefinitions="Auto,*">
<Grid Grid.Row="0" ColumnDefinitions="Auto,*,Auto,Auto" Name="FlushControls">
<Image
Name="RyuLogo"
Margin="15, 0, 7, 0"
Height="25"
Width="25" />
<TextBox Name="SearchBoxFlush" Grid.Column="1" Margin="0, 5, 0, 5" HorizontalAlignment="Stretch" Watermark="{ext:Locale CompatibilityListSearchBoxWatermarkWithCount}" TextChanged="TextBox_OnTextChanged" />
<CheckBox Grid.Column="2" Margin="7, 0, 0, 0" IsChecked="{Binding OnlyShowOwnedGames}" />
<TextBlock Grid.Column="3" Padding="0, 0, 138, 0" Margin="-10, 0, 18, 0" Text="{ext:Locale CompatibilityListOnlyShowOwnedGames}" />
</Grid>
<Grid Grid.Row="1" ColumnDefinitions="*,Auto,Auto">
<TextBox Name="SearchBox" Grid.Column="0" HorizontalAlignment="Stretch" Watermark="{ext:Locale CompatibilityListSearchBoxWatermark}" TextChanged="TextBox_OnTextChanged" />
<Grid Grid.Row="0" ColumnDefinitions="*,Auto,Auto" Name="NormalControls">
<TextBox Name="SearchBoxNormal" Grid.Column="0" Margin="15, 0, 0, 5" HorizontalAlignment="Stretch" Watermark="{ext:Locale CompatibilityListSearchBoxWatermark}" TextChanged="TextBox_OnTextChanged" />
<CheckBox Grid.Column="1" Margin="7, 0, 0, 0" IsChecked="{Binding OnlyShowOwnedGames}" />
<TextBlock Grid.Column="2" Margin="-10, 0, 0, 0" Text="{ext:Locale CompatibilityListOnlyShowOwnedGames}" />
<TextBlock Grid.Column="2" Padding="0, 0, 1, 0" Margin="-10, 0, 18, 0" Text="{ext:Locale CompatibilityListOnlyShowOwnedGames}" />
</Grid>
<ScrollViewer Grid.Row="2">
<ListBox Margin="0,5, 0, 0"
<ScrollViewer Grid.Row="1">
<ListBox Margin="12, 0, 13, 0"
Background="Transparent"
ItemsSource="{Binding CurrentEntries}">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type systems:CompatibilityEntry}">
<Grid Width="750"
Margin="5"
ColumnDefinitions="Auto,Auto,Auto,*"
<Grid MinWidth="800"
Margin="10"
ColumnDefinitions="*,Auto,Auto,*"
Background="Transparent"
ToolTip.Tip="{Binding LocalizedLastUpdated}">
<TextBlock Grid.Column="0"
Text="{Binding GameName}"
Width="320"
Width="525"
VerticalAlignment="Center"
HorizontalAlignment="Center"
TextWrapping="Wrap" />
<TextBlock Grid.Column="1"
Width="135"
Padding="7, 0, 0, 0"
FontFamily="{StaticResource JetBrainsMono}"
Text="{Binding FormattedTitleId}"
VerticalAlignment="Center"
HorizontalAlignment="Center"
TextWrapping="Wrap" />
<TextBlock Grid.Column="2"
Padding="7, 0"
VerticalAlignment="Center"
Text="{Binding LocalizedStatus}"
Width="85"
Width="90"
Background="Transparent"
ToolTip.Tip="{Binding LocalizedStatusDescription}"
Foreground="{Binding Status, Converter={x:Static helpers:PlayabilityStatusConverter.Shared}}"
VerticalAlignment="Center"
HorizontalAlignment="Center"
TextWrapping="NoWrap" />
<TextBlock Grid.Column="3"
VerticalAlignment="Center"
Text="{Binding FormattedIssueLabels}"
VerticalAlignment="Center"
HorizontalAlignment="Left"
TextWrapping="WrapWithOverflow" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ScrollViewer>
<Grid></Grid>
</Grid>
</UserControl>
</window:StyleableAppWindow>

View File

@@ -0,0 +1,50 @@
using Avalonia.Controls;
using Avalonia.Styling;
using FluentAvalonia.UI.Controls;
using FluentAvalonia.UI.Windowing;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Ava.UI.Helpers;
using Ryujinx.Ava.UI.ViewModels;
using Ryujinx.Ava.UI.Windows;
using System.Threading.Tasks;
namespace Ryujinx.Ava.UI.Windows
{
public partial class CompatibilityListWindow : StyleableAppWindow
{
public static Task Show(string titleId = null) =>
ShowAsync(new CompatibilityListWindow
{
DataContext = new CompatibilityViewModel(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary),
SearchBoxFlush = { Text = titleId ?? string.Empty },
SearchBoxNormal = { Text = titleId ?? string.Empty }
});
public CompatibilityListWindow() : base(useCustomTitleBar: true)
{
Title = RyujinxApp.FormatTitle(LocaleKeys.CompatibilityListTitle);
TitleBar.Height = 37;
InitializeComponent();
RyuLogo.Source = MainWindowViewModel.IconBitmap;
FlushControls.IsVisible = !ConfigurationState.Instance.ShowTitleBar;
NormalControls.IsVisible = ConfigurationState.Instance.ShowTitleBar;
}
// ReSharper disable once UnusedMember.Local
// its referenced in the axaml but rider keeps yelling at me that its unused so
private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
{
if (DataContext is not CompatibilityViewModel cvm)
return;
if (sender is not TextBox searchBox)
return;
cvm.Search(searchBox.Text);
}
}
}

View File

@@ -76,7 +76,7 @@ namespace Ryujinx.Ava.UI.Windows
public readonly double StatusBarHeight;
public readonly double MenuBarHeight;
public MainWindow()
public MainWindow() : base(useCustomTitleBar: true)
{
DataContext = ViewModel = new MainWindowViewModel
{
@@ -90,9 +90,6 @@ namespace Ryujinx.Ava.UI.Windows
ViewModel.Title = RyujinxApp.FormatTitle();
TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar;
TitleBar.TitleBarHitTestType = (ConfigurationState.Instance.ShowTitleBar) ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex;
// NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
StatusBarHeight = StatusBarView.StatusBar.MinHeight;
MenuBarHeight = MenuBar.MinHeight;

View File

@@ -6,6 +6,7 @@ using Avalonia.Media;
using Avalonia.Platform;
using FluentAvalonia.UI.Windowing;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Systems.Configuration;
using Ryujinx.Ava.UI.ViewModels;
using System.Threading.Tasks;
@@ -21,7 +22,7 @@ namespace Ryujinx.Ava.UI.Windows
await appWindow.ShowDialog(owner ?? RyujinxApp.MainWindow);
}
protected StyleableAppWindow()
protected StyleableAppWindow(bool useCustomTitleBar = false)
{
WindowStartupLocation = WindowStartupLocation.CenterOwner;
TransparencyLevelHint = [WindowTransparencyLevel.None];
@@ -29,6 +30,12 @@ namespace Ryujinx.Ava.UI.Windows
LocaleManager.Instance.LocaleChanged += LocaleChanged;
LocaleChanged();
if (useCustomTitleBar)
{
TitleBar.ExtendsContentIntoTitleBar = !ConfigurationState.Instance.ShowTitleBar;
TitleBar.TitleBarHitTestType = ConfigurationState.Instance.ShowTitleBar ? TitleBarHitTestType.Simple : TitleBarHitTestType.Complex;
}
Icon = MainWindowViewModel.IconBitmap;
}