Compare commits

...

31 Commits

Author SHA1 Message Date
Vladimir Sokolov
c72aacc6e1 Merge b9beb76e9b into 05b4bd8c61 2025-03-12 23:31:24 +03:00
Evan Husted
05b4bd8c61 UI: Use a new repo for amiibo stuff specifically 2025-03-12 14:17:14 -05:00
Evan Husted
b9beb76e9b Merge branch 'master' into Master_PR 2025-03-12 13:38:51 -05:00
Milihraim
20111a651c Update Russian (#745) 2025-03-12 00:12:37 -05:00
WilliamWsyHK
659e580f4d Update TChinese translation (#738) 2025-03-11 23:34:57 -05:00
Evan Husted
e6339ac950 fix logo in readme 2025-03-11 21:35:25 -05:00
Vladimir Sokolov
53c44b2e1d Merge branch 'master' into Master_PR 2025-03-09 21:49:39 +10:00
Vladimir Sokolov
ef5177f050 Merge branch 'master' into Master_PR 2025-03-09 10:58:21 +10:00
Vladimir Sokolov
28bcb85c31 Merge branch 'master' into Master_PR 2025-03-06 22:13:17 +10:00
Vladimir Sokolov
da0d2e1b70 Merge branch 'master' into Master_PR 2025-03-06 17:32:24 +10:00
Vova
db08498a89 Addition: Device Name and ID are displayed when the controller is turned off, but the controller is configured.
Added the "Name" property for controllers.
Changed the controller setup message to be more informative.
2025-03-06 17:13:11 +10:00
Vova
7a43dcb513 Merge branch 'Master_PR' of https://github.com/Goodfeat/Ryujinx_alt into Master_PR 2025-03-06 14:52:48 +10:00
Vova
f2329d0e8a Fixed bug with turning off active gamepad (independent profiles)
When switching profiles, if the profile does not belong to the gamepad itself, the gamepad began to be displayed as turned off.
Fixed a bug where the return button did not return the initially selected gamepad
2025-03-06 14:52:30 +10:00
Vladimir Sokolov
3aa7ed661d Merge branch 'master' into Master_PR 2025-03-06 11:44:18 +10:00
Vladimir Sokolov
6e824e44b8 Merge branch 'master' into Master_PR 2025-03-06 08:38:55 +10:00
Vladimir Sokolov
a964bf8f68 Merge branch 'master' into Master_PR 2025-03-05 19:12:19 +10:00
Vladimir Sokolov
89e4d287d6 Merge branch 'master' into Master_PR 2025-03-05 09:18:36 +10:00
Vladimir Sokolov
f34745a66c Merge branch 'master' into Master_PR 2025-03-04 21:31:56 +10:00
Vladimir Sokolov
d5b7851c9b Merge branch 'master' into Master_PR 2025-03-03 21:22:24 +10:00
Vova
1b7032b589 smal fix 2025-03-03 00:07:05 +10:00
Vova
e097ea71ff Fix: exclude device id when loading preset (independent presets)
fixed bug when selected gamepad disappears if another gamepad was disconnected
2025-03-02 23:49:40 +10:00
Vova
299f2144c8 Bug fixes, functionality improvements:
Now the profile changes immediately upon selection.
The icon for restoring settings has been changed.
A bug has been fixed where restoring settings did not restore the previously selected gamepad.
2025-03-02 19:07:49 +10:00
Vova
33e3ba9ff2 Fixed profiles on the input page:
- profiles are unlinked from controllers
- sometimes a new profile after saving changed to the previous one, had to select it again (fixed)
- when deleting, the profile now resets the name to "default"
2025-03-01 23:44:05 +10:00
Vladimir Sokolov
9dc36646c1 Merge branch 'master' into Master_PR 2025-02-28 20:54:11 +10:00
Vova
8eea75a6e8 Small fix 2025-02-23 16:44:10 +10:00
Vladimir Sokolov
57fbcc7aed Merge branch 'master' into Master_PR 2025-02-23 16:18:11 +10:00
Vova
d1c15f3562 Fixed a bug with the (undo last changes) button in the gamepad settings 2025-02-23 16:16:43 +10:00
Vova
0423fad7ff Merge branch 'Master_PR' of https://github.com/Goodfeat/Ryujinx_alt into Master_PR 2025-02-23 16:04:12 +10:00
Vova
1951fe0077 Added the ability to delete assigned buttons with the right mouse button in the settings.
- for keyboard
- for hotkeys
2025-02-23 15:59:03 +10:00
Vladimir Sokolov
7fd5a63a5d Merge branch 'master' into Master_PR 2025-02-23 14:18:24 +10:00
Vova
a0594e8169 Improved interaction with "Input" settings.
- paired devices have notifications that they are configured and require connection
- paired devices load the configuration when connected
- A notification appears when changing control configuration settings.
- Now control settings will be saved only when they are changed
- Added a button to roll back changes to the previously saved state
- Fixed a bug: when switching the "player", if the "input device" and "controller type" settings were changed, the save dialog box did not appear.
- "Motion", "Rumble" and "Led" also have events notifying about changes
2025-02-23 10:20:42 +10:00
15 changed files with 579 additions and 154 deletions

View File

@@ -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%">

View File

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

View File

@@ -49,7 +49,6 @@
<TextBlock
Classes="globalConfigMarker"/>
</StackPanel>
</Border>
</Design.PreviewWith>
<Style Selector="DropDownButton">

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

View File

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

View File

@@ -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,

View File

@@ -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,

View File

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

View File

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

View File

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

View File

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

View File

@@ -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">

View File

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

View File

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

View File

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