Compare commits
31 Commits
Canary-1.2
...
c72aacc6e1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c72aacc6e1 | ||
|
|
05b4bd8c61 | ||
|
|
b9beb76e9b | ||
|
|
20111a651c | ||
|
|
659e580f4d | ||
|
|
e6339ac950 | ||
|
|
53c44b2e1d | ||
|
|
ef5177f050 | ||
|
|
28bcb85c31 | ||
|
|
da0d2e1b70 | ||
|
|
db08498a89 | ||
|
|
7a43dcb513 | ||
|
|
f2329d0e8a | ||
|
|
3aa7ed661d | ||
|
|
6e824e44b8 | ||
|
|
a964bf8f68 | ||
|
|
89e4d287d6 | ||
|
|
f34745a66c | ||
|
|
d5b7851c9b | ||
|
|
1b7032b589 | ||
|
|
e097ea71ff | ||
|
|
299f2144c8 | ||
|
|
33e3ba9ff2 | ||
|
|
9dc36646c1 | ||
|
|
8eea75a6e8 | ||
|
|
57fbcc7aed | ||
|
|
d1c15f3562 | ||
|
|
0423fad7ff | ||
|
|
1951fe0077 | ||
|
|
7fd5a63a5d | ||
|
|
a0594e8169 |
@@ -1,7 +1,7 @@
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td align="center" width="25%">
|
||||
<img src="https://raw.githubusercontent.com/Ryubing/ryuassets/refs/heads/main/RyujinxApp_1024.png" alt="Ryujinx" >
|
||||
<img src="https://raw.githubusercontent.com/Ryubing/Assets/refs/heads/main/RyujinxApp_1024.png" alt="Ryujinx" >
|
||||
</td>
|
||||
<td align="center" width="75%">
|
||||
|
||||
|
||||
@@ -21,6 +21,11 @@ namespace Ryujinx.Common.Configuration.Hid
|
||||
/// </summary>
|
||||
public string Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controller name
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controller's Type
|
||||
/// </summary>
|
||||
|
||||
@@ -49,7 +49,6 @@
|
||||
<TextBlock
|
||||
Classes="globalConfigMarker"/>
|
||||
</StackPanel>
|
||||
|
||||
</Border>
|
||||
</Design.PreviewWith>
|
||||
<Style Selector="DropDownButton">
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -2763,13 +2763,13 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Создать пользовательскую конфигурацию",
|
||||
"ru_RU": "Задать индивидуальные параметры",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Створити користувацьку конфігурацію",
|
||||
"zh_CN": "创建自定义设置",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "建立遊戲獨立自訂 (per-game) 設定檔"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -2788,13 +2788,13 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Изменить пользовательскую конфигурацию",
|
||||
"ru_RU": "Изменить индивидуальные параметры",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"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) 的設定檔"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -2863,13 +2863,13 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Отредактировать существующую независимую конфигурацию для выбранной игры.",
|
||||
"ru_RU": "Отредактировать существующие независимые параметры для выбранной игры.",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"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": "在「失去焦點」時停用輸入"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -3838,7 +3838,7 @@
|
||||
"no_NO": "Vis original UI-stil (krever omstart)",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"ru_RU": "Включить оригинальный интерфейса (требуется перезагрузка)",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
@@ -3863,7 +3863,7 @@
|
||||
"no_NO": "Vis det eldre Avalonia Ryujinx-grensesnittet som minner om Ryujinx 1.1.1403. Dette er aktivert som standard på plattformer som ikke er Windows.\nTittellinjen i klassisk stil er tilbake, og store omarbeidinger av vindusoppsettet er reversert, for eksempel plasseringen av innstillingsnavigasjonen over dette verktøytipset.",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"ru_RU": "Показать старый пользовательский интерфейс Avalonia Ryujinx, напоминающий Ryujinx 1.1.1403. Включено по умолчанию на платформах, отличных от Windows.\nСтрока заголовка в классическом стиле вернётся на место, а основные изменения в оформлении окна будут отменены; например, расположение навигации по настройкам над этой всплывающей подсказкой.",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
@@ -4869,7 +4869,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Синхронізувати з системним годинником",
|
||||
"zh_CN": "与系统时间同步",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "與系統時間同步"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -5038,7 +5038,7 @@
|
||||
"no_NO": "Lyd Inn/Ut",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Выход/Вход звука",
|
||||
"ru_RU": "",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
@@ -5294,7 +5294,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Ігнорувати Аплет Контролера",
|
||||
"zh_CN": "忽略控制器小程序",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "忽略控制器小程式"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -6144,7 +6144,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Увімкнути журнали інтерфейсу",
|
||||
"zh_CN": "启用 UI 日志",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "啟用 UI 日誌"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -6544,7 +6544,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Скинути налаштування",
|
||||
"zh_CN": "重置设置",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "重設設定"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -6569,7 +6569,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Я хочу скинути налаштування.",
|
||||
"zh_CN": "我要重置我的设置。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "我想重設我的設定。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -6588,7 +6588,7 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Ок",
|
||||
"ru_RU": "",
|
||||
"sv_SE": "Ok",
|
||||
"th_TH": "ตกลง",
|
||||
"tr_TR": "Tamam",
|
||||
@@ -6922,6 +6922,31 @@
|
||||
"zh_TW": "輸入裝置"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsWaitingConnectDevice",
|
||||
"Translations": {
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "Configuration found:\n\nName:\t{0}\nGUID:\t{1}\n\n Waiting for controller connection...",
|
||||
"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": "ControllerSettingsRefresh",
|
||||
"Translations": {
|
||||
@@ -7038,7 +7063,7 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "Pro Kontroler",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "Pro контроллер",
|
||||
"ru_RU": "",
|
||||
"sv_SE": "",
|
||||
"th_TH": "โปรคอนโทรลเลอร์",
|
||||
"tr_TR": "Profesyonel Kumanda",
|
||||
@@ -7222,6 +7247,81 @@
|
||||
"zh_TW": "新增"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsModifiedNotification",
|
||||
"Translations": {
|
||||
"ar_SA": "(تم التعديل!)",
|
||||
"de_DE": "(modifiziert!)",
|
||||
"el_GR": "(τροποποιημένο!)",
|
||||
"en_US": "(Modified!)",
|
||||
"es_ES": "(modificado!)",
|
||||
"fr_FR": "(modifié!)",
|
||||
"he_IL": "(שונה!)",
|
||||
"it_IT": "(modificato!)",
|
||||
"ja_JP": "(変更済み!)",
|
||||
"ko_KR": "(수정됨!)",
|
||||
"no_NO": "(modifisert!)",
|
||||
"pl_PL": "(zmodyfikowane!)",
|
||||
"pt_BR": "(modificado!)",
|
||||
"ru_RU": "(изменено!)",
|
||||
"sv_SE": "(ändrad!)",
|
||||
"th_TH": "(แก้ไขแล้ว!)",
|
||||
"tr_TR": "(değiştirildi!)",
|
||||
"uk_UA": "(модифіковано!)",
|
||||
"zh_CN": "(已修改!)",
|
||||
"zh_TW": "(已修改!)"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsDisableDeviceForSaving",
|
||||
"Translations": {
|
||||
"ar_SA": "تم إعداد التحكم.\n\nفي انتظار اتصال وحدة التحكم...",
|
||||
"de_DE": "Steuerung konfiguriert.\n\nWarten auf die Verbindung des Controllers...",
|
||||
"el_GR": "Η διαχείριση έχει ρυθμιστεί.\n\nΑναμένεται σύνδεση του χειριστηρίου...",
|
||||
"en_US": "Control configured.\n\nWaiting for controller connection...",
|
||||
"es_ES": "Control configurado.\n\nEsperando la conexión del controlador...",
|
||||
"fr_FR": "Contrôle configuré.\n\nEn attente de la connexion du contrôleur...",
|
||||
"he_IL": "השליטה הוגדרה.\n\nממתין לחיבור הבקר...",
|
||||
"it_IT": "Controllo configurato.\n\nIn attesa della connessione del controller...",
|
||||
"ja_JP": "コントロールが設定されました。\n\nコントローラーの接続を待っています...",
|
||||
"ko_KR": "제어가 설정되었습니다.\n\n컨트롤러 연결 대기 중...",
|
||||
"no_NO": "Kontroll konfigurert.\n\nVenter på tilkobling av kontroller...",
|
||||
"pl_PL": "Sterowanie skonfigurowane.\n\nOczekiwanie na połączenie kontrolera...",
|
||||
"pt_BR": "Controle configurado.\n\nAguardando conexão do controle...",
|
||||
"ru_RU": "Управление настроено.\n\nОжидается подключение контроллера...",
|
||||
"sv_SE": "Kontroll konfigurerad.\n\nVäntar på anslutning av kontrollen...",
|
||||
"th_TH": "การควบคุมได้รับการตั้งค่าแล้ว\n\nกำลังรอการเชื่อมต่อคอนโทรลเลอร์...",
|
||||
"tr_TR": "Kontrol yapılandırıldı.\n\nKontrolcü bağlantısı bekleniyor...",
|
||||
"uk_UA": "Керування налаштовано.\n\nОчікується підключення контролера...",
|
||||
"zh_CN": "控制已配置。\n\n等待控制器连接...",
|
||||
"zh_TW": "控制已設定。\n\n等待控制器連接..."
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsUnlink",
|
||||
"Translations": {
|
||||
"ar_SA": "إلغاء الربط",
|
||||
"de_DE": "Entkoppeln",
|
||||
"el_GR": "Αποσύνδεση",
|
||||
"en_US": "Unlink",
|
||||
"es_ES": "Desvincular",
|
||||
"fr_FR": "Dissocier",
|
||||
"he_IL": "ניתוק קישור",
|
||||
"it_IT": "Scollega",
|
||||
"ja_JP": "リンク解除",
|
||||
"ko_KR": "연결 해제",
|
||||
"no_NO": "Frakoble",
|
||||
"pl_PL": "Odłącz",
|
||||
"pt_BR": "Desvincular",
|
||||
"ru_RU": "Отвязать",
|
||||
"sv_SE": "Koppla från",
|
||||
"th_TH": "ยกเลิกการเชื่อมโยง",
|
||||
"tr_TR": "Bağlantıyı Kes",
|
||||
"uk_UA": "Відв'язати",
|
||||
"zh_CN": "解除绑定",
|
||||
"zh_TW": "解除綁定"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsRemove",
|
||||
"Translations": {
|
||||
@@ -8494,7 +8594,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Вимкнути",
|
||||
"zh_CN": "关闭",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "關閉"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -8519,7 +8619,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Веселка",
|
||||
"zh_CN": "彩虹",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "彩虹"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -8544,7 +8644,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Швидкість зміни кольорів",
|
||||
"zh_CN": "彩虹滚动速度",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "彩虹滾動速度"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -8569,7 +8669,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "",
|
||||
"zh_CN": "颜色",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "顏色"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -11872,6 +11972,31 @@
|
||||
"zh_TW": "儲存設定檔"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsCancelCurrentChangesToolTip",
|
||||
"Translations": {
|
||||
"ar_SA": "إلغاء التغييرات الحالية",
|
||||
"de_DE": "Aktuelle Änderungen abbrechen",
|
||||
"el_GR": "Ακύρωση τρεχουσών αλλαγών",
|
||||
"en_US": "Cancel current changes",
|
||||
"es_ES": "Cancelar los cambios actuales",
|
||||
"fr_FR": "Annuler les modifications en cours",
|
||||
"he_IL": "ביטול השינויים הנוכחיים",
|
||||
"it_IT": "Annulla le modifiche correnti",
|
||||
"ja_JP": "現在の変更をキャンセル",
|
||||
"ko_KR": "현재 변경 취소",
|
||||
"no_NO": "Avbryt gjeldende endringer",
|
||||
"pl_PL": "Anuluj bieżące zmiany",
|
||||
"pt_BR": "Cancelar alterações atuais",
|
||||
"ru_RU": "Отменить текущие изменения",
|
||||
"sv_SE": "Avbryt aktuella ändringar",
|
||||
"th_TH": "ยกเลิกการเปลี่ยนแปลงปัจจุบัน",
|
||||
"tr_TR": "Geçerli değişiklikleri iptal et",
|
||||
"uk_UA": "Скасувати поточні зміни",
|
||||
"zh_CN": "取消当前更改",
|
||||
"zh_TW": "取消當前變更"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "MenuBarFileToolsTakeScreenshot",
|
||||
"Translations": {
|
||||
@@ -13844,7 +13969,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您確定要繼續嗎?"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -16694,7 +16819,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Діалогове вікно Аплету Контролера не з'явиться, якщо геймпад було відключено під час роботи програми.\n\nЗалиште вимкненим якщо не впевнені.",
|
||||
"zh_CN": "在应用程序运行时如果游戏手柄断开连接则不会显示控制器小程序对话框。\n\n如果不确定,请保持关闭状态。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "在模擬應用程式時如果遊戲手柄中斷連線則不會顯示控制器小程式。\n\n如果不確定,請保持關閉狀態。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -17169,7 +17294,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Виводити повідомлення журналу Avalonia (UI) в консоль",
|
||||
"zh_CN": "在控制台显示 Avalonia (UI) 的日志信息",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "在控制台中輸出 Avalonia (UI) 日誌訊息。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -17369,7 +17494,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Відкрити теку куди зберігаються скріншоти Ryujinx",
|
||||
"zh_CN": "打开 Ryujinx 截图文件夹",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "開啟 Ryujinx 螢幕擷取畫面資料夾"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -18119,7 +18244,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Доступне оновлення!",
|
||||
"zh_CN": "有可用的更新!",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "有可用的更新!"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -19944,7 +20069,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Налаштування LED",
|
||||
"zh_CN": "LED 设置",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "LED 設定"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -21794,7 +21919,7 @@
|
||||
"tr_TR": "Yeniden Doku Sıkıştırılmasını Aktif Et",
|
||||
"uk_UA": "Увімкнути рекомпресію текстури",
|
||||
"zh_CN": "启用纹理压缩",
|
||||
"zh_TW": "開啟材質重新壓縮"
|
||||
"zh_TW": "啟用材質重新壓縮"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -23863,7 +23988,7 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"ru_RU": "Список совместимости — записей: {0}",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
@@ -23938,7 +24063,7 @@
|
||||
"no_NO": "Søk i {0} kompatibilitetsoppføringer...",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"ru_RU": "Поиск среди {0} записей о совместимости...",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
@@ -24144,7 +24269,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Запускається та оптимально працює (без збоїв або графічних багів) на середньостатистичному комп'ютері.",
|
||||
"zh_CN": "启动和游戏时不会出现任何崩溃或任何类型的 GPU bug 且速度足够快可以在一般 PC 上尽情游玩。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "啟動和遊玩時不會出現任何崩潰或任何類型的 GPU bug 且速度足夠快可以在一般 PC 上盡情遊玩。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24169,7 +24294,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Запускається, але в грі на вас чекатимуть одна або декілька наступних проблем: збої, зависання, графічні баги, спотворений звук або ж гра загалом працюватиме надто повільно. Можливо, її все ще можна пройти, але досвід буде не найкращим.",
|
||||
"zh_CN": "可以成功启动并进入游戏但可能会遇到以下一种或多种问题: 崩溃、卡死、GPU bug、令人无法接受的音频,或者只是太慢。仍然可以继续进行游戏,但是可能无法达到预期。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "能啟動並進入遊戲,但可能會遇到下列狀況:崩潰、卡死、GPU bug、令人無法接受的聲音、或遊戲過慢。遊戲或可繼續進行,但是可能無法達到預期效果。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24194,7 +24319,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Запускається та проходить початковий екран, але пограти не вийде.",
|
||||
"zh_CN": "可以启动并通过标题画面但是无法进入到主要的游戏流程。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "能啟動並通過標題畫面,但是無法進入主要的遊戲畫面。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24219,7 +24344,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Запускається, але не відображає навіть початкового екрану.",
|
||||
"zh_CN": "可以启动但是无法通过标题画面。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "能啟動,但是無法通過標題畫面。"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24244,7 +24369,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Взагалі не запускається.",
|
||||
"zh_CN": "无法启动或显示无任何动静。",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "無法啟動"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24263,13 +24388,13 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"ru_RU": "Индивидуальные параметры",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Власна конфігурація",
|
||||
"zh_CN": "自定义配置",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "遊戲獨立自訂 (game-specific) 設定"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24288,13 +24413,13 @@
|
||||
"no_NO": "",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "",
|
||||
"ru_RU": "",
|
||||
"ru_RU": "(Глобальный)",
|
||||
"sv_SE": "",
|
||||
"th_TH": "",
|
||||
"tr_TR": "",
|
||||
"uk_UA": "(Глобальні)",
|
||||
"zh_CN": "(全局)",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "(全域)"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24319,7 +24444,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Оберіть DLC які бажаєте вилучити",
|
||||
"zh_CN": "选择一个要解压的 DLC",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "選擇要提取的 DLC"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24344,7 +24469,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Зображення картки активності Discord",
|
||||
"zh_CN": "Rich Presence 图像",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "Rich Presence 圖像"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -24369,7 +24494,7 @@
|
||||
"tr_TR": "",
|
||||
"uk_UA": "Динамічна картка активності Discord",
|
||||
"zh_CN": "动态 Rich Presence",
|
||||
"zh_TW": ""
|
||||
"zh_TW": "動態 Rich Presence"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -269,6 +269,7 @@ namespace Ryujinx.Ava.Systems.Configuration
|
||||
Version = InputConfig.CurrentVersion,
|
||||
Backend = InputBackendType.WindowKeyboard,
|
||||
Id = "0",
|
||||
Name = "Keyboard",
|
||||
PlayerIndex = PlayerIndex.Player1,
|
||||
ControllerType = ControllerType.ProController,
|
||||
LeftJoycon = new LeftJoyconCommonConfig<Key>
|
||||
|
||||
@@ -22,6 +22,8 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
public float StrongRumble { get; set; }
|
||||
|
||||
public string Id { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
public ControllerType ControllerType { get; set; }
|
||||
public PlayerIndex PlayerIndex { get; set; }
|
||||
|
||||
@@ -111,6 +113,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
if (config != null)
|
||||
{
|
||||
Id = config.Id;
|
||||
Name = config.Name;
|
||||
ControllerType = config.ControllerType;
|
||||
PlayerIndex = config.PlayerIndex;
|
||||
|
||||
@@ -201,6 +204,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
StandardControllerInputConfig config = new()
|
||||
{
|
||||
Id = Id,
|
||||
Name = Name,
|
||||
Backend = InputBackendType.GamepadSDL2,
|
||||
PlayerIndex = PlayerIndex,
|
||||
ControllerType = ControllerType,
|
||||
|
||||
@@ -2,12 +2,14 @@ using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Configuration.Hid.Keyboard;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models.Input
|
||||
{
|
||||
public partial class KeyboardInputConfig : BaseModel
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public ControllerType ControllerType { get; set; }
|
||||
public PlayerIndex PlayerIndex { get; set; }
|
||||
|
||||
@@ -53,6 +55,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
if (config != null)
|
||||
{
|
||||
Id = config.Id;
|
||||
Name = config.Name;
|
||||
ControllerType = config.ControllerType;
|
||||
PlayerIndex = config.PlayerIndex;
|
||||
|
||||
@@ -100,6 +103,7 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
StandardKeyboardInputConfig config = new()
|
||||
{
|
||||
Id = Id,
|
||||
Name = Name,
|
||||
Backend = InputBackendType.WindowKeyboard,
|
||||
PlayerIndex = PlayerIndex,
|
||||
ControllerType = ControllerType,
|
||||
|
||||
@@ -432,7 +432,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://raw.githubusercontent.com/Ryubing/Ryujinx/refs/heads/master/assets/amiibo/Amiibo.json"));
|
||||
HttpResponseMessage response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, "https://raw.githubusercontent.com/Ryubing/Nfc/refs/heads/main/tags.json"));
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
@@ -451,7 +451,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpResponseMessage response = await _httpClient.GetAsync($"https://raw.githubusercontent.com/Ryubing/Ryujinx/refs/heads/master/assets/amiibo/Amiibo.json");
|
||||
HttpResponseMessage response = await _httpClient.GetAsync("https://raw.githubusercontent.com/Ryubing/Nfc/refs/heads/main/tags.json");
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
|
||||
@@ -93,16 +93,19 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
public async void ShowMotionConfig()
|
||||
{
|
||||
await MotionInputView.Show(this);
|
||||
ParentModel.IsModified = true;
|
||||
}
|
||||
|
||||
public async void ShowRumbleConfig()
|
||||
{
|
||||
await RumbleInputView.Show(this);
|
||||
ParentModel.IsModified = true;
|
||||
}
|
||||
|
||||
public async void ShowLedConfig()
|
||||
{
|
||||
await LedInputView.Show(this);
|
||||
ParentModel.IsModified = true;
|
||||
}
|
||||
|
||||
public void OnParentModelChanged()
|
||||
|
||||
@@ -51,6 +51,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
private int _device;
|
||||
private object _configViewModel;
|
||||
[ObservableProperty] private string _profileName;
|
||||
[ObservableProperty] private bool _notificationIsVisible; // Automatically call the NotificationView property with OnPropertyChanged()
|
||||
[ObservableProperty] private string _notificationText; // Automatically call the NotificationText property with OnPropertyChanged()
|
||||
private bool _isLoaded;
|
||||
|
||||
private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||
@@ -88,13 +90,40 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
public bool IsKeyboard => !IsController;
|
||||
public bool IsRight { get; set; }
|
||||
public bool IsLeft { get; set; }
|
||||
|
||||
public string RevertDeviceId { get; set; }
|
||||
public bool HasLed => SelectedGamepad.Features.HasFlag(GamepadFeaturesFlag.Led);
|
||||
public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense");
|
||||
|
||||
public bool IsModified { get; set; }
|
||||
public bool _isChangeTrackingActive;
|
||||
|
||||
public bool _isModified;
|
||||
|
||||
public bool IsModified
|
||||
{
|
||||
get => _isModified;
|
||||
set
|
||||
{
|
||||
_isModified = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public event Action NotifyChangesEvent;
|
||||
|
||||
public string _profileChoose;
|
||||
public string ProfileChoose
|
||||
{
|
||||
get => _profileChoose;
|
||||
set
|
||||
{
|
||||
// When you select a profile, the settings from the profile will be applied.
|
||||
// To save the settings, you still need to click the apply button
|
||||
_profileChoose = value;
|
||||
LoadProfile();
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public object ConfigViewModel
|
||||
{
|
||||
get => _configViewModel;
|
||||
@@ -121,13 +150,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
{
|
||||
if (IsModified)
|
||||
{
|
||||
|
||||
_playerIdChoose = value;
|
||||
return;
|
||||
}
|
||||
|
||||
IsModified = false;
|
||||
_playerId = value;
|
||||
_isChangeTrackingActive = false;
|
||||
|
||||
if (!Enum.IsDefined<PlayerIndex>(_playerId))
|
||||
{
|
||||
@@ -135,13 +164,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
|
||||
}
|
||||
_isLoaded = false;
|
||||
|
||||
LoadConfiguration();
|
||||
LoadDevice();
|
||||
LoadProfiles();
|
||||
|
||||
RevertDeviceId = Devices[Device].Id;
|
||||
_isLoaded = true;
|
||||
|
||||
_isChangeTrackingActive = true;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
@@ -151,6 +180,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
get => _controller;
|
||||
set
|
||||
{
|
||||
MarkAsChanged();
|
||||
|
||||
_controller = value;
|
||||
|
||||
if (_controller == -1)
|
||||
@@ -229,6 +260,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
get => _device;
|
||||
set
|
||||
{
|
||||
MarkAsChanged();
|
||||
|
||||
_device = value < 0 ? 0 : value;
|
||||
|
||||
if (_device >= Devices.Count)
|
||||
@@ -248,11 +281,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
}
|
||||
}
|
||||
|
||||
FindPairedDeviceInConfigFile();
|
||||
OnPropertyChanged();
|
||||
NotifyChanges();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public InputConfig Config { get; set; }
|
||||
|
||||
public InputViewModel(UserControl owner) : this()
|
||||
@@ -274,6 +309,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
|
||||
PlayerId = PlayerIndex.Player1;
|
||||
}
|
||||
|
||||
_isChangeTrackingActive = true;
|
||||
}
|
||||
|
||||
public InputViewModel()
|
||||
@@ -311,8 +348,50 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
{
|
||||
ConfigViewModel = new ControllerInputViewModel(this, new GamepadInputConfig(controllerInputConfig), VisualStick);
|
||||
}
|
||||
|
||||
FindPairedDeviceInConfigFile();
|
||||
}
|
||||
|
||||
private void FindPairedDeviceInConfigFile()
|
||||
{
|
||||
// This function allows you to output a message about the device configuration found in the file
|
||||
// NOTE: if the configuration is found, we display the message "Waiting for controller connection",
|
||||
// but only if the id gamepad belongs to the selected player
|
||||
NotificationIsVisible = Config != null && Devices.FirstOrDefault(d => d.Id == Config.Id).Id != Config.Id && Config.PlayerIndex == PlayerId;
|
||||
if (NotificationIsVisible)
|
||||
{
|
||||
if (string.IsNullOrEmpty(Config.Name))
|
||||
{
|
||||
NotificationText = $"{LocaleManager.Instance[LocaleKeys.ControllerSettingsWaitingConnectDevice].Format("No information", Config.Id)}";
|
||||
}
|
||||
else
|
||||
{
|
||||
NotificationText = $"{LocaleManager.Instance[LocaleKeys.ControllerSettingsWaitingConnectDevice].Format(Config.Name, Config.Id)}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void MarkAsChanged()
|
||||
{
|
||||
//If tracking is active, then allow changing the modifier
|
||||
if (!IsModified && _isChangeTrackingActive)
|
||||
{
|
||||
RevertDeviceId = Devices[Device].Id; // Remember the device to undo changes
|
||||
IsModified = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void UnlinkDevice()
|
||||
{
|
||||
// "Disabled" mode is available after unbinding the device
|
||||
// NOTE: the IsModified flag to be able to apply the settings.
|
||||
NotificationIsVisible = false;
|
||||
IsModified = true;
|
||||
}
|
||||
|
||||
|
||||
public void LoadDevice()
|
||||
{
|
||||
if (Config == null || Config.Backend == InputBackendType.Invalid)
|
||||
@@ -378,14 +457,34 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleOnGamepadDisconnected(string id)
|
||||
private async void HandleOnGamepadDisconnected(string id)
|
||||
{
|
||||
Dispatcher.UIThread.Post(LoadDevices);
|
||||
_isChangeTrackingActive = false; // Disable configuration change tracking
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
LoadDevices();
|
||||
|
||||
IsModified = true;
|
||||
RevertChanges();
|
||||
FindPairedDeviceInConfigFile();
|
||||
|
||||
_isChangeTrackingActive = true; // Enable configuration change tracking
|
||||
return System.Threading.Tasks.Task.CompletedTask;
|
||||
});
|
||||
}
|
||||
|
||||
private void HandleOnGamepadConnected(string id)
|
||||
private async void HandleOnGamepadConnected(string id)
|
||||
{
|
||||
Dispatcher.UIThread.Post(LoadDevices);
|
||||
_isChangeTrackingActive = false; // Disable configuration change tracking
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
LoadDevices();
|
||||
|
||||
IsModified = true;
|
||||
RevertChanges();
|
||||
|
||||
_isChangeTrackingActive = true;// Enable configuration change tracking
|
||||
});
|
||||
}
|
||||
|
||||
private string GetCurrentGamepadId()
|
||||
@@ -558,12 +657,14 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
if (activeDevice.Type == DeviceType.Keyboard)
|
||||
{
|
||||
string id = activeDevice.Id;
|
||||
string name = activeDevice.Name;
|
||||
|
||||
config = new StandardKeyboardInputConfig
|
||||
{
|
||||
Version = InputConfig.CurrentVersion,
|
||||
Backend = InputBackendType.WindowKeyboard,
|
||||
Id = id,
|
||||
Name = name,
|
||||
ControllerType = ControllerType.ProController,
|
||||
LeftJoycon = new LeftJoyconCommonConfig<Key>
|
||||
{
|
||||
@@ -613,12 +714,14 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
bool isNintendoStyle = Devices.ToList().FirstOrDefault(x => x.Id == activeDevice.Id).Name.Contains("Nintendo");
|
||||
|
||||
string id = activeDevice.Id.Split(" ")[0];
|
||||
string name = activeDevice.Name;
|
||||
|
||||
config = new StandardControllerInputConfig
|
||||
{
|
||||
Version = InputConfig.CurrentVersion,
|
||||
Backend = InputBackendType.GamepadSDL2,
|
||||
Id = id,
|
||||
Name = name,
|
||||
ControllerType = ControllerType.ProController,
|
||||
DeadzoneLeft = 0.1f,
|
||||
DeadzoneRight = 0.1f,
|
||||
@@ -688,6 +791,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
return config;
|
||||
}
|
||||
|
||||
public void LoadProfileButton()
|
||||
{
|
||||
LoadProfile();
|
||||
IsModified = true;
|
||||
}
|
||||
|
||||
public async void LoadProfile()
|
||||
{
|
||||
if (Device == 0)
|
||||
@@ -739,9 +848,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
{
|
||||
_isLoaded = false;
|
||||
|
||||
config.Id = Config.Id; // Set current device id instead of changing device(independent profiles)
|
||||
|
||||
LoadConfiguration(config);
|
||||
|
||||
LoadDevice();
|
||||
//LoadDevice(); This line of code hard-links profiles to controllers, the commented line allows profiles to be applied to all controllers
|
||||
|
||||
_isLoaded = true;
|
||||
|
||||
@@ -751,6 +862,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
|
||||
public async void SaveProfile()
|
||||
{
|
||||
|
||||
if (Device == 0)
|
||||
{
|
||||
return;
|
||||
@@ -793,12 +905,15 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
await File.WriteAllTextAsync(path, jsonString);
|
||||
|
||||
LoadProfiles();
|
||||
|
||||
ProfileChoose = ProfileName; // Show new profile
|
||||
}
|
||||
else
|
||||
{
|
||||
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileInvalidProfileNameErrorMessage]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public async void RemoveProfile()
|
||||
@@ -825,14 +940,33 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
}
|
||||
|
||||
LoadProfiles();
|
||||
|
||||
ProfileChoose = ProfilesList[0].ToString(); // Show default profile
|
||||
}
|
||||
}
|
||||
|
||||
public void RevertChanges()
|
||||
{
|
||||
Device = Devices.ToList().FindIndex(d => d.Id == RevertDeviceId);
|
||||
LoadDevice();
|
||||
LoadConfiguration();
|
||||
OnPropertyChanged();
|
||||
IsModified = false;
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
|
||||
if (!IsModified)
|
||||
{
|
||||
return; //If the input settings were not touched, then do nothing
|
||||
}
|
||||
|
||||
IsModified = false;
|
||||
|
||||
List<InputConfig> newConfig = [];
|
||||
RevertDeviceId = Devices[Device].Id; // Remember selected device after saving
|
||||
|
||||
List <InputConfig> newConfig = [];
|
||||
|
||||
newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value);
|
||||
|
||||
@@ -862,6 +996,7 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
: (ConfigViewModel as ControllerInputViewModel).Config.GetConfig();
|
||||
config.ControllerType = Controllers[_controller].Type;
|
||||
config.PlayerIndex = _playerId;
|
||||
config.Name = device.Name;
|
||||
|
||||
int i = newConfig.FindIndex(x => x.PlayerIndex == PlayerId);
|
||||
if (i == -1)
|
||||
|
||||
@@ -65,7 +65,8 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
|
||||
if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value)
|
||||
{
|
||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
||||
FlagInputConfigChanged();
|
||||
|
||||
_changeSlider = (float)check.Value;
|
||||
}
|
||||
}
|
||||
@@ -75,7 +76,8 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
{
|
||||
if (sender is CheckBox { IsPointerOver: true })
|
||||
{
|
||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
||||
FlagInputConfigChanged();
|
||||
|
||||
_currentAssigner?.Cancel();
|
||||
_currentAssigner = null;
|
||||
}
|
||||
@@ -115,7 +117,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
if (e.ButtonValue.HasValue)
|
||||
{
|
||||
Button buttonValue = e.ButtonValue.Value;
|
||||
viewModel.ParentModel.IsModified = true;
|
||||
FlagInputConfigChanged();
|
||||
|
||||
switch (button.Name)
|
||||
{
|
||||
@@ -209,6 +211,11 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
}
|
||||
}
|
||||
|
||||
private void FlagInputConfigChanged()
|
||||
{
|
||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
||||
}
|
||||
|
||||
private void MouseClick(object sender, PointerPressedEventArgs e)
|
||||
{
|
||||
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
||||
@@ -232,7 +239,6 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
{
|
||||
gamepad?.ClearLed();
|
||||
}
|
||||
|
||||
_currentAssigner?.Cancel();
|
||||
_currentAssigner = null;
|
||||
}
|
||||
|
||||
@@ -41,13 +41,20 @@
|
||||
Grid.Column="0"
|
||||
Margin="2"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Center" ColumnDefinitions="Auto,*">
|
||||
<TextBlock
|
||||
VerticalAlignment="Center" ColumnDefinitions="Auto,*,Auto">
|
||||
<StackPanel
|
||||
Orientation="Vertical"
|
||||
Margin="5,0,10,0"
|
||||
Width="90"
|
||||
HorizontalAlignment="Left"
|
||||
VerticalAlignment="Center"
|
||||
Width="90">
|
||||
<TextBlock
|
||||
Text="{ext:Locale ControllerSettingsPlayer}" />
|
||||
<TextBlock
|
||||
Classes="pending"
|
||||
Text ="{ext:Locale ControllerSettingsModifiedNotification}"
|
||||
IsVisible="{Binding IsModified}"/>
|
||||
</StackPanel>
|
||||
<ComboBox
|
||||
Grid.Column="1"
|
||||
Name="PlayerIndexBox"
|
||||
@@ -62,6 +69,18 @@
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
<Button
|
||||
Grid.Column="2"
|
||||
MinWidth="0"
|
||||
Margin="5,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
ToolTip.Tip="{ext:Locale ControllerSettingsCancelCurrentChangesToolTip}"
|
||||
Command="{Binding RevertChanges}">
|
||||
<ui:SymbolIcon
|
||||
Symbol="Undo"
|
||||
FontSize="15"
|
||||
Height="20" />
|
||||
</Button>
|
||||
</Grid>
|
||||
<!-- Profile Selection -->
|
||||
<Grid
|
||||
@@ -81,7 +100,8 @@
|
||||
Name="ProfileBox"
|
||||
HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Center"
|
||||
SelectedIndex="0"
|
||||
SelectedItem="{Binding ProfileChoose, Mode=TwoWay}"
|
||||
SelectionChanged="ComboBox_SelectionChanged"
|
||||
ItemsSource="{Binding ProfilesList}"
|
||||
Text="{Binding ProfileName, Mode=TwoWay}" />
|
||||
<Button
|
||||
@@ -90,7 +110,7 @@
|
||||
Margin="5,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
ToolTip.Tip="{ext:Locale ControllerSettingsLoadProfileToolTip}"
|
||||
Command="{Binding LoadProfile}">
|
||||
Command="{Binding LoadProfileButton}">
|
||||
<ui:SymbolIcon
|
||||
Symbol="View"
|
||||
FontSize="15"
|
||||
@@ -148,7 +168,7 @@
|
||||
MinWidth="0"
|
||||
Margin="5,0,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Command="{Binding LoadDevices}">
|
||||
Command="{Binding LoadDevice}">
|
||||
<ui:SymbolIcon
|
||||
Symbol="Refresh"
|
||||
FontSize="15"
|
||||
@@ -181,6 +201,28 @@
|
||||
</Grid>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
<ContentControl IsVisible="{Binding NotificationIsVisible}">
|
||||
<ContentControl.Content>
|
||||
|
||||
<StackPanel>
|
||||
<TextBlock
|
||||
Margin="5,20,0,0"
|
||||
Text="{Binding NotificationText}" />
|
||||
<Button
|
||||
MinWidth="0"
|
||||
Width="90"
|
||||
Height="27"
|
||||
Margin="0,10,0,0"
|
||||
VerticalAlignment="Center"
|
||||
Command="{Binding UnlinkDevice}">
|
||||
<TextBlock
|
||||
Text="{ext:Locale ControllerSettingsUnlink}"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center" />
|
||||
</Button>
|
||||
</StackPanel>
|
||||
</ContentControl.Content>
|
||||
</ContentControl>
|
||||
<ContentControl Content="{Binding ConfigViewModel}" IsVisible="{Binding ShowSettings}">
|
||||
<ContentControl.DataTemplates>
|
||||
<DataTemplate DataType="viewModels:ControllerInputViewModel">
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Avalonia.Controls;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Controls;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
@@ -63,13 +64,22 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
return;
|
||||
}
|
||||
|
||||
ViewModel.IsModified = false;
|
||||
ViewModel.PlayerId = ViewModel.PlayerIdChoose;
|
||||
|
||||
ViewModel.IsModified = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (sender is FAComboBox faComboBox)
|
||||
{
|
||||
faComboBox.IsDropDownOpen = false;
|
||||
ViewModel.IsModified = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
ViewModel.Dispose();
|
||||
|
||||
@@ -9,6 +9,8 @@ using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||
using Ryujinx.Input;
|
||||
using Ryujinx.Input.Assigner;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using Button = Ryujinx.Input.Button;
|
||||
using Key = Ryujinx.Common.Configuration.Hid.Key;
|
||||
|
||||
@@ -186,11 +188,63 @@ namespace Ryujinx.Ava.UI.Views.Input
|
||||
{
|
||||
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
||||
|
||||
bool shouldRemoveBinding = e.GetCurrentPoint(this).Properties.IsRightButtonPressed;
|
||||
|
||||
if (shouldRemoveBinding)
|
||||
{
|
||||
DeleteBind();
|
||||
}
|
||||
|
||||
_currentAssigner?.Cancel(shouldUnbind);
|
||||
|
||||
PointerPressed -= MouseClick;
|
||||
}
|
||||
|
||||
private void DeleteBind()
|
||||
{
|
||||
|
||||
if (_currentAssigner != null)
|
||||
{
|
||||
Dictionary<string, Action> buttonActions = new Dictionary<string, Action>
|
||||
{
|
||||
{ "ButtonZl", () => ViewModel.Config.ButtonZl = Key.Unbound },
|
||||
{ "ButtonL", () => ViewModel.Config.ButtonL = Key.Unbound },
|
||||
{ "ButtonMinus", () => ViewModel.Config.ButtonMinus = Key.Unbound },
|
||||
{ "LeftStickButton", () => ViewModel.Config.LeftStickButton = Key.Unbound },
|
||||
{ "LeftStickUp", () => ViewModel.Config.LeftStickUp = Key.Unbound },
|
||||
{ "LeftStickDown", () => ViewModel.Config.LeftStickDown = Key.Unbound },
|
||||
{ "LeftStickRight", () => ViewModel.Config.LeftStickRight = Key.Unbound },
|
||||
{ "LeftStickLeft", () => ViewModel.Config.LeftStickLeft = Key.Unbound },
|
||||
{ "DpadUp", () => ViewModel.Config.DpadUp = Key.Unbound },
|
||||
{ "DpadDown", () => ViewModel.Config.DpadDown = Key.Unbound },
|
||||
{ "DpadLeft", () => ViewModel.Config.DpadLeft = Key.Unbound },
|
||||
{ "DpadRight", () => ViewModel.Config.DpadRight = Key.Unbound },
|
||||
{ "LeftButtonSr", () => ViewModel.Config.LeftButtonSr = Key.Unbound },
|
||||
{ "LeftButtonSl", () => ViewModel.Config.LeftButtonSl = Key.Unbound },
|
||||
{ "RightButtonSr", () => ViewModel.Config.RightButtonSr = Key.Unbound },
|
||||
{ "RightButtonSl", () => ViewModel.Config.RightButtonSl = Key.Unbound },
|
||||
{ "ButtonZr", () => ViewModel.Config.ButtonZr = Key.Unbound },
|
||||
{ "ButtonR", () => ViewModel.Config.ButtonR = Key.Unbound },
|
||||
{ "ButtonPlus", () => ViewModel.Config.ButtonPlus = Key.Unbound },
|
||||
{ "ButtonA", () => ViewModel.Config.ButtonA = Key.Unbound },
|
||||
{ "ButtonB", () => ViewModel.Config.ButtonB = Key.Unbound },
|
||||
{ "ButtonX", () => ViewModel.Config.ButtonX = Key.Unbound },
|
||||
{ "ButtonY", () => ViewModel.Config.ButtonY = Key.Unbound },
|
||||
{ "RightStickButton", () => ViewModel.Config.RightStickButton = Key.Unbound },
|
||||
{ "RightStickUp", () => ViewModel.Config.RightStickUp = Key.Unbound },
|
||||
{ "RightStickDown", () => ViewModel.Config.RightStickDown = Key.Unbound },
|
||||
{ "RightStickRight", () => ViewModel.Config.RightStickRight = Key.Unbound },
|
||||
{ "RightStickLeft", () => ViewModel.Config.RightStickLeft = Key.Unbound }
|
||||
};
|
||||
|
||||
if (buttonActions.TryGetValue(_currentAssigner.ToggledButton.Name, out Action action))
|
||||
{
|
||||
action();
|
||||
ViewModel.ParentModel.IsModified = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
|
||||
{
|
||||
base.OnDetachedFromVisualTree(e);
|
||||
|
||||
@@ -10,6 +10,8 @@ using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Input;
|
||||
using Ryujinx.Input.Assigner;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using Button = Ryujinx.Input.Button;
|
||||
using Key = Ryujinx.Common.Configuration.Hid.Key;
|
||||
|
||||
@@ -48,12 +50,47 @@ namespace Ryujinx.Ava.UI.Views.Settings
|
||||
private void MouseClick(object sender, PointerPressedEventArgs e)
|
||||
{
|
||||
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
||||
bool shouldRemoveBinding = e.GetCurrentPoint(this).Properties.IsRightButtonPressed;
|
||||
|
||||
if (shouldRemoveBinding)
|
||||
{
|
||||
DeleteBind();
|
||||
}
|
||||
|
||||
_currentAssigner?.Cancel(shouldUnbind);
|
||||
|
||||
PointerPressed -= MouseClick;
|
||||
}
|
||||
|
||||
private void DeleteBind()
|
||||
{
|
||||
if (DataContext is not SettingsViewModel viewModel)
|
||||
return;
|
||||
|
||||
if (_currentAssigner != null)
|
||||
{
|
||||
Dictionary<string, Action> buttonActions = new Dictionary<string, Action>
|
||||
{
|
||||
{ "ToggleVSyncMode", () => viewModel.KeyboardHotkey.ToggleVSyncMode = Key.Unbound },
|
||||
{ "Screenshot", () => viewModel.KeyboardHotkey.Screenshot = Key.Unbound },
|
||||
{ "ShowUI", () => viewModel.KeyboardHotkey.ShowUI = Key.Unbound },
|
||||
{ "Pause", () => viewModel.KeyboardHotkey.Pause = Key.Unbound },
|
||||
{ "ToggleMute", () => viewModel.KeyboardHotkey.ToggleMute = Key.Unbound },
|
||||
{ "ResScaleUp", () => viewModel.KeyboardHotkey.ResScaleUp = Key.Unbound },
|
||||
{ "ResScaleDown", () => viewModel.KeyboardHotkey.ResScaleDown = Key.Unbound },
|
||||
{ "VolumeUp", () => viewModel.KeyboardHotkey.VolumeUp = Key.Unbound },
|
||||
{ "VolumeDown", () => viewModel.KeyboardHotkey.VolumeDown = Key.Unbound },
|
||||
{ "CustomVSyncIntervalIncrement", () => viewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = Key.Unbound },
|
||||
{ "CustomVSyncIntervalDecrement", () => viewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = Key.Unbound }
|
||||
};
|
||||
|
||||
if (buttonActions.TryGetValue(_currentAssigner.ToggledButton.Name, out Action action))
|
||||
{
|
||||
action();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (sender is ToggleButton button)
|
||||
|
||||
Reference in New Issue
Block a user