Merge branch 'master' of https://github.com/Goodfeat/Ryujinx_alt
This commit is contained in:
@@ -319,31 +319,12 @@ namespace Ryujinx.Ava
|
||||
public void VSyncModeToggle()
|
||||
{
|
||||
VSyncMode oldVSyncMode = Device.VSyncMode;
|
||||
VSyncMode newVSyncMode = VSyncMode.Switch;
|
||||
bool customVSyncIntervalEnabled = ConfigurationState.Instance.Graphics.EnableCustomVSyncInterval.Value;
|
||||
|
||||
switch (oldVSyncMode)
|
||||
{
|
||||
case VSyncMode.Switch:
|
||||
newVSyncMode = VSyncMode.Unbounded;
|
||||
break;
|
||||
case VSyncMode.Unbounded:
|
||||
if (customVSyncIntervalEnabled)
|
||||
{
|
||||
newVSyncMode = VSyncMode.Custom;
|
||||
}
|
||||
else
|
||||
{
|
||||
newVSyncMode = VSyncMode.Switch;
|
||||
}
|
||||
|
||||
break;
|
||||
case VSyncMode.Custom:
|
||||
newVSyncMode = VSyncMode.Switch;
|
||||
break;
|
||||
}
|
||||
|
||||
UpdateVSyncMode(this, new ReactiveEventArgs<VSyncMode>(oldVSyncMode, newVSyncMode));
|
||||
UpdateVSyncMode(this, new ReactiveEventArgs<VSyncMode>(
|
||||
oldVSyncMode,
|
||||
oldVSyncMode.Next(customVSyncIntervalEnabled))
|
||||
);
|
||||
}
|
||||
|
||||
private void UpdateCustomVSyncIntervalValue(object sender, ReactiveEventArgs<int> e)
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
<Styles xmlns="https://github.com/avaloniaui"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<Style Selector="MenuItem.withCheckbox Viewbox#PART_IconPresenter">
|
||||
<Setter Property="MaxHeight" Value="36" />
|
||||
<Setter Property="MinHeight" Value="36" />
|
||||
<Setter Property="MaxWidth" Value="36" />
|
||||
<Setter Property="MinWidth" Value="36" />
|
||||
</Style>
|
||||
<Style Selector="MenuItem.withCheckbox ContentPresenter#PART_HeaderPresenter">
|
||||
<Setter Property="Padding" Value="-10,0,0,0" />
|
||||
</Style>
|
||||
</Styles>
|
||||
|
||||
@@ -218,6 +218,15 @@
|
||||
<Setter Property="BorderBrush"
|
||||
Value="{DynamicResource ThemeControlBorderColor}" />
|
||||
</Style>
|
||||
<Style Selector="MenuItem.withCheckbox Viewbox#PART_IconPresenter">
|
||||
<Setter Property="MaxHeight" Value="36" />
|
||||
<Setter Property="MinHeight" Value="36" />
|
||||
<Setter Property="MaxWidth" Value="36" />
|
||||
<Setter Property="MinWidth" Value="36" />
|
||||
</Style>
|
||||
<Style Selector="MenuItem.withCheckbox ContentPresenter#PART_HeaderPresenter">
|
||||
<Setter Property="Padding" Value="-10,0,0,0" />
|
||||
</Style>
|
||||
<Style Selector="TabItem > ScrollViewer">
|
||||
<Setter Property="Background"
|
||||
Value="{DynamicResource ThemeBackgroundColor}" />
|
||||
|
||||
@@ -7747,6 +7747,31 @@
|
||||
"zh_TW": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "ControllerSettingsLedColorRainbowSpeed",
|
||||
"Translations": {
|
||||
"ar_SA": "",
|
||||
"de_DE": "",
|
||||
"el_GR": "",
|
||||
"en_US": "Rainbow Speed",
|
||||
"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": "ControllerSettingsLedColor",
|
||||
"Translations": {
|
||||
@@ -11450,126 +11475,126 @@
|
||||
{
|
||||
"ID": "DialogConfirmationTitle",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - تأكيد",
|
||||
"de_DE": "Ryujinx - Bestätigung",
|
||||
"el_GR": "Ryujinx - Επιβεβαίωση",
|
||||
"en_US": "Ryujinx - Confirmation",
|
||||
"es_ES": "Ryujinx - Confirmación",
|
||||
"ar_SA": "{0} - تأكيد",
|
||||
"de_DE": "{0} - Bestätigung",
|
||||
"el_GR": "{0} - Επιβεβαίωση",
|
||||
"en_US": "{0} - Confirmation",
|
||||
"es_ES": "{0} - Confirmación",
|
||||
"fr_FR": "",
|
||||
"he_IL": "ריוג'ינקס - אישור",
|
||||
"it_IT": "Ryujinx - Conferma",
|
||||
"ja_JP": "Ryujinx - 確認",
|
||||
"ko_KR": "Ryujinx - 확인",
|
||||
"no_NO": "Ryujinx - Bekreftelse",
|
||||
"pl_PL": "Ryujinx - Potwierdzenie",
|
||||
"pt_BR": "Ryujinx - Confirmação",
|
||||
"ru_RU": "Ryujinx - Подтверждение",
|
||||
"sv_SE": "Ryujinx - Bekräftelse",
|
||||
"th_TH": "Ryujinx - ยืนยัน",
|
||||
"tr_TR": "Ryujinx - Onay",
|
||||
"uk_UA": "Ryujinx - Підтвердження",
|
||||
"zh_CN": "Ryujinx - 确认",
|
||||
"zh_TW": "Ryujinx - 確認"
|
||||
"he_IL": "{0} - אישור",
|
||||
"it_IT": "{0} - Conferma",
|
||||
"ja_JP": "{0} - 確認",
|
||||
"ko_KR": "{0} - 확인",
|
||||
"no_NO": "{0} - Bekreftelse",
|
||||
"pl_PL": "{0} - Potwierdzenie",
|
||||
"pt_BR": "{0} - Confirmação",
|
||||
"ru_RU": "{0} - Подтверждение",
|
||||
"sv_SE": "{0} - Bekräftelse",
|
||||
"th_TH": "{0} - ยืนยัน",
|
||||
"tr_TR": "{0} - Onay",
|
||||
"uk_UA": "{0} - Підтвердження",
|
||||
"zh_CN": "{0} - 确认",
|
||||
"zh_TW": "{0} - 確認"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "DialogUpdaterTitle",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - المحدث",
|
||||
"ar_SA": "{0} - المحدث",
|
||||
"de_DE": "",
|
||||
"el_GR": "Ryujinx - Ενημερωτής",
|
||||
"en_US": "Ryujinx - Updater",
|
||||
"es_ES": "Ryujinx - Actualizador",
|
||||
"fr_FR": "Ryujinx - Mise à Jour",
|
||||
"he_IL": "ריוג'ינקס - מעדכן",
|
||||
"it_IT": "Ryujinx - Aggiornamento",
|
||||
"ja_JP": "Ryujinx - アップデータ",
|
||||
"ko_KR": "Ryujinx - 업데이터",
|
||||
"no_NO": "Ryujinx – Oppdaterer",
|
||||
"pl_PL": "Ryujinx - Asystent aktualizacji",
|
||||
"pt_BR": "Ryujinx - Atualizador",
|
||||
"ru_RU": "Ryujinx - Обновление",
|
||||
"sv_SE": "Ryujinx - Uppdatering",
|
||||
"th_TH": "Ryujinx - อัพเดต",
|
||||
"tr_TR": "Ryujinx - Güncelleyici",
|
||||
"uk_UA": "Ryujinx - Програма оновлення",
|
||||
"zh_CN": "Ryujinx - 更新",
|
||||
"zh_TW": "Ryujinx - 更新程式"
|
||||
"el_GR": "{0} - Ενημερωτής",
|
||||
"en_US": "{0} - Updater",
|
||||
"es_ES": "{0} - Actualizador",
|
||||
"fr_FR": "{0} - Mise à Jour",
|
||||
"he_IL": "{0} - מעדכן",
|
||||
"it_IT": "{0} - Aggiornamento",
|
||||
"ja_JP": "{0} - アップデータ",
|
||||
"ko_KR": "{0} - 업데이터",
|
||||
"no_NO": "{0} – Oppdaterer",
|
||||
"pl_PL": "{0} - Asystent aktualizacji",
|
||||
"pt_BR": "{0} - Atualizador",
|
||||
"ru_RU": "{0} - Обновление",
|
||||
"sv_SE": "{0} - Uppdatering",
|
||||
"th_TH": "{0} - อัพเดต",
|
||||
"tr_TR": "{0} - Güncelleyici",
|
||||
"uk_UA": "{0} - Програма оновлення",
|
||||
"zh_CN": "{0} - 更新",
|
||||
"zh_TW": "{0} - 更新程式"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "DialogErrorTitle",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - خطأ",
|
||||
"de_DE": "Ryujinx - Fehler",
|
||||
"el_GR": "Ryujinx - Σφάλμα",
|
||||
"en_US": "Ryujinx - Error",
|
||||
"ar_SA": "{0} - خطأ",
|
||||
"de_DE": "{0} - Fehler",
|
||||
"el_GR": "{0} - Σφάλμα",
|
||||
"en_US": "{0} - Error",
|
||||
"es_ES": "",
|
||||
"fr_FR": "Ryujinx - Erreur",
|
||||
"he_IL": "ריוג'ינקס - שגיאה",
|
||||
"it_IT": "Ryujinx - Errore",
|
||||
"ja_JP": "Ryujinx - エラー",
|
||||
"ko_KR": "Ryujinx - 오류",
|
||||
"no_NO": "Ryujinx - Feil",
|
||||
"pl_PL": "Ryujinx - Błąd",
|
||||
"pt_BR": "Ryujinx - Erro",
|
||||
"ru_RU": "Ryujinx - Ошибка",
|
||||
"sv_SE": "Ryujinx - Fel",
|
||||
"th_TH": "Ryujinx - ผิดพลาด",
|
||||
"tr_TR": "Ryujinx - Hata",
|
||||
"uk_UA": "Ryujinx - Помилка",
|
||||
"zh_CN": "Ryujinx - 错误",
|
||||
"zh_TW": "Ryujinx - 錯誤"
|
||||
"fr_FR": "{0} - Erreur",
|
||||
"he_IL": "{0} - שגיאה",
|
||||
"it_IT": "{0} - Errore",
|
||||
"ja_JP": "{0} - エラー",
|
||||
"ko_KR": "{0} - 오류",
|
||||
"no_NO": "{0} - Feil",
|
||||
"pl_PL": "{0} - Błąd",
|
||||
"pt_BR": "{0} - Erro",
|
||||
"ru_RU": "{0} - Ошибка",
|
||||
"sv_SE": "{0} - Fel",
|
||||
"th_TH": "{0} - ผิดพลาด",
|
||||
"tr_TR": "{0} - Hata",
|
||||
"uk_UA": "{0} - Помилка",
|
||||
"zh_CN": "{0} - 错误",
|
||||
"zh_TW": "{0} - 錯誤"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "DialogWarningTitle",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - تحذير",
|
||||
"de_DE": "Ryujinx - Warnung",
|
||||
"el_GR": "Ryujinx - Προειδοποίηση",
|
||||
"en_US": "Ryujinx - Warning",
|
||||
"es_ES": "Ryujinx - Advertencia",
|
||||
"fr_FR": "Ryujinx - Avertissement",
|
||||
"he_IL": "ריוג'ינקס - אזהרה",
|
||||
"it_IT": "Ryujinx - Avviso",
|
||||
"ja_JP": "Ryujinx - 警告",
|
||||
"ko_KR": "Ryujinx - 경고",
|
||||
"no_NO": "Ryujinx - Advarsel",
|
||||
"pl_PL": "Ryujinx - Ostrzeżenie",
|
||||
"pt_BR": "Ryujinx - Alerta",
|
||||
"ru_RU": "Ryujinx - Предупреждение",
|
||||
"sv_SE": "Ryujinx - Varning",
|
||||
"th_TH": "Ryujinx - คำเตือน",
|
||||
"tr_TR": "Ryujinx - Uyarı",
|
||||
"uk_UA": "Ryujinx - Попередження",
|
||||
"zh_CN": "Ryujinx - 警告",
|
||||
"zh_TW": "Ryujinx - 警告"
|
||||
"ar_SA": "{0} - تحذير",
|
||||
"de_DE": "{0} - Warnung",
|
||||
"el_GR": "{0} - Προειδοποίηση",
|
||||
"en_US": "{0} - Warning",
|
||||
"es_ES": "{0} - Advertencia",
|
||||
"fr_FR": "{0} - Avertissement",
|
||||
"he_IL": "{0} - אזהרה",
|
||||
"it_IT": "{0} - Avviso",
|
||||
"ja_JP": "{0} - 警告",
|
||||
"ko_KR": "{0} - 경고",
|
||||
"no_NO": "{0} - Advarsel",
|
||||
"pl_PL": "{0} - Ostrzeżenie",
|
||||
"pt_BR": "{0} - Alerta",
|
||||
"ru_RU": "{0} - Предупреждение",
|
||||
"sv_SE": "{0} - Varning",
|
||||
"th_TH": "{0} - คำเตือน",
|
||||
"tr_TR": "{0} - Uyarı",
|
||||
"uk_UA": "{0} - Попередження",
|
||||
"zh_CN": "{0} - 警告",
|
||||
"zh_TW": "{0} - 警告"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "DialogExitTitle",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - الخروج",
|
||||
"de_DE": "Ryujinx - Beenden",
|
||||
"el_GR": "Ryujinx - Έξοδος",
|
||||
"en_US": "Ryujinx - Exit",
|
||||
"es_ES": "Ryujinx - Salir",
|
||||
"fr_FR": "Ryujinx - Quitter",
|
||||
"he_IL": "ריוג'ינקס - יציאה",
|
||||
"it_IT": "Ryujinx - Esci",
|
||||
"ja_JP": "Ryujinx - 終了",
|
||||
"ko_KR": "Ryujinx - 종료",
|
||||
"no_NO": "Ryujinx - Avslutt",
|
||||
"pl_PL": "Ryujinx - Wyjdź",
|
||||
"pt_BR": "Ryujinx - Sair",
|
||||
"ru_RU": "Ryujinx - Выход",
|
||||
"sv_SE": "Ryujinx - Avslut",
|
||||
"th_TH": "Ryujinx - ออก",
|
||||
"tr_TR": "Ryujinx - Çıkış",
|
||||
"uk_UA": "Ryujinx - Вихід",
|
||||
"zh_CN": "Ryujinx - 退出",
|
||||
"zh_TW": "Ryujinx - 結束"
|
||||
"ar_SA": "{0} - الخروج",
|
||||
"de_DE": "{0} - Beenden",
|
||||
"el_GR": "{0} - Έξοδος",
|
||||
"en_US": "{0} - Exit",
|
||||
"es_ES": "{0} - Salir",
|
||||
"fr_FR": "{0} - Quitter",
|
||||
"he_IL": "{0} - יציאה",
|
||||
"it_IT": "{0} - Esci",
|
||||
"ja_JP": "{0} - 終了",
|
||||
"ko_KR": "{0} - 종료",
|
||||
"no_NO": "{0} - Avslutt",
|
||||
"pl_PL": "{0} - Wyjdź",
|
||||
"pt_BR": "{0} - Sair",
|
||||
"ru_RU": "{0} - Выход",
|
||||
"sv_SE": "{0} - Avslut",
|
||||
"th_TH": "{0} - ออก",
|
||||
"tr_TR": "{0} - Çıkış",
|
||||
"uk_UA": "{0} - Вихід",
|
||||
"zh_CN": "{0} - 退出",
|
||||
"zh_TW": "{0} - 結束"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -17000,26 +17025,26 @@
|
||||
{
|
||||
"ID": "DialogStopEmulationTitle",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - إيقاف المحاكاة",
|
||||
"de_DE": "Ryujinx - Beende Emulation",
|
||||
"el_GR": "Ryujinx - Διακοπή εξομοίωσης",
|
||||
"en_US": "Ryujinx - Stop Emulation",
|
||||
"es_ES": "Ryujinx - Detener emulación",
|
||||
"fr_FR": "Ryujinx - Arrêt de l'émulation",
|
||||
"he_IL": "ריוג'ינקס - עצור אמולציה",
|
||||
"it_IT": "Ryujinx - Ferma emulazione",
|
||||
"ja_JP": "Ryujinx - エミュレーションを中止",
|
||||
"ko_KR": "Ryujinx - 에뮬레이션 중지",
|
||||
"no_NO": "Ryujinx - Stopp emulasjon",
|
||||
"pl_PL": "Ryujinx - Zatrzymaj Emulację",
|
||||
"pt_BR": "Ryujinx - Parar emulação",
|
||||
"ru_RU": "Ryujinx - Остановка эмуляции",
|
||||
"sv_SE": "Ryujinx - Stoppa emulering",
|
||||
"th_TH": "Ryujinx - หยุดการจำลอง",
|
||||
"tr_TR": "Ryujinx - Emülasyonu Durdur",
|
||||
"uk_UA": "Ryujinx - Зупинити емуляцію",
|
||||
"zh_CN": "Ryujinx - 停止模拟",
|
||||
"zh_TW": "Ryujinx - 停止模擬"
|
||||
"ar_SA": "{0} - إيقاف المحاكاة",
|
||||
"de_DE": "{0} - Beende Emulation",
|
||||
"el_GR": "{0} - Διακοπή εξομοίωσης",
|
||||
"en_US": "{0} - Stop Emulation",
|
||||
"es_ES": "{0} - Detener emulación",
|
||||
"fr_FR": "{0} - Arrêt de l'émulation",
|
||||
"he_IL": "{0} - עצור אמולציה",
|
||||
"it_IT": "{0} - Ferma emulazione",
|
||||
"ja_JP": "{0} - エミュレーションを中止",
|
||||
"ko_KR": "{0} - 에뮬레이션 중지",
|
||||
"no_NO": "{0} - Stopp emulasjon",
|
||||
"pl_PL": "{0} - Zatrzymaj Emulację",
|
||||
"pt_BR": "{0} - Parar emulação",
|
||||
"ru_RU": "{0} - Остановка эмуляции",
|
||||
"sv_SE": "{0} - Stoppa emulering",
|
||||
"th_TH": "{0} - หยุดการจำลอง",
|
||||
"tr_TR": "{0} - Emülasyonu Durdur",
|
||||
"uk_UA": "{0} - Зупинити емуляцію",
|
||||
"zh_CN": "{0} - 停止模拟",
|
||||
"zh_TW": "{0} - 停止模擬"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -17925,51 +17950,51 @@
|
||||
{
|
||||
"ID": "RyujinxInfo",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - معلومات",
|
||||
"ar_SA": "{0} - معلومات",
|
||||
"de_DE": "",
|
||||
"el_GR": "Ryujinx - Πληροφορίες",
|
||||
"en_US": "Ryujinx - Info",
|
||||
"el_GR": "{0} - Πληροφορίες",
|
||||
"en_US": "{0} - Info",
|
||||
"es_ES": "",
|
||||
"fr_FR": "",
|
||||
"he_IL": "ריוג'ינקס - מידע",
|
||||
"it_IT": "Ryujinx - Informazioni",
|
||||
"ja_JP": "Ryujinx - 情報",
|
||||
"ko_KR": "Ryujinx - 정보",
|
||||
"no_NO": "Ryujinx - Informasjon",
|
||||
"he_IL": "{0} - מידע",
|
||||
"it_IT": "{0} - Informazioni",
|
||||
"ja_JP": "{0} - 情報",
|
||||
"ko_KR": "{0} - 정보",
|
||||
"no_NO": "{0} - Informasjon",
|
||||
"pl_PL": "",
|
||||
"pt_BR": "Ryujinx - Informação",
|
||||
"ru_RU": "Ryujinx - Информация",
|
||||
"pt_BR": "{0} - Informação",
|
||||
"ru_RU": "{0} - Информация",
|
||||
"sv_SE": "",
|
||||
"th_TH": "Ryujinx – ข้อมูล",
|
||||
"tr_TR": "Ryujinx - Bilgi",
|
||||
"uk_UA": "Ryujin x - Інформація",
|
||||
"zh_CN": "Ryujinx - 信息",
|
||||
"zh_TW": "Ryujinx - 資訊"
|
||||
"th_TH": "{0} – ข้อมูล",
|
||||
"tr_TR": "{0} - Bilgi",
|
||||
"uk_UA": "{0} - Інформація",
|
||||
"zh_CN": "{0} - 信息",
|
||||
"zh_TW": "{0} - 資訊"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ID": "RyujinxConfirm",
|
||||
"Translations": {
|
||||
"ar_SA": "ريوجينكس - تأكيد",
|
||||
"de_DE": "Ryujinx - Bestätigung",
|
||||
"el_GR": "Ryujinx - Επιβεβαίωση",
|
||||
"en_US": "Ryujinx - Confirmation",
|
||||
"es_ES": "Ryujinx - Confirmación",
|
||||
"ar_SA": "{0} - تأكيد",
|
||||
"de_DE": "{0} - Bestätigung",
|
||||
"el_GR": "{0} - Επιβεβαίωση",
|
||||
"en_US": "{0} - Confirmation",
|
||||
"es_ES": "{0} - Confirmación",
|
||||
"fr_FR": "",
|
||||
"he_IL": "ריוג'ינקס - אישור",
|
||||
"it_IT": "Ryujinx - Conferma",
|
||||
"ja_JP": "Ryujinx - 確認",
|
||||
"ko_KR": "Ryujinx - 확인",
|
||||
"no_NO": "Ryujinx - Bekreftelse",
|
||||
"pl_PL": "Ryujinx - Potwierdzenie",
|
||||
"pt_BR": "Ryujinx - Confirmação",
|
||||
"ru_RU": "Ryujinx - Подтверждение",
|
||||
"sv_SE": "Ryujinx - Bekräfta",
|
||||
"th_TH": "Ryujinx - ยืนยัน",
|
||||
"tr_TR": "Ryujinx - Doğrulama",
|
||||
"uk_UA": "Ryujinx - Підтвердження",
|
||||
"zh_CN": "Ryujinx - 确认",
|
||||
"zh_TW": "Ryujinx - 確認"
|
||||
"he_IL": "{0} - אישור",
|
||||
"it_IT": "{0} - Conferma",
|
||||
"ja_JP": "{0} - 確認",
|
||||
"ko_KR": "{0} - 확인",
|
||||
"no_NO": "{0} - Bekreftelse",
|
||||
"pl_PL": "{0} - Potwierdzenie",
|
||||
"pt_BR": "{0} - Confirmação",
|
||||
"ru_RU": "{0} - Подтверждение",
|
||||
"sv_SE": "{0} - Bekräfta",
|
||||
"th_TH": "{0} - ยืนยัน",
|
||||
"tr_TR": "{0} - Doğrulama",
|
||||
"uk_UA": "{0} - Підтвердження",
|
||||
"zh_CN": "{0} - 确认",
|
||||
"zh_TW": "{0} - 確認"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -18775,26 +18800,26 @@
|
||||
{
|
||||
"ID": "RyujinxUpdater",
|
||||
"Translations": {
|
||||
"ar_SA": "محدث ريوجينكس",
|
||||
"de_DE": "Ryujinx - Updater",
|
||||
"el_GR": "Ryujinx Ενημερωτής",
|
||||
"en_US": "Ryujinx Updater",
|
||||
"es_ES": "Actualizador de Ryujinx",
|
||||
"fr_FR": "Mise à jour de Ryujinx",
|
||||
"he_IL": "מעדכן ריוג'ינקס",
|
||||
"it_IT": "Aggiornamento di Ryujinx",
|
||||
"ja_JP": "Ryujinx アップデータ",
|
||||
"ko_KR": "Ryujinx 업데이터",
|
||||
"no_NO": "Ryujinx Oppgradering",
|
||||
"pl_PL": "Aktualizator Ryujinx",
|
||||
"pt_BR": "Atualizador do Ryujinx",
|
||||
"ru_RU": "Ryujinx - Обновление",
|
||||
"sv_SE": "Uppdaterare för Ryujinx",
|
||||
"th_TH": "ตัวอัปเดต Ryujinx",
|
||||
"tr_TR": "Ryujinx Güncelleyicisi",
|
||||
"uk_UA": "Програма оновлення Ryujinx",
|
||||
"zh_CN": "Ryujinx 更新",
|
||||
"zh_TW": "Ryujinx 更新程式"
|
||||
"ar_SA": "محدث {0}",
|
||||
"de_DE": "",
|
||||
"el_GR": "{0} Ενημερωτής",
|
||||
"en_US": "{0} Updater",
|
||||
"es_ES": "Actualizador de {0}",
|
||||
"fr_FR": "Mise à jour de {0}",
|
||||
"he_IL": "מעדכן {0}",
|
||||
"it_IT": "Aggiornamento di {0}",
|
||||
"ja_JP": "{0} アップデータ",
|
||||
"ko_KR": "{0} 업데이터",
|
||||
"no_NO": "{0} Oppgradering",
|
||||
"pl_PL": "Aktualizator {0}",
|
||||
"pt_BR": "Atualizador do {0}",
|
||||
"ru_RU": "{0} Обновление",
|
||||
"sv_SE": "Uppdaterare för {0}",
|
||||
"th_TH": "ตัวอัปเดต {0}",
|
||||
"tr_TR": "{0} Güncelleyicisi",
|
||||
"uk_UA": "Програма оновлення {0}",
|
||||
"zh_CN": "{0} 更新",
|
||||
"zh_TW": "{0} 更新程式"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -337,7 +337,7 @@ namespace Ryujinx.Ava.Common
|
||||
|
||||
if (publicDataNca is null)
|
||||
{
|
||||
Logger.Error?.Print(LogClass.Application, "Extraction failure. The NCA was not present in the selected file");
|
||||
Logger.Error?.Print(LogClass.Application, "Extraction failure. The PublicData NCA was not present in the selected file");
|
||||
|
||||
Dispatcher.UIThread.InvokeAsync(async () =>
|
||||
{
|
||||
@@ -349,10 +349,6 @@ namespace Ryujinx.Ava.Common
|
||||
return;
|
||||
}
|
||||
|
||||
IntegrityCheckLevel checkLevel = ConfigurationState.Instance.System.EnableFsIntegrityChecks
|
||||
? IntegrityCheckLevel.ErrorOnInvalid
|
||||
: IntegrityCheckLevel.None;
|
||||
|
||||
int index = Nca.GetSectionIndexFromType(NcaSectionType.Data, publicDataNca.Header.ContentType);
|
||||
|
||||
try
|
||||
|
||||
@@ -44,6 +44,16 @@ 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);
|
||||
}
|
||||
|
||||
public string this[LocaleKeys key]
|
||||
@@ -88,11 +98,16 @@ namespace Ryujinx.Ava.Common.Locale
|
||||
public static string FormatDynamicValue(LocaleKeys key, params object[] values)
|
||||
=> Instance.UpdateAndGetDynamicValue(key, values);
|
||||
|
||||
public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values)
|
||||
public void SetDynamicValues(LocaleKeys key, params object[] values)
|
||||
{
|
||||
_dynamicValues[key] = values;
|
||||
|
||||
OnPropertyChanged("Translation");
|
||||
}
|
||||
|
||||
public string UpdateAndGetDynamicValue(LocaleKeys key, params object[] values)
|
||||
{
|
||||
SetDynamicValues(key, values);
|
||||
|
||||
return this[key];
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
using DiscordRPC;
|
||||
using Gommon;
|
||||
using Humanizer;
|
||||
using Humanizer.Localisation;
|
||||
using Ryujinx.Ava.Utilities;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.Ava.Utilities.Configuration;
|
||||
|
||||
@@ -4,7 +4,6 @@ using Ryujinx.Ava.Utilities.Configuration;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.HLE;
|
||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||
using Ryujinx.HLE.HOS.SystemState;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using Humanizer;
|
||||
using LibHac.Ns;
|
||||
using Ryujinx.Ava;
|
||||
using Ryujinx.Ava.UI.Models;
|
||||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
|
||||
@@ -5,11 +5,9 @@ using Gommon;
|
||||
using Projektanker.Icons.Avalonia;
|
||||
using Projektanker.Icons.Avalonia.FontAwesome;
|
||||
using Projektanker.Icons.Avalonia.MaterialDesign;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.Windows;
|
||||
using Ryujinx.Ava.Utilities;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.Ava.Utilities.Configuration;
|
||||
using Ryujinx.Ava.Utilities.SystemInfo;
|
||||
using Ryujinx.Common;
|
||||
@@ -23,7 +21,6 @@ using Ryujinx.SDL2.Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -112,7 +109,11 @@ namespace Ryujinx.Ava
|
||||
// Hook unhandled exception and process exit events.
|
||||
AppDomain.CurrentDomain.UnhandledException += (sender, e)
|
||||
=> ProcessUnhandledException(sender, e.ExceptionObject as Exception, e.IsTerminating);
|
||||
TaskScheduler.UnobservedTaskException += (sender, e)
|
||||
=> ProcessUnhandledException(sender, e.Exception, false);
|
||||
AppDomain.CurrentDomain.ProcessExit += (_, _) => Exit();
|
||||
|
||||
|
||||
|
||||
// Setup base data directory.
|
||||
AppDataManager.Initialize(CommandLineState.BaseDirPathArg);
|
||||
@@ -331,9 +332,7 @@ namespace Ryujinx.Ava
|
||||
log.PrintMsg(LogClass.Application, message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (isTerminating)
|
||||
Exit();
|
||||
}
|
||||
|
||||
@@ -123,13 +123,11 @@
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
</AvaloniaResource>
|
||||
<AvaloniaResource Include="Assets\Styles\Styles.xaml" />
|
||||
<AvaloniaResource Include="Assets\Styles\CheckboxMenuItemStyle.axaml" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Assets\locales.json" />
|
||||
<None Remove="Assets\Styles\Themes.xaml" />
|
||||
<None Remove="Assets\Styles\CheckboxMenuItemStyle.xaml" />
|
||||
<None Remove="Assets\Icons\Controller_JoyConLeft.svg" />
|
||||
<None Remove="Assets\Icons\Controller_JoyConPair.svg" />
|
||||
<None Remove="Assets\Icons\Controller_JoyConRight.svg" />
|
||||
@@ -151,7 +149,6 @@
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Assets\locales.json" />
|
||||
<EmbeddedResource Include="Assets\Styles\Styles.xaml" />
|
||||
<EmbeddedResource Include="Assets\Styles\CheckboxMenuItemStyle.axaml" />
|
||||
<EmbeddedResource Include="Assets\Icons\Controller_JoyConLeft.svg" />
|
||||
<EmbeddedResource Include="Assets\Icons\Controller_JoyConPair.svg" />
|
||||
<EmbeddedResource Include="Assets\Icons\Controller_JoyConRight.svg" />
|
||||
|
||||
@@ -16,6 +16,5 @@
|
||||
<Application.Styles>
|
||||
<sty:FluentAvaloniaTheme PreferUserAccentColor="True" PreferSystemTheme="False" />
|
||||
<StyleInclude Source="/Assets/Styles/Styles.xaml" />
|
||||
<StyleInclude Source="/Assets/Styles/CheckboxMenuItemStyle.axaml"/>
|
||||
</Application.Styles>
|
||||
</Application>
|
||||
|
||||
@@ -22,12 +22,12 @@ namespace Ryujinx.Ava
|
||||
{
|
||||
public class RyujinxApp : Application
|
||||
{
|
||||
internal static string FormatTitle(LocaleKeys? windowTitleKey = null)
|
||||
internal static string FormatTitle(LocaleKeys? windowTitleKey = null, bool includeVersion = true)
|
||||
=> windowTitleKey is null
|
||||
? $"{FullAppName} {Program.Version}"
|
||||
: $"{FullAppName} {Program.Version} - {LocaleManager.Instance[windowTitleKey.Value]}";
|
||||
? $"{FullAppName}{(includeVersion ? $" {Program.Version}" : string.Empty)}"
|
||||
: $"{FullAppName}{(includeVersion ? $" {Program.Version}" : string.Empty)} - {LocaleManager.Instance[windowTitleKey.Value]}";
|
||||
|
||||
public static readonly string FullAppName = ReleaseInformation.IsCanaryBuild ? "Ryujinx Canary" : "Ryujinx";
|
||||
public static readonly string FullAppName = string.Intern(ReleaseInformation.IsCanaryBuild ? "Ryujinx Canary" : "Ryujinx");
|
||||
|
||||
public static MainWindow MainWindow => Current!
|
||||
.ApplicationLifetime.Cast<IClassicDesktopStyleApplicationLifetime>()
|
||||
|
||||
@@ -6,12 +6,10 @@ using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Controls;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading.Tasks;
|
||||
using UserProfile = Ryujinx.Ava.UI.Models.UserProfile;
|
||||
using UserProfileSft = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile;
|
||||
|
||||
@@ -2,9 +2,6 @@ using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Platform.Storage;
|
||||
using Avalonia.Threading;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using LibHac;
|
||||
using LibHac.Fs;
|
||||
using LibHac.Tools.FsSystem.NcaUtils;
|
||||
using Ryujinx.Ava.Common;
|
||||
@@ -17,14 +14,11 @@ using Ryujinx.Ava.Utilities;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Helper;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.HLE.HOS;
|
||||
using SkiaSharp;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Path = System.IO.Path;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Controls
|
||||
@@ -128,7 +122,11 @@ namespace Ryujinx.Ava.UI.Controls
|
||||
public async void OpenModManager_Click(object sender, RoutedEventArgs args)
|
||||
{
|
||||
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||
await ModManagerWindow.Show(viewModel.SelectedApplication.Id, viewModel.SelectedApplication.Name);
|
||||
await ModManagerWindow.Show(
|
||||
viewModel.SelectedApplication.Id,
|
||||
viewModel.SelectedApplication.IdBase,
|
||||
viewModel.ApplicationLibrary,
|
||||
viewModel.SelectedApplication.Name);
|
||||
}
|
||||
|
||||
public async void PurgePtcCache_Click(object sender, RoutedEventArgs args)
|
||||
|
||||
@@ -2,7 +2,6 @@ using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using System;
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Controls.Notifications;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Input.Platform;
|
||||
using Avalonia.Interactivity;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Styling;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
using Avalonia.Media;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Configuration.Hid.Controller;
|
||||
using Ryujinx.Common.Configuration.Hid.Controller.Motion;
|
||||
using System;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models.Input
|
||||
{
|
||||
public class GamepadInputConfig : BaseModel
|
||||
public partial class GamepadInputConfig : BaseModel
|
||||
{
|
||||
public bool EnableCemuHookMotion { get; set; }
|
||||
public string DsuServerHost { get; set; }
|
||||
@@ -25,402 +25,58 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
public ControllerType ControllerType { get; set; }
|
||||
public PlayerIndex PlayerIndex { get; set; }
|
||||
|
||||
private StickInputId _leftJoystick;
|
||||
public StickInputId LeftJoystick
|
||||
{
|
||||
get => _leftJoystick;
|
||||
set
|
||||
{
|
||||
_leftJoystick = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private StickInputId _leftJoystick;
|
||||
[ObservableProperty] private bool _leftInvertStickX;
|
||||
[ObservableProperty] private bool _leftInvertStickY;
|
||||
[ObservableProperty] private bool _leftRotate90;
|
||||
[ObservableProperty] private GamepadInputId _leftStickButton;
|
||||
|
||||
private bool _leftInvertStickX;
|
||||
public bool LeftInvertStickX
|
||||
{
|
||||
get => _leftInvertStickX;
|
||||
set
|
||||
{
|
||||
_leftInvertStickX = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private StickInputId _rightJoystick;
|
||||
[ObservableProperty] private bool _rightInvertStickX;
|
||||
[ObservableProperty] private bool _rightInvertStickY;
|
||||
[ObservableProperty] private bool _rightRotate90;
|
||||
[ObservableProperty] private GamepadInputId _rightStickButton;
|
||||
|
||||
private bool _leftInvertStickY;
|
||||
public bool LeftInvertStickY
|
||||
{
|
||||
get => _leftInvertStickY;
|
||||
set
|
||||
{
|
||||
_leftInvertStickY = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private GamepadInputId _dpadUp;
|
||||
[ObservableProperty] private GamepadInputId _dpadDown;
|
||||
[ObservableProperty] private GamepadInputId _dpadLeft;
|
||||
[ObservableProperty] private GamepadInputId _dpadRight;
|
||||
|
||||
private bool _leftRotate90;
|
||||
public bool LeftRotate90
|
||||
{
|
||||
get => _leftRotate90;
|
||||
set
|
||||
{
|
||||
_leftRotate90 = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _leftStickButton;
|
||||
public GamepadInputId LeftStickButton
|
||||
{
|
||||
get => _leftStickButton;
|
||||
set
|
||||
{
|
||||
_leftStickButton = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private StickInputId _rightJoystick;
|
||||
public StickInputId RightJoystick
|
||||
{
|
||||
get => _rightJoystick;
|
||||
set
|
||||
{
|
||||
_rightJoystick = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private bool _rightInvertStickX;
|
||||
public bool RightInvertStickX
|
||||
{
|
||||
get => _rightInvertStickX;
|
||||
set
|
||||
{
|
||||
_rightInvertStickX = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private bool _rightInvertStickY;
|
||||
public bool RightInvertStickY
|
||||
{
|
||||
get => _rightInvertStickY;
|
||||
set
|
||||
{
|
||||
_rightInvertStickY = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private bool _rightRotate90;
|
||||
public bool RightRotate90
|
||||
{
|
||||
get => _rightRotate90;
|
||||
set
|
||||
{
|
||||
_rightRotate90 = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _rightStickButton;
|
||||
public GamepadInputId RightStickButton
|
||||
{
|
||||
get => _rightStickButton;
|
||||
set
|
||||
{
|
||||
_rightStickButton = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _dpadUp;
|
||||
public GamepadInputId DpadUp
|
||||
{
|
||||
get => _dpadUp;
|
||||
set
|
||||
{
|
||||
_dpadUp = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _dpadDown;
|
||||
public GamepadInputId DpadDown
|
||||
{
|
||||
get => _dpadDown;
|
||||
set
|
||||
{
|
||||
_dpadDown = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _dpadLeft;
|
||||
public GamepadInputId DpadLeft
|
||||
{
|
||||
get => _dpadLeft;
|
||||
set
|
||||
{
|
||||
_dpadLeft = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _dpadRight;
|
||||
public GamepadInputId DpadRight
|
||||
{
|
||||
get => _dpadRight;
|
||||
set
|
||||
{
|
||||
_dpadRight = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonL;
|
||||
public GamepadInputId ButtonL
|
||||
{
|
||||
get => _buttonL;
|
||||
set
|
||||
{
|
||||
_buttonL = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonMinus;
|
||||
public GamepadInputId ButtonMinus
|
||||
{
|
||||
get => _buttonMinus;
|
||||
set
|
||||
{
|
||||
_buttonMinus = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _leftButtonSl;
|
||||
public GamepadInputId LeftButtonSl
|
||||
{
|
||||
get => _leftButtonSl;
|
||||
set
|
||||
{
|
||||
_leftButtonSl = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _leftButtonSr;
|
||||
public GamepadInputId LeftButtonSr
|
||||
{
|
||||
get => _leftButtonSr;
|
||||
set
|
||||
{
|
||||
_leftButtonSr = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonZl;
|
||||
public GamepadInputId ButtonZl
|
||||
{
|
||||
get => _buttonZl;
|
||||
set
|
||||
{
|
||||
_buttonZl = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonA;
|
||||
public GamepadInputId ButtonA
|
||||
{
|
||||
get => _buttonA;
|
||||
set
|
||||
{
|
||||
_buttonA = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonB;
|
||||
public GamepadInputId ButtonB
|
||||
{
|
||||
get => _buttonB;
|
||||
set
|
||||
{
|
||||
_buttonB = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonX;
|
||||
public GamepadInputId ButtonX
|
||||
{
|
||||
get => _buttonX;
|
||||
set
|
||||
{
|
||||
_buttonX = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonY;
|
||||
public GamepadInputId ButtonY
|
||||
{
|
||||
get => _buttonY;
|
||||
set
|
||||
{
|
||||
_buttonY = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonR;
|
||||
public GamepadInputId ButtonR
|
||||
{
|
||||
get => _buttonR;
|
||||
set
|
||||
{
|
||||
_buttonR = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonPlus;
|
||||
public GamepadInputId ButtonPlus
|
||||
{
|
||||
get => _buttonPlus;
|
||||
set
|
||||
{
|
||||
_buttonPlus = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _rightButtonSl;
|
||||
public GamepadInputId RightButtonSl
|
||||
{
|
||||
get => _rightButtonSl;
|
||||
set
|
||||
{
|
||||
_rightButtonSl = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _rightButtonSr;
|
||||
public GamepadInputId RightButtonSr
|
||||
{
|
||||
get => _rightButtonSr;
|
||||
set
|
||||
{
|
||||
_rightButtonSr = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private GamepadInputId _buttonZr;
|
||||
public GamepadInputId ButtonZr
|
||||
{
|
||||
get => _buttonZr;
|
||||
set
|
||||
{
|
||||
_buttonZr = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private float _deadzoneLeft;
|
||||
public float DeadzoneLeft
|
||||
{
|
||||
get => _deadzoneLeft;
|
||||
set
|
||||
{
|
||||
_deadzoneLeft = MathF.Round(value, 3);
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private float _deadzoneRight;
|
||||
public float DeadzoneRight
|
||||
{
|
||||
get => _deadzoneRight;
|
||||
set
|
||||
{
|
||||
_deadzoneRight = MathF.Round(value, 3);
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private float _rangeLeft;
|
||||
public float RangeLeft
|
||||
{
|
||||
get => _rangeLeft;
|
||||
set
|
||||
{
|
||||
_rangeLeft = MathF.Round(value, 3);
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private float _rangeRight;
|
||||
public float RangeRight
|
||||
{
|
||||
get => _rangeRight;
|
||||
set
|
||||
{
|
||||
_rangeRight = MathF.Round(value, 3);
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private float _triggerThreshold;
|
||||
public float TriggerThreshold
|
||||
{
|
||||
get => _triggerThreshold;
|
||||
set
|
||||
{
|
||||
_triggerThreshold = MathF.Round(value, 3);
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private bool _enableMotion;
|
||||
public bool EnableMotion
|
||||
{
|
||||
get => _enableMotion;
|
||||
set
|
||||
{
|
||||
_enableMotion = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private bool _enableRumble;
|
||||
public bool EnableRumble
|
||||
{
|
||||
get => _enableRumble;
|
||||
set
|
||||
{
|
||||
_enableRumble = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private GamepadInputId _buttonMinus;
|
||||
[ObservableProperty] private GamepadInputId _buttonPlus;
|
||||
|
||||
private bool _enableLedChanging;
|
||||
[ObservableProperty] private GamepadInputId _buttonA;
|
||||
[ObservableProperty] private GamepadInputId _buttonB;
|
||||
[ObservableProperty] private GamepadInputId _buttonX;
|
||||
[ObservableProperty] private GamepadInputId _buttonY;
|
||||
|
||||
[ObservableProperty] private GamepadInputId _buttonZl;
|
||||
[ObservableProperty] private GamepadInputId _buttonZr;
|
||||
|
||||
[ObservableProperty] private GamepadInputId _buttonL;
|
||||
[ObservableProperty] private GamepadInputId _buttonR;
|
||||
|
||||
[ObservableProperty] private GamepadInputId _leftButtonSl;
|
||||
[ObservableProperty] private GamepadInputId _leftButtonSr;
|
||||
|
||||
[ObservableProperty] private GamepadInputId _rightButtonSl;
|
||||
[ObservableProperty] private GamepadInputId _rightButtonSr;
|
||||
|
||||
public bool EnableLedChanging
|
||||
{
|
||||
get => _enableLedChanging;
|
||||
set
|
||||
{
|
||||
_enableLedChanging = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private float _deadzoneLeft;
|
||||
[ObservableProperty] private float _deadzoneRight;
|
||||
|
||||
[ObservableProperty] private float _rangeLeft;
|
||||
[ObservableProperty] private float _rangeRight;
|
||||
|
||||
[ObservableProperty] private float _triggerThreshold;
|
||||
|
||||
[ObservableProperty] private bool _enableMotion;
|
||||
|
||||
[ObservableProperty] private bool _enableRumble;
|
||||
|
||||
[ObservableProperty] private bool _enableLedChanging;
|
||||
|
||||
[ObservableProperty] private Color _ledColor;
|
||||
|
||||
public bool ShowLedColorPicker => !TurnOffLed && !UseRainbowLed;
|
||||
|
||||
@@ -449,18 +105,6 @@ namespace Ryujinx.Ava.UI.Models.Input
|
||||
OnPropertyChanged(nameof(ShowLedColorPicker));
|
||||
}
|
||||
}
|
||||
|
||||
private Color _ledColor;
|
||||
|
||||
public Color LedColor
|
||||
{
|
||||
get => _ledColor;
|
||||
set
|
||||
{
|
||||
_ledColor = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public GamepadInputConfig(InputConfig config)
|
||||
{
|
||||
|
||||
@@ -1,322 +1,52 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Configuration.Hid.Keyboard;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models.Input
|
||||
{
|
||||
public class KeyboardInputConfig : BaseModel
|
||||
public partial class KeyboardInputConfig : BaseModel
|
||||
{
|
||||
public string Id { get; set; }
|
||||
public ControllerType ControllerType { get; set; }
|
||||
public PlayerIndex PlayerIndex { get; set; }
|
||||
|
||||
private Key _leftStickUp;
|
||||
public Key LeftStickUp
|
||||
{
|
||||
get => _leftStickUp;
|
||||
set
|
||||
{
|
||||
_leftStickUp = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private Key _leftStickUp;
|
||||
[ObservableProperty] private Key _leftStickDown;
|
||||
[ObservableProperty] private Key _leftStickLeft;
|
||||
[ObservableProperty] private Key _leftStickRight;
|
||||
[ObservableProperty] private Key _leftStickButton;
|
||||
|
||||
private Key _leftStickDown;
|
||||
public Key LeftStickDown
|
||||
{
|
||||
get => _leftStickDown;
|
||||
set
|
||||
{
|
||||
_leftStickDown = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private Key _rightStickUp;
|
||||
[ObservableProperty] private Key _rightStickDown;
|
||||
[ObservableProperty] private Key _rightStickLeft;
|
||||
[ObservableProperty] private Key _rightStickRight;
|
||||
[ObservableProperty] private Key _rightStickButton;
|
||||
|
||||
private Key _leftStickLeft;
|
||||
public Key LeftStickLeft
|
||||
{
|
||||
get => _leftStickLeft;
|
||||
set
|
||||
{
|
||||
_leftStickLeft = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _leftStickRight;
|
||||
public Key LeftStickRight
|
||||
{
|
||||
get => _leftStickRight;
|
||||
set
|
||||
{
|
||||
_leftStickRight = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _leftStickButton;
|
||||
public Key LeftStickButton
|
||||
{
|
||||
get => _leftStickButton;
|
||||
set
|
||||
{
|
||||
_leftStickButton = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightStickUp;
|
||||
public Key RightStickUp
|
||||
{
|
||||
get => _rightStickUp;
|
||||
set
|
||||
{
|
||||
_rightStickUp = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightStickDown;
|
||||
public Key RightStickDown
|
||||
{
|
||||
get => _rightStickDown;
|
||||
set
|
||||
{
|
||||
_rightStickDown = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightStickLeft;
|
||||
public Key RightStickLeft
|
||||
{
|
||||
get => _rightStickLeft;
|
||||
set
|
||||
{
|
||||
_rightStickLeft = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightStickRight;
|
||||
public Key RightStickRight
|
||||
{
|
||||
get => _rightStickRight;
|
||||
set
|
||||
{
|
||||
_rightStickRight = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightStickButton;
|
||||
public Key RightStickButton
|
||||
{
|
||||
get => _rightStickButton;
|
||||
set
|
||||
{
|
||||
_rightStickButton = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _dpadUp;
|
||||
public Key DpadUp
|
||||
{
|
||||
get => _dpadUp;
|
||||
set
|
||||
{
|
||||
_dpadUp = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _dpadDown;
|
||||
public Key DpadDown
|
||||
{
|
||||
get => _dpadDown;
|
||||
set
|
||||
{
|
||||
_dpadDown = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _dpadLeft;
|
||||
public Key DpadLeft
|
||||
{
|
||||
get => _dpadLeft;
|
||||
set
|
||||
{
|
||||
_dpadLeft = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _dpadRight;
|
||||
public Key DpadRight
|
||||
{
|
||||
get => _dpadRight;
|
||||
set
|
||||
{
|
||||
_dpadRight = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonL;
|
||||
public Key ButtonL
|
||||
{
|
||||
get => _buttonL;
|
||||
set
|
||||
{
|
||||
_buttonL = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonMinus;
|
||||
public Key ButtonMinus
|
||||
{
|
||||
get => _buttonMinus;
|
||||
set
|
||||
{
|
||||
_buttonMinus = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _leftButtonSl;
|
||||
public Key LeftButtonSl
|
||||
{
|
||||
get => _leftButtonSl;
|
||||
set
|
||||
{
|
||||
_leftButtonSl = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _leftButtonSr;
|
||||
public Key LeftButtonSr
|
||||
{
|
||||
get => _leftButtonSr;
|
||||
set
|
||||
{
|
||||
_leftButtonSr = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonZl;
|
||||
public Key ButtonZl
|
||||
{
|
||||
get => _buttonZl;
|
||||
set
|
||||
{
|
||||
_buttonZl = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonA;
|
||||
public Key ButtonA
|
||||
{
|
||||
get => _buttonA;
|
||||
set
|
||||
{
|
||||
_buttonA = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonB;
|
||||
public Key ButtonB
|
||||
{
|
||||
get => _buttonB;
|
||||
set
|
||||
{
|
||||
_buttonB = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonX;
|
||||
public Key ButtonX
|
||||
{
|
||||
get => _buttonX;
|
||||
set
|
||||
{
|
||||
_buttonX = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonY;
|
||||
public Key ButtonY
|
||||
{
|
||||
get => _buttonY;
|
||||
set
|
||||
{
|
||||
_buttonY = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonR;
|
||||
public Key ButtonR
|
||||
{
|
||||
get => _buttonR;
|
||||
set
|
||||
{
|
||||
_buttonR = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonPlus;
|
||||
public Key ButtonPlus
|
||||
{
|
||||
get => _buttonPlus;
|
||||
set
|
||||
{
|
||||
_buttonPlus = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightButtonSl;
|
||||
public Key RightButtonSl
|
||||
{
|
||||
get => _rightButtonSl;
|
||||
set
|
||||
{
|
||||
_rightButtonSl = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _rightButtonSr;
|
||||
public Key RightButtonSr
|
||||
{
|
||||
get => _rightButtonSr;
|
||||
set
|
||||
{
|
||||
_rightButtonSr = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private Key _buttonZr;
|
||||
public Key ButtonZr
|
||||
{
|
||||
get => _buttonZr;
|
||||
set
|
||||
{
|
||||
_buttonZr = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private Key _dpadUp;
|
||||
[ObservableProperty] private Key _dpadDown;
|
||||
[ObservableProperty] private Key _dpadLeft;
|
||||
[ObservableProperty] private Key _dpadRight;
|
||||
|
||||
[ObservableProperty] private Key _buttonMinus;
|
||||
[ObservableProperty] private Key _buttonPlus;
|
||||
|
||||
[ObservableProperty] private Key _buttonA;
|
||||
[ObservableProperty] private Key _buttonB;
|
||||
[ObservableProperty] private Key _buttonX;
|
||||
[ObservableProperty] private Key _buttonY;
|
||||
|
||||
[ObservableProperty] private Key _buttonL;
|
||||
[ObservableProperty] private Key _buttonR;
|
||||
|
||||
[ObservableProperty] private Key _buttonZl;
|
||||
[ObservableProperty] private Key _buttonZr;
|
||||
|
||||
[ObservableProperty] private Key _leftButtonSl;
|
||||
[ObservableProperty] private Key _leftButtonSr;
|
||||
|
||||
[ObservableProperty] private Key _rightButtonSl;
|
||||
[ObservableProperty] private Key _rightButtonSr;
|
||||
|
||||
public KeyboardInputConfig(InputConfig config)
|
||||
{
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using System.IO;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models
|
||||
{
|
||||
public class ModModel : BaseModel
|
||||
public partial class ModModel : BaseModel
|
||||
{
|
||||
private bool _enabled;
|
||||
|
||||
public bool Enabled
|
||||
{
|
||||
get => _enabled;
|
||||
set
|
||||
{
|
||||
_enabled = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private bool _enabled;
|
||||
|
||||
public bool InSd { get; }
|
||||
public string Path { get; }
|
||||
public string Name { get; }
|
||||
|
||||
public string FormattedName =>
|
||||
InSd && ulong.TryParse(Name, NumberStyles.HexNumber, null, out ulong applicationId)
|
||||
? $"Atmosphère: {RyujinxApp.MainWindow.ApplicationLibrary.GetNameForApplicationId(applicationId)}"
|
||||
: Name;
|
||||
|
||||
public ModModel(string path, string name, bool enabled, bool inSd)
|
||||
{
|
||||
Path = path;
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
using Avalonia.Media;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models
|
||||
{
|
||||
public class ProfileImageModel : BaseModel
|
||||
public partial class ProfileImageModel : BaseModel
|
||||
{
|
||||
public ProfileImageModel(string name, byte[] data)
|
||||
{
|
||||
@@ -14,19 +15,6 @@ namespace Ryujinx.Ava.UI.Models
|
||||
public string Name { get; set; }
|
||||
public byte[] Data { get; set; }
|
||||
|
||||
private SolidColorBrush _backgroundColor = new(Colors.White);
|
||||
|
||||
public SolidColorBrush BackgroundColor
|
||||
{
|
||||
get
|
||||
{
|
||||
return _backgroundColor;
|
||||
}
|
||||
set
|
||||
{
|
||||
_backgroundColor = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private SolidColorBrush _backgroundColor = new(Colors.White);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,9 @@ using Gommon;
|
||||
using LibHac.Fs;
|
||||
using LibHac.Ncm;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.UI.Windows;
|
||||
using Ryujinx.Ava.Utilities;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -1,28 +1,18 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||
using System;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models
|
||||
{
|
||||
public class TempProfile : BaseModel
|
||||
public partial class TempProfile : BaseModel
|
||||
{
|
||||
private readonly UserProfile _profile;
|
||||
private byte[] _image;
|
||||
private string _name = String.Empty;
|
||||
[ObservableProperty] private byte[] _image;
|
||||
[ObservableProperty] private string _name = String.Empty;
|
||||
private UserId _userId;
|
||||
|
||||
public static uint MaxProfileNameLength => 0x20;
|
||||
|
||||
public byte[] Image
|
||||
{
|
||||
get => _image;
|
||||
set
|
||||
{
|
||||
_image = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public UserId UserId
|
||||
{
|
||||
get => _userId;
|
||||
@@ -36,21 +26,9 @@ namespace Ryujinx.Ava.UI.Models
|
||||
|
||||
public string UserIdString => _userId.ToString();
|
||||
|
||||
public string Name
|
||||
{
|
||||
get => _name;
|
||||
set
|
||||
{
|
||||
_name = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public TempProfile(UserProfile profile)
|
||||
{
|
||||
_profile = profile;
|
||||
|
||||
if (_profile != null)
|
||||
if (profile != null)
|
||||
{
|
||||
Image = profile.Image;
|
||||
Name = profile.Name;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Media;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Ryujinx.Ava.UI.Controls;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.UI.Views.User;
|
||||
@@ -8,65 +9,15 @@ using Profile = Ryujinx.HLE.HOS.Services.Account.Acc.UserProfile;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Models
|
||||
{
|
||||
public class UserProfile : BaseModel
|
||||
public partial class UserProfile : BaseModel
|
||||
{
|
||||
private readonly Profile _profile;
|
||||
private readonly NavigationDialogHost _owner;
|
||||
private byte[] _image;
|
||||
private string _name;
|
||||
private UserId _userId;
|
||||
private bool _isPointerOver;
|
||||
private IBrush _backgroundColor;
|
||||
|
||||
public byte[] Image
|
||||
{
|
||||
get => _image;
|
||||
set
|
||||
{
|
||||
_image = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public UserId UserId
|
||||
{
|
||||
get => _userId;
|
||||
set
|
||||
{
|
||||
_userId = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get => _name;
|
||||
set
|
||||
{
|
||||
_name = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsPointerOver
|
||||
{
|
||||
get => _isPointerOver;
|
||||
set
|
||||
{
|
||||
_isPointerOver = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public IBrush BackgroundColor
|
||||
{
|
||||
get => _backgroundColor;
|
||||
set
|
||||
{
|
||||
_backgroundColor = value;
|
||||
OnPropertyChanged();
|
||||
}
|
||||
}
|
||||
[ObservableProperty] private byte[] _image;
|
||||
[ObservableProperty] private string _name;
|
||||
[ObservableProperty] private UserId _userId;
|
||||
[ObservableProperty] private bool _isPointerOver;
|
||||
[ObservableProperty] private IBrush _backgroundColor;
|
||||
|
||||
public UserProfile(Profile profile, NavigationDialogHost owner)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Platform;
|
||||
using Ryujinx.Ava.Utilities.Configuration;
|
||||
using Ryujinx.Common.Configuration;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Avalonia.Collections;
|
||||
using Avalonia.Controls.ApplicationLifetimes;
|
||||
using Avalonia.Platform.Storage;
|
||||
using Avalonia.Threading;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
@@ -9,13 +8,11 @@ using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.Common.Models;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Application = Avalonia.Application;
|
||||
|
||||
namespace Ryujinx.Ava.UI.ViewModels
|
||||
{
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
using Avalonia.Svg.Skia;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.Models.Input;
|
||||
using Ryujinx.Ava.UI.Views.Input;
|
||||
using Ryujinx.Common.Utilities;
|
||||
using Ryujinx.UI.Views.Input;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
{
|
||||
@@ -48,6 +47,23 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
ParentModel = model;
|
||||
model.NotifyChangesEvent += OnParentModelChanged;
|
||||
OnParentModelChanged();
|
||||
config.PropertyChanged += (_, args) =>
|
||||
{
|
||||
if (args.PropertyName is nameof(Config.UseRainbowLed))
|
||||
{
|
||||
if (Config is { UseRainbowLed: true, TurnOffLed: false, EnableLedChanging: true })
|
||||
Rainbow.Updated += (ref Color color) => ParentModel.SelectedGamepad.SetLed((uint)color.ToArgb());
|
||||
else
|
||||
{
|
||||
Rainbow.Reset();
|
||||
|
||||
if (Config.TurnOffLed)
|
||||
ParentModel.SelectedGamepad.ClearLed();
|
||||
else
|
||||
ParentModel.SelectedGamepad.SetLed(Config.LedColor.ToUInt32());
|
||||
}
|
||||
}
|
||||
};
|
||||
Config = config;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ using Ryujinx.Input;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
@@ -63,7 +64,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
get => _selectedGamepad;
|
||||
private set
|
||||
{
|
||||
Rainbow.Reset();
|
||||
|
||||
_selectedGamepad = value;
|
||||
|
||||
if (ConfigViewModel is ControllerInputViewModel { Config.UseRainbowLed: true })
|
||||
Rainbow.Updated += (ref Color color) => _selectedGamepad.SetLed((uint)color.ToArgb());
|
||||
|
||||
OnPropertiesChanged(nameof(HasLed), nameof(CanClearLed));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
using Avalonia.Media;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Humanizer;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.Utilities.Configuration;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
{
|
||||
@@ -21,6 +24,19 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
||||
|
||||
[ObservableProperty] private bool _enableLedChanging;
|
||||
[ObservableProperty] private Color _ledColor;
|
||||
|
||||
public string RainbowSpeedText => RainbowSpeed.ToString(CultureInfo.CurrentCulture).Truncate(4, string.Empty);
|
||||
|
||||
public float RainbowSpeed
|
||||
{
|
||||
get => ConfigurationState.Instance.Hid.RainbowSpeed;
|
||||
set
|
||||
{
|
||||
ConfigurationState.Instance.Hid.RainbowSpeed.Value = value;
|
||||
OnPropertyChanged();
|
||||
OnPropertyChanged(nameof(RainbowSpeedText));
|
||||
}
|
||||
}
|
||||
|
||||
public bool ShowLedColorPicker => !TurnOffLed && !UseRainbowLed;
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ using Gommon;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.Models;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Common.Utilities;
|
||||
@@ -29,6 +30,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
|
||||
private string _search;
|
||||
private readonly ulong _applicationId;
|
||||
private readonly ulong[] _installedDlcIds;
|
||||
private readonly IStorageProvider _storageProvider;
|
||||
|
||||
private static readonly ModMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||
@@ -61,18 +63,23 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
get => string.Format(LocaleManager.Instance[LocaleKeys.ModWindowHeading], Mods.Count);
|
||||
}
|
||||
|
||||
public ModManagerViewModel(ulong applicationId)
|
||||
public ModManagerViewModel(ulong applicationId, ulong applicationIdBase, ApplicationLibrary appLibrary)
|
||||
{
|
||||
_applicationId = applicationId;
|
||||
|
||||
_installedDlcIds = appLibrary.DownloadableContents.Keys
|
||||
.Where(x => x.TitleIdBase == applicationIdBase)
|
||||
.Select(x => x.TitleId)
|
||||
.ToArray();
|
||||
|
||||
_modJsonPath = Path.Combine(AppDataManager.GamesDirPath, applicationId.ToString("x16"), "mods.json");
|
||||
|
||||
_storageProvider = RyujinxApp.MainWindow.StorageProvider;
|
||||
|
||||
LoadMods(applicationId);
|
||||
LoadMods(applicationId, _installedDlcIds);
|
||||
}
|
||||
|
||||
private void LoadMods(ulong applicationId)
|
||||
private void LoadMods(ulong applicationId, ulong[] installedDlcIds)
|
||||
{
|
||||
Mods.Clear();
|
||||
SelectedMods.Clear();
|
||||
@@ -84,7 +91,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
bool inSd = path == ModLoader.GetSdModsBasePath();
|
||||
ModLoader.ModCache modCache = new();
|
||||
|
||||
ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId);
|
||||
ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId, _installedDlcIds);
|
||||
|
||||
foreach (ModLoader.Mod<DirectoryInfo> mod in modCache.RomfsDirs)
|
||||
{
|
||||
@@ -278,7 +285,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
||||
File.Copy(file, file.Replace(directory.Parent.ToString(), destinationDir), true);
|
||||
}
|
||||
|
||||
LoadMods(_applicationId);
|
||||
LoadMods(_applicationId, _installedDlcIds);
|
||||
}
|
||||
|
||||
public async void Add()
|
||||
|
||||
@@ -4,7 +4,6 @@ using Avalonia.Controls.Primitives;
|
||||
using Avalonia.Input;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.LogicalTree;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||
using Ryujinx.Common.Configuration.Hid.Controller;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
x:Class="Ryujinx.UI.Views.Input.LedInputView">
|
||||
<StackPanel Orientation="Vertical" HorizontalAlignment="Center">
|
||||
<StackPanel Orientation="Horizontal" IsVisible="{Binding ParentModel.CanClearLed}">
|
||||
<TextBlock MinWidth="75" MaxWidth="150" Text="{ext:Locale ControllerSettingsLedColorDisable}" />
|
||||
<TextBlock MinWidth="75" MaxWidth="200" Text="{ext:Locale ControllerSettingsLedColorDisable}" />
|
||||
<CheckBox
|
||||
Margin="5"
|
||||
MinWidth="0"
|
||||
@@ -20,15 +20,33 @@
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" IsEnabled="{Binding !TurnOffLed}">
|
||||
<TextBlock MinWidth="75" MaxWidth="150" Text="{ext:Locale ControllerSettingsLedColorRainbow}" />
|
||||
<TextBlock MinWidth="75" MaxWidth="200" Text="{ext:Locale ControllerSettingsLedColorRainbow}" />
|
||||
<CheckBox
|
||||
Margin="5"
|
||||
MinWidth="0"
|
||||
IsChecked="{Binding UseRainbowLed, Mode=TwoWay}">
|
||||
</CheckBox>
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" IsEnabled="{Binding !TurnOffLed}">
|
||||
<TextBlock MinWidth="75" MaxWidth="200" Text="{ext:Locale ControllerSettingsLedColorRainbowSpeed}" />
|
||||
<Slider HorizontalAlignment="Center"
|
||||
Value="{Binding RainbowSpeed}"
|
||||
Width="175"
|
||||
Margin="0,-3,0,0"
|
||||
Height="32"
|
||||
Padding="0,-5"
|
||||
TickFrequency="0.25"
|
||||
LargeChange="1"
|
||||
SmallChange="0.25"
|
||||
VerticalAlignment="Center"
|
||||
Minimum="1"
|
||||
Maximum="10" />
|
||||
<TextBlock Margin="5,0"
|
||||
MinWidth="75"
|
||||
Text="{Binding RainbowSpeedText}" />
|
||||
</StackPanel>
|
||||
<StackPanel Orientation="Horizontal" IsEnabled="{Binding ShowLedColorPicker}">
|
||||
<TextBlock MinWidth="75" MaxWidth="150" Text="{ext:Locale ControllerSettingsLedColor}" />
|
||||
<TextBlock MinWidth="75" MaxWidth="200" Text="{ext:Locale ControllerSettingsLedColor}" />
|
||||
<ui:ColorPickerButton
|
||||
Margin="5"
|
||||
IsMoreButtonVisible="False"
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Markup.Xaml;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Models.Input;
|
||||
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||
using Ryujinx.Ava.UI.Views.Input;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ryujinx.UI.Views.Input
|
||||
|
||||
@@ -2,7 +2,6 @@ using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Layout;
|
||||
using Avalonia.Threading;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using Gommon;
|
||||
using LibHac.Common;
|
||||
using LibHac.Ns;
|
||||
@@ -134,7 +133,12 @@ namespace Ryujinx.Ava.UI.Views.Main
|
||||
{
|
||||
Window.SettingsWindow = new(Window.VirtualFileSystem, Window.ContentManager);
|
||||
|
||||
Rainbow.Enable();
|
||||
|
||||
await Window.SettingsWindow.ShowDialog(Window);
|
||||
|
||||
Rainbow.Disable();
|
||||
Rainbow.Reset();
|
||||
|
||||
Window.SettingsWindow = null;
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
@@ -2,7 +2,6 @@ using Avalonia.Collections;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Platform.Storage;
|
||||
using Avalonia.VisualTree;
|
||||
using Gommon;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
|
||||
ModLoader.ModCache mods = new();
|
||||
|
||||
ModLoader.QueryContentsDir(mods, new DirectoryInfo(Path.Combine(modsBasePath, "contents")), titleIdValue);
|
||||
ModLoader.QueryContentsDir(mods, new DirectoryInfo(Path.Combine(modsBasePath, "contents")), titleIdValue, []);
|
||||
|
||||
string currentCheatFile = string.Empty;
|
||||
string buildId = string.Empty;
|
||||
|
||||
@@ -2,8 +2,6 @@ using Avalonia.Controls;
|
||||
using Avalonia.Interactivity;
|
||||
using Avalonia.Styling;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using LibHac.Tools.FsSystem.NcaUtils;
|
||||
using Ryujinx.Ava.Common;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.Common.Models;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
|
||||
@@ -33,7 +33,6 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reactive.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Runtime.Versioning;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -303,7 +302,7 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
LinuxHelper.RecommendedVmMaxMapCount);
|
||||
|
||||
UserResult response = await ContentDialogHelper.ShowTextDialog(
|
||||
$"Ryujinx - {LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogTitle]}",
|
||||
RyujinxApp.FormatTitle(LocaleKeys.LinuxVmMaxMapCountDialogTitle, false),
|
||||
LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogTextPrimary],
|
||||
LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogTextSecondary],
|
||||
LocaleManager.Instance[LocaleKeys.LinuxVmMaxMapCountDialogButtonUntilRestart],
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
MaxLines="2"
|
||||
TextWrapping="Wrap"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
Text="{Binding Name}" />
|
||||
Text="{Binding FormattedName}" />
|
||||
<StackPanel
|
||||
Grid.Column="1"
|
||||
Spacing="10"
|
||||
|
||||
@@ -6,6 +6,7 @@ using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.Models;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using Ryujinx.Common.Helper;
|
||||
using System.Threading.Tasks;
|
||||
using Button = Avalonia.Controls.Button;
|
||||
@@ -23,21 +24,21 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public ModManagerWindow(ulong titleId)
|
||||
public ModManagerWindow(ulong titleId, ulong titleIdBase, ApplicationLibrary applicationLibrary)
|
||||
{
|
||||
DataContext = ViewModel = new ModManagerViewModel(titleId);
|
||||
DataContext = ViewModel = new ModManagerViewModel(titleId, titleIdBase, applicationLibrary);
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public static async Task Show(ulong titleId, string titleName)
|
||||
public static async Task Show(ulong titleId, ulong titleIdBase, ApplicationLibrary appLibrary, string titleName)
|
||||
{
|
||||
ContentDialog contentDialog = new()
|
||||
{
|
||||
PrimaryButtonText = string.Empty,
|
||||
SecondaryButtonText = string.Empty,
|
||||
CloseButtonText = string.Empty,
|
||||
Content = new ModManagerWindow(titleId),
|
||||
Content = new ModManagerWindow(titleId, titleIdBase, appLibrary),
|
||||
Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowTitle], titleName, titleId.ToString("X16")),
|
||||
};
|
||||
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
using Avalonia;
|
||||
using Avalonia.Controls;
|
||||
using Avalonia.Input;
|
||||
using FluentAvalonia.Core;
|
||||
using FluentAvalonia.UI.Controls;
|
||||
using Ryujinx.Ava.Common.Locale;
|
||||
using Ryujinx.Ava.UI.Models;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||
using Ryujinx.HLE.FileSystem;
|
||||
using Ryujinx.Input;
|
||||
using System;
|
||||
@@ -34,7 +31,6 @@ namespace Ryujinx.Ava.UI.Windows
|
||||
#if DEBUG
|
||||
this.AttachDevTools(new KeyGesture(Key.F12, KeyModifiers.Alt));
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
public SettingsWindow()
|
||||
|
||||
@@ -111,6 +111,30 @@ namespace Ryujinx.Ava.Utilities.AppLibrary
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a name for an available content file based on the Application ID '<paramref name="id"/>'.
|
||||
/// <br/><br/>
|
||||
/// For Applications, this returns the localized name of the app found in the file.
|
||||
/// For DLCs, this returns the name of the file that contains the DLC, minus the file extension.
|
||||
/// </summary>
|
||||
/// <param name="id">The Application ID to search for.</param>
|
||||
/// <remarks>
|
||||
/// If the provided Application ID does not have a corresponding Application OR DLC file,
|
||||
/// <paramref name="id"/> formatted as hexadecimal is returned.
|
||||
/// </remarks>
|
||||
/// <returns>A formatted Application name, or <paramref name="id"/> as hexadecimal if none is found.</returns>
|
||||
public string GetNameForApplicationId(ulong id)
|
||||
{
|
||||
DynamicData.Kernel.Optional<ApplicationData> appData = Applications.Lookup(id);
|
||||
if (appData.HasValue)
|
||||
return appData.Value.Name;
|
||||
|
||||
if (DownloadableContents.Keys.FindFirst(x => x.TitleId == id).TryGet(out DownloadableContentModel dlcData))
|
||||
return Path.GetFileNameWithoutExtension(dlcData.FileName);
|
||||
|
||||
return id.ToString("X16");
|
||||
}
|
||||
|
||||
/// <exception cref="LibHac.Common.Keys.MissingKeyException">The configured key set is missing a key.</exception>
|
||||
/// <exception cref="InvalidDataException">The NCA header could not be decrypted.</exception>
|
||||
/// <exception cref="NotSupportedException">The NCA version is not supported.</exception>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using Gommon;
|
||||
using Gommon;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.Ava.Utilities.AppLibrary;
|
||||
using System.Collections.Generic;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using Ryujinx.Ava.Utilities.Configuration.System;
|
||||
using Ryujinx.Ava.Utilities.Configuration.UI;
|
||||
using Ryujinx.Common;
|
||||
using Ryujinx.Common.Configuration;
|
||||
using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Configuration.Multiplayer;
|
||||
@@ -8,7 +7,6 @@ using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Common.Utilities;
|
||||
using Ryujinx.HLE;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Nodes;
|
||||
|
||||
namespace Ryujinx.Ava.Utilities.Configuration
|
||||
{
|
||||
@@ -17,7 +15,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
/// <summary>
|
||||
/// The current version of the file format
|
||||
/// </summary>
|
||||
public const int CurrentVersion = 61;
|
||||
public const int CurrentVersion = 62;
|
||||
|
||||
/// <summary>
|
||||
/// Version of the configuration file format
|
||||
@@ -376,24 +374,15 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
/// </summary>
|
||||
public KeyboardHotkeys Hotkeys { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Legacy keyboard control bindings
|
||||
/// </summary>
|
||||
/// <remarks>Kept for file format compatibility (to avoid possible failure when parsing configuration on old versions)</remarks>
|
||||
/// TODO: Remove this when those older versions aren't in use anymore.
|
||||
public List<JsonObject> KeyboardConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Legacy controller control bindings
|
||||
/// </summary>
|
||||
/// <remarks>Kept for file format compatibility (to avoid possible failure when parsing configuration on old versions)</remarks>
|
||||
/// TODO: Remove this when those older versions aren't in use anymore.
|
||||
public List<JsonObject> ControllerConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Input configurations
|
||||
/// </summary>
|
||||
public List<InputConfig> InputConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The speed of spectrum cycling for the Rainbow LED feature.
|
||||
/// </summary>
|
||||
public float RainbowSpeed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Graphics backend
|
||||
|
||||
@@ -140,6 +140,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
Hid.EnableMouse.Value = cff.EnableMouse;
|
||||
Hid.Hotkeys.Value = cff.Hotkeys;
|
||||
Hid.InputConfig.Value = cff.InputConfig ?? [];
|
||||
Hid.RainbowSpeed.Value = cff.RainbowSpeed;
|
||||
|
||||
Multiplayer.LanInterfaceId.Value = cff.MultiplayerLanInterfaceId;
|
||||
Multiplayer.Mode.Value = cff.MultiplayerMode;
|
||||
@@ -427,7 +428,8 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
LedColor = new Color(255, 5, 1, 253).ToUInt32()
|
||||
};
|
||||
}
|
||||
})
|
||||
}),
|
||||
(62, static cff => cff.RainbowSpeed = 1f)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ using Ryujinx.Common.Configuration.Hid;
|
||||
using Ryujinx.Common.Configuration.Multiplayer;
|
||||
using Ryujinx.Common.Helper;
|
||||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Common.Utilities;
|
||||
using Ryujinx.HLE;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@@ -444,6 +445,11 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
/// TODO: Implement a ReactiveList class.
|
||||
/// </summary>
|
||||
public ReactiveObject<List<InputConfig>> InputConfig { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The speed of spectrum cycling for the Rainbow LED feature.
|
||||
/// </summary>
|
||||
public ReactiveObject<float> RainbowSpeed { get; }
|
||||
|
||||
public HidSection()
|
||||
{
|
||||
@@ -451,6 +457,8 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
EnableMouse = new ReactiveObject<bool>();
|
||||
Hotkeys = new ReactiveObject<KeyboardHotkeys>();
|
||||
InputConfig = new ReactiveObject<List<InputConfig>>();
|
||||
RainbowSpeed = new ReactiveObject<float>();
|
||||
RainbowSpeed.Event += (_, args) => Rainbow.Speed = args.NewValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -130,9 +130,8 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
EnableKeyboard = Hid.EnableKeyboard,
|
||||
EnableMouse = Hid.EnableMouse,
|
||||
Hotkeys = Hid.Hotkeys,
|
||||
KeyboardConfig = [],
|
||||
ControllerConfig = [],
|
||||
InputConfig = Hid.InputConfig,
|
||||
RainbowSpeed = Hid.RainbowSpeed,
|
||||
GraphicsBackend = Graphics.GraphicsBackend,
|
||||
PreferredGpu = Graphics.PreferredGpu,
|
||||
MultiplayerLanInterfaceId = Multiplayer.LanInterfaceId,
|
||||
@@ -255,6 +254,7 @@ namespace Ryujinx.Ava.Utilities.Configuration
|
||||
VolumeUp = Key.Unbound,
|
||||
VolumeDown = Key.Unbound,
|
||||
};
|
||||
Hid.RainbowSpeed.Value = 1f;
|
||||
Hid.InputConfig.Value =
|
||||
[
|
||||
new StandardKeyboardInputConfig
|
||||
|
||||
@@ -24,9 +24,9 @@ namespace Ryujinx.Ava.Utilities.SystemInfo
|
||||
|
||||
public void Print()
|
||||
{
|
||||
Logger.Notice.Print(LogClass.Application, $"Operating System: {OsDescription}");
|
||||
Logger.Notice.Print(LogClass.Application, $"CPU: {CpuName}");
|
||||
Logger.Notice.Print(LogClass.Application, $"RAM: Total {ToGBString(RamTotal)} ; Available {ToGBString(RamAvailable)}");
|
||||
Logger.Notice.Print(LogClass.Application, $"Operating System: {OsDescription}", "PrintSystemInfo");
|
||||
Logger.Notice.Print(LogClass.Application, $"CPU: {CpuName}", "PrintSystemInfo");
|
||||
Logger.Notice.Print(LogClass.Application, $"RAM: Total {ToGBString(RamTotal)} ; Available {ToGBString(RamAvailable)}", "PrintSystemInfo");
|
||||
}
|
||||
|
||||
public static SystemInfo Gather()
|
||||
|
||||
Reference in New Issue
Block a user