Compare commits
21 Commits
Canary-1.2
...
3fe8b39c53
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3fe8b39c53 | ||
|
|
7a43dcb513 | ||
|
|
f2329d0e8a | ||
|
|
3aa7ed661d | ||
|
|
6e824e44b8 | ||
|
|
a964bf8f68 | ||
|
|
89e4d287d6 | ||
|
|
f34745a66c | ||
|
|
d5b7851c9b | ||
|
|
1b7032b589 | ||
|
|
e097ea71ff | ||
|
|
299f2144c8 | ||
|
|
33e3ba9ff2 | ||
|
|
9dc36646c1 | ||
|
|
8eea75a6e8 | ||
|
|
57fbcc7aed | ||
|
|
d1c15f3562 | ||
|
|
0423fad7ff | ||
|
|
1951fe0077 | ||
|
|
7fd5a63a5d | ||
|
|
a0594e8169 |
@@ -9,8 +9,7 @@ namespace Ryujinx.Common.Configuration
|
|||||||
public enum DirtyHack : byte
|
public enum DirtyHack : byte
|
||||||
{
|
{
|
||||||
Xc2MenuSoftlockFix = 1,
|
Xc2MenuSoftlockFix = 1,
|
||||||
// ShaderTranslationDelay = 2
|
ShaderTranslationDelay = 2
|
||||||
NifmServiceDisableIsAnyInternetRequestAccepted = 3
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly struct EnabledDirtyHack(DirtyHack hack, int value)
|
public readonly struct EnabledDirtyHack(DirtyHack hack, int value)
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using Gommon;
|
using Gommon;
|
||||||
|
using Ryujinx.Common.Configuration;
|
||||||
|
using Ryujinx.Common.Helper;
|
||||||
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Ryujinx.Common
|
namespace Ryujinx.Common
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm
|
|||||||
// CreateGeneralServiceOld() -> object<nn::nifm::detail::IGeneralService>
|
// CreateGeneralServiceOld() -> object<nn::nifm::detail::IGeneralService>
|
||||||
public ResultCode CreateGeneralServiceOld(ServiceCtx context)
|
public ResultCode CreateGeneralServiceOld(ServiceCtx context)
|
||||||
{
|
{
|
||||||
MakeObject(context, new IGeneralService(context));
|
MakeObject(context, new IGeneralService());
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,7 @@ namespace Ryujinx.HLE.HOS.Services.Nifm
|
|||||||
// CreateGeneralService(u64, pid) -> object<nn::nifm::detail::IGeneralService>
|
// CreateGeneralService(u64, pid) -> object<nn::nifm::detail::IGeneralService>
|
||||||
public ResultCode CreateGeneralService(ServiceCtx context)
|
public ResultCode CreateGeneralService(ServiceCtx context)
|
||||||
{
|
{
|
||||||
MakeObject(context, new IGeneralService(context));
|
MakeObject(context, new IGeneralService());
|
||||||
|
|
||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Configuration;
|
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService;
|
using Ryujinx.HLE.HOS.Services.Nifm.StaticService.GeneralService;
|
||||||
@@ -18,12 +17,12 @@ namespace Ryujinx.HLE.HOS.Services.Nifm.StaticService
|
|||||||
private UnicastIPAddressInformation _targetAddressInfoCache = null;
|
private UnicastIPAddressInformation _targetAddressInfoCache = null;
|
||||||
private string _cacheChosenInterface = null;
|
private string _cacheChosenInterface = null;
|
||||||
|
|
||||||
public IGeneralService(ServiceCtx context)
|
public IGeneralService()
|
||||||
{
|
{
|
||||||
_generalServiceDetail = new GeneralServiceDetail
|
_generalServiceDetail = new GeneralServiceDetail
|
||||||
{
|
{
|
||||||
ClientId = GeneralServiceManager.Count,
|
ClientId = GeneralServiceManager.Count,
|
||||||
IsAnyInternetRequestAccepted = !context.Device.DirtyHacks.IsEnabled(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted), // NOTE: Why not accept any internet request?
|
IsAnyInternetRequestAccepted = true, // NOTE: Why not accept any internet request?
|
||||||
};
|
};
|
||||||
|
|
||||||
NetworkChange.NetworkAddressChanged += LocalInterfaceCacheHandler;
|
NetworkChange.NetworkAddressChanged += LocalInterfaceCacheHandler;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy;
|
using Ryujinx.HLE.HOS.Services.Ldn.UserServiceCreator.LdnRyu.Proxy;
|
||||||
|
using Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Avalonia.Threading;
|
|||||||
using DiscordRPC;
|
using DiscordRPC;
|
||||||
using LibHac.Common;
|
using LibHac.Common;
|
||||||
using LibHac.Ns;
|
using LibHac.Ns;
|
||||||
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Audio.Backends.Dummy;
|
using Ryujinx.Audio.Backends.Dummy;
|
||||||
using Ryujinx.Audio.Backends.OpenAL;
|
using Ryujinx.Audio.Backends.OpenAL;
|
||||||
using Ryujinx.Audio.Backends.SDL2;
|
using Ryujinx.Audio.Backends.SDL2;
|
||||||
@@ -34,9 +35,11 @@ using Ryujinx.Graphics.GAL.Multithreading;
|
|||||||
using Ryujinx.Graphics.Gpu;
|
using Ryujinx.Graphics.Gpu;
|
||||||
using Ryujinx.Graphics.OpenGL;
|
using Ryujinx.Graphics.OpenGL;
|
||||||
using Ryujinx.Graphics.Vulkan;
|
using Ryujinx.Graphics.Vulkan;
|
||||||
|
using Ryujinx.HLE;
|
||||||
using Ryujinx.HLE.FileSystem;
|
using Ryujinx.HLE.FileSystem;
|
||||||
using Ryujinx.HLE.HOS;
|
using Ryujinx.HLE.HOS;
|
||||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||||
|
using Ryujinx.HLE.HOS.SystemState;
|
||||||
using Ryujinx.Input;
|
using Ryujinx.Input;
|
||||||
using Ryujinx.Input.HLE;
|
using Ryujinx.Input.HLE;
|
||||||
using SkiaSharp;
|
using SkiaSharp;
|
||||||
@@ -59,7 +62,7 @@ using Size = Avalonia.Size;
|
|||||||
using Switch = Ryujinx.HLE.Switch;
|
using Switch = Ryujinx.HLE.Switch;
|
||||||
using VSyncMode = Ryujinx.Common.Configuration.VSyncMode;
|
using VSyncMode = Ryujinx.Common.Configuration.VSyncMode;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems
|
namespace Ryujinx.Ava
|
||||||
{
|
{
|
||||||
internal class AppHost
|
internal class AppHost
|
||||||
{
|
{
|
||||||
@@ -49,7 +49,6 @@
|
|||||||
<TextBlock
|
<TextBlock
|
||||||
Classes="globalConfigMarker"/>
|
Classes="globalConfigMarker"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
</Border>
|
</Border>
|
||||||
</Design.PreviewWith>
|
</Design.PreviewWith>
|
||||||
<Style Selector="DropDownButton">
|
<Style Selector="DropDownButton">
|
||||||
|
|||||||
@@ -2767,7 +2767,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Створити користувацьку конфігурацію",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -2792,7 +2792,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Редагувати користувацьку конфігурацію",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -2842,7 +2842,7 @@
|
|||||||
"sv_SE": "Skapar en oberoende konfiguration för det aktuella spelet",
|
"sv_SE": "Skapar en oberoende konfiguration för det aktuella spelet",
|
||||||
"th_TH": "สร้างการกำหนดค่าที่เป็นอิสระสำหรับเกมปัจจุบัน",
|
"th_TH": "สร้างการกำหนดค่าที่เป็นอิสระสำหรับเกมปัจจุบัน",
|
||||||
"tr_TR": "Mevcut oyun için bağımsız bir yapılandırma oluşturur",
|
"tr_TR": "Mevcut oyun için bağımsız bir yapılandırma oluşturur",
|
||||||
"uk_UA": "Створюйте незалежну конфігурацію для поточної гри",
|
"uk_UA": "Створює незалежну конфігурацію для поточної гри",
|
||||||
"zh_CN": "为当前游戏创建独立的配置",
|
"zh_CN": "为当前游戏创建独立的配置",
|
||||||
"zh_TW": "為當前遊戲創建獨立的配置"
|
"zh_TW": "為當前遊戲創建獨立的配置"
|
||||||
}
|
}
|
||||||
@@ -2867,7 +2867,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Відредагувати наявну індивідуальну конфігурацію для цієї гри.",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -3442,7 +3442,7 @@
|
|||||||
"sv_SE": "Användargränssnitt",
|
"sv_SE": "Användargränssnitt",
|
||||||
"th_TH": "หน้าจอผู้ใช้",
|
"th_TH": "หน้าจอผู้ใช้",
|
||||||
"tr_TR": "Kullancı Arayüzü",
|
"tr_TR": "Kullancı Arayüzü",
|
||||||
"uk_UA": "Інтерфейс",
|
"uk_UA": "Інтерфейс користувача",
|
||||||
"zh_CN": "用户界面",
|
"zh_CN": "用户界面",
|
||||||
"zh_TW": "使用者介面"
|
"zh_TW": "使用者介面"
|
||||||
}
|
}
|
||||||
@@ -3817,7 +3817,7 @@
|
|||||||
"sv_SE": "Inaktivera inmatning när fokus tappas",
|
"sv_SE": "Inaktivera inmatning när fokus tappas",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Вимкнути введення, якщо вікно неактивне",
|
"uk_UA": "",
|
||||||
"zh_CN": "在后台时禁用输入",
|
"zh_CN": "在后台时禁用输入",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -3842,7 +3842,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Показати оригінальний UI (Потрібен перезапуск)",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -3867,7 +3867,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Показати старий інтерфейс Avalonia Ryujinx, який був у Ryujinx 1.1.1403. Ця опція активна за замовчуванням на всіх інших, окрім Windows платформах.\nПовернеться класична панель заголовка, а всі суттєві зміни інтерфейсу будуть скасовані, зокрема горизонтальне розміщення навігації в налаштуваннях.",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -4867,7 +4867,7 @@
|
|||||||
"sv_SE": "Matcha systemtid",
|
"sv_SE": "Matcha systemtid",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Синхронізувати з системним годинником",
|
"uk_UA": "",
|
||||||
"zh_CN": "与系统时间同步",
|
"zh_CN": "与系统时间同步",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -7222,6 +7222,81 @@
|
|||||||
"zh_TW": "新增"
|
"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",
|
"ID": "ControllerSettingsRemove",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
@@ -8467,7 +8542,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "LED-підсвітка",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -8492,7 +8567,7 @@
|
|||||||
"sv_SE": "Inaktivera",
|
"sv_SE": "Inaktivera",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Вимкнути",
|
"uk_UA": "",
|
||||||
"zh_CN": "关闭",
|
"zh_CN": "关闭",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -8517,7 +8592,7 @@
|
|||||||
"sv_SE": "Regnbåge",
|
"sv_SE": "Regnbåge",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Веселка",
|
"uk_UA": "",
|
||||||
"zh_CN": "彩虹",
|
"zh_CN": "彩虹",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -8542,7 +8617,7 @@
|
|||||||
"sv_SE": "Regnbågshastighet",
|
"sv_SE": "Regnbågshastighet",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Швидкість зміни кольорів",
|
"uk_UA": "",
|
||||||
"zh_CN": "彩虹滚动速度",
|
"zh_CN": "彩虹滚动速度",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -9167,7 +9242,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "Esc",
|
"tr_TR": "Esc",
|
||||||
"uk_UA": "Esc",
|
"uk_UA": "",
|
||||||
"zh_CN": "Esc",
|
"zh_CN": "Esc",
|
||||||
"zh_TW": "Esc 鍵"
|
"zh_TW": "Esc 鍵"
|
||||||
}
|
}
|
||||||
@@ -10867,7 +10942,7 @@
|
|||||||
"sv_SE": "Diverse",
|
"sv_SE": "Diverse",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "Diğer",
|
"tr_TR": "Diğer",
|
||||||
"uk_UA": "Інше",
|
"uk_UA": "",
|
||||||
"zh_CN": "截图键",
|
"zh_CN": "截图键",
|
||||||
"zh_TW": "其他按鍵"
|
"zh_TW": "其他按鍵"
|
||||||
}
|
}
|
||||||
@@ -11872,6 +11947,31 @@
|
|||||||
"zh_TW": "儲存設定檔"
|
"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",
|
"ID": "MenuBarFileToolsTakeScreenshot",
|
||||||
"Translations": {
|
"Translations": {
|
||||||
@@ -17692,7 +17792,7 @@
|
|||||||
"sv_SE": "Ändra ljudvolym",
|
"sv_SE": "Ändra ljudvolym",
|
||||||
"th_TH": "ปรับระดับเสียง",
|
"th_TH": "ปรับระดับเสียง",
|
||||||
"tr_TR": "Ses seviyesini değiştirir",
|
"tr_TR": "Ses seviyesini değiştirir",
|
||||||
"uk_UA": "Регулювання гучності",
|
"uk_UA": "Змінити гучність звуку",
|
||||||
"zh_CN": "调节音量",
|
"zh_CN": "调节音量",
|
||||||
"zh_TW": "調節音量"
|
"zh_TW": "調節音量"
|
||||||
}
|
}
|
||||||
@@ -19592,7 +19692,7 @@
|
|||||||
"sv_SE": "Alla tangentbord",
|
"sv_SE": "Alla tangentbord",
|
||||||
"th_TH": "คีย์บอร์ดทั้งหมด",
|
"th_TH": "คีย์บอร์ดทั้งหมด",
|
||||||
"tr_TR": "Tüm Klavyeler",
|
"tr_TR": "Tüm Klavyeler",
|
||||||
"uk_UA": "Усі клавіатури",
|
"uk_UA": "Всі клавіатури",
|
||||||
"zh_CN": "所有键盘",
|
"zh_CN": "所有键盘",
|
||||||
"zh_TW": "所有鍵盤"
|
"zh_TW": "所有鍵盤"
|
||||||
}
|
}
|
||||||
@@ -19742,7 +19842,7 @@
|
|||||||
"sv_SE": "Snabbtangenter för tangentbord",
|
"sv_SE": "Snabbtangenter för tangentbord",
|
||||||
"th_TH": "ปุ่มลัดของคีย์บอร์ด",
|
"th_TH": "ปุ่มลัดของคีย์บอร์ด",
|
||||||
"tr_TR": "Klavye Kısayolları",
|
"tr_TR": "Klavye Kısayolları",
|
||||||
"uk_UA": "Гарячі клавіші",
|
"uk_UA": "Гарячі клавіші клавіатури",
|
||||||
"zh_CN": "快捷键",
|
"zh_CN": "快捷键",
|
||||||
"zh_TW": "鍵盤快速鍵"
|
"zh_TW": "鍵盤快速鍵"
|
||||||
}
|
}
|
||||||
@@ -22467,7 +22567,7 @@
|
|||||||
"sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.",
|
"sv_SE": "Tillämpar anti-aliasing på spelrenderaren.\n\nFXAA kommer att sudda det mesta av bilden, medan SMAA kommer att försöka hitta taggiga kanter och släta ut dem.\n\nRekommenderas inte att använda tillsammans med skalfiltret FSR.\n\nDet här alternativet kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. Du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som INGEN om du är osäker.",
|
||||||
"th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ",
|
"th_TH": "ใช้การลดรอยหยักกับการเรนเดอร์เกม\n\nFXAA จะเบลอภาพส่วนใหญ่ ในขณะที่ SMAA จะพยายามค้นหารอยหยักและปรับให้เรียบ\n\nไม่แนะนำให้ใช้ร่วมกับตัวกรองสเกล FSR\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม\n\nปล่อยไว้ที่ NONE หากไม่แน่ใจ",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште \"Немає\", якщо не впевнені.",
|
"uk_UA": "Застосовує згладження до рендера гри.\n\nFXAA розмиє більшість зображення, а SMAA спробує знайти нерівні краї та згладити їх.\n\nНе рекомендується використовувати разом з фільтром масштабування FSR.\n\nЦю опцію можна міняти коли гра запущена кліком на \"Застосувати; ви можете відсунути вікно налаштувань і поекспериментувати з видом гри.\n\nЗалиште на \"Немає\", якщо не впевнені.",
|
||||||
"zh_CN": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA(快速近似抗锯齿)是一种性能开销相对较小的抗锯齿方法,但可能会使得整体图像看起来有些模糊。\n\nSMAA(增强型子像素抗锯齿)则更加精细,它会尝试找到锯齿边缘并平滑它们,相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSR(FidelityFX Super Resolution,超级分辨率锐画技术)来提高性能或图像质量,不建议再启用抗锯齿,因为它们会产生不必要的图形处理开销,或者相互之间效果不协调。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“无”。",
|
"zh_CN": "抗锯齿是一种图形处理技术,用于减少图像边缘的锯齿状现象,使图像更加平滑。\n\nFXAA(快速近似抗锯齿)是一种性能开销相对较小的抗锯齿方法,但可能会使得整体图像看起来有些模糊。\n\nSMAA(增强型子像素抗锯齿)则更加精细,它会尝试找到锯齿边缘并平滑它们,相比 FXAA 有更好的图像质量,但性能开销可能会稍大一些。\n\n如果开启了 FSR(FidelityFX Super Resolution,超级分辨率锐画技术)来提高性能或图像质量,不建议再启用抗锯齿,因为它们会产生不必要的图形处理开销,或者相互之间效果不协调。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“无”。",
|
||||||
"zh_TW": "對遊戲繪製進行反鋸齒處理。\n\nFXAA 會模糊大部分圖像,而 SMAA 則會嘗試找出鋸齒邊緣並將其平滑化。\n\n不建議與 FSR 縮放濾鏡一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請選擇無狀態。"
|
"zh_TW": "對遊戲繪製進行反鋸齒處理。\n\nFXAA 會模糊大部分圖像,而 SMAA 則會嘗試找出鋸齒邊緣並將其平滑化。\n\n不建議與 FSR 縮放濾鏡一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請選擇無狀態。"
|
||||||
}
|
}
|
||||||
@@ -22542,7 +22642,7 @@
|
|||||||
"sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.",
|
"sv_SE": "Välj det skalfilter som ska tillämpas vid användning av upplösningsskala.\n\nBilinjär fungerar bra för 3D-spel och är ett säkert standardalternativ.\n\nNärmast rekommenderas för pixel art-spel.\n\nFSR 1.0 är bara ett skarpningsfilter, rekommenderas inte för FXAA eller SMAA.\n\nOmrådesskalning rekommenderas vid nedskalning av upplösning som är större än utdatafönstret. Det kan användas för att uppnå en supersamplad anti-alias-effekt vid nedskalning med mer än 2x.\n\nDetta alternativ kan ändras medan ett spel körs genom att klicka på \"Tillämpa\" nedan. du kan helt enkelt flytta inställningsfönstret åt sidan och experimentera tills du hittar ditt föredragna utseende för ett spel.\n\nLämna som BILINJÄR om du är osäker.",
|
||||||
"th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม",
|
"th_TH": "เลือกตัวกรองสเกลที่จะใช้เมื่อใช้สเกลความละเอียด\n\nBilinear ทำงานได้ดีกับเกม 3D และเป็นตัวเลือกเริ่มต้นที่ปลอดภัย\n\nแนะนำให้ใช้เกมภาพพิกเซลที่ใกล้เคียงที่สุด\n\nFSR 1.0 เป็นเพียงตัวกรองความคมชัด ไม่แนะนำให้ใช้กับ FXAA หรือ SMAA\n\nตัวเลือกนี้สามารถเปลี่ยนแปลงได้ในขณะที่เกมกำลังทำงานอยู่โดยคลิก \"นำไปใช้\" ด้านล่าง คุณสามารถย้ายหน้าต่างการตั้งค่าไปด้านข้างและทดลองจนกว่าคุณจะพบรูปลักษณ์ที่คุณต้องการสำหรับเกม",
|
||||||
"tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
"tr_TR": "Choose the scaling filter that will be applied when using resolution scale.\n\nBilinear works well for 3D games and is a safe default option.\n\nNearest is recommended for pixel art games.\n\nFSR 1.0 is merely a sharpening filter, not recommended for use with FXAA or SMAA.\n\nThis option can be changed while a game is running by clicking \"Apply\" below; you can simply move the settings window aside and experiment until you find your preferred look for a game.\n\nLeave on BILINEAR if unsure.",
|
||||||
"uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - фільтр різкості. Не варто використовувати разом з FXAA або SMAA.\n\nЦю опцію можна змінювати під час гри кліком на \"Застосувати\" нижче; ви можете відсунути вікно налаштувань і поекспериментувати з тим, як відображатиметься гра.\n\nЗалиште \"Білінійний\", якщо не впевнені.",
|
"uk_UA": "Виберіть фільтр масштабування, що використається при збільшенні роздільної здатності.\n\n\"Білінійний\" добре виглядає в 3D іграх, і хороше налаштування за умовчуванням.\n\n\"Найближчий\" рекомендується для ігор з піксель-артом.\n\n\"FSR 1.0\" - фільтр різкості. Не варто використовувати разом з FXAA або SMAA.\n\nЦю опцію можна змінювати під час гри кліком на \"Застосувати\" нижче; ви можете відсунути вікно налаштувань і поекспериментувати з тим, як відображатиметься гра.\n\nЗалиште на \"Білінійний\", якщо не впевнені.",
|
||||||
"zh_CN": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear(双线性过滤)对于3D游戏效果较好,是一个安全的默认选项。\n\nNearest(最近邻过滤)推荐用于像素艺术游戏。\n\nFSR(超级分辨率锐画)只是一个锐化过滤器,不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea(局部过滤),当渲染分辨率大于窗口实际分辨率,推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“Bilinear(双线性过滤)”。",
|
"zh_CN": "选择在分辨率缩放时将使用的缩放过滤器。\n\nBilinear(双线性过滤)对于3D游戏效果较好,是一个安全的默认选项。\n\nNearest(最近邻过滤)推荐用于像素艺术游戏。\n\nFSR(超级分辨率锐画)只是一个锐化过滤器,不推荐与 FXAA 或 SMAA 抗锯齿一起使用。\n\nArea(局部过滤),当渲染分辨率大于窗口实际分辨率,推荐该选项。该选项在渲染比例大于2.0的情况下,可以实现超采样的效果。\n\n在游戏运行时,通过点击下面的“应用”按钮可以使设置生效;你可以将设置窗口移开,并试验找到您喜欢的游戏画面效果。\n\n如果不确定,请保持为“Bilinear(双线性过滤)”。",
|
||||||
"zh_TW": "選擇使用解析度縮放時套用的縮放過濾器。\n\n雙線性 (Bilinear) 濾鏡適用於 3D 遊戲,是一個安全的預設選項。\n\n建議像素美術遊戲使用近鄰性 (Nearest) 濾鏡。\n\nFSR 1.0 只是一個銳化濾鏡,不建議與 FXAA 或 SMAA 一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請保持雙線性 (Bilinear) 狀態。"
|
"zh_TW": "選擇使用解析度縮放時套用的縮放過濾器。\n\n雙線性 (Bilinear) 濾鏡適用於 3D 遊戲,是一個安全的預設選項。\n\n建議像素美術遊戲使用近鄰性 (Nearest) 濾鏡。\n\nFSR 1.0 只是一個銳化濾鏡,不建議與 FXAA 或 SMAA 一起使用。\n\n此選項可在遊戲執行時透過點選下方的「套用」進行變更;您只需將設定視窗移到一旁,然後進行試驗,直到找到您喜歡的遊戲效果。\n\n如果不確定,請保持雙線性 (Bilinear) 狀態。"
|
||||||
}
|
}
|
||||||
@@ -23867,7 +23967,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Список сумісності — {0} ігор",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -23942,7 +24042,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Шукати серед {0} перевірених ігор...",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -24017,7 +24117,7 @@
|
|||||||
"sv_SE": "Spelbart",
|
"sv_SE": "Spelbart",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Справна",
|
"uk_UA": "Оптимально",
|
||||||
"zh_CN": "可游玩",
|
"zh_CN": "可游玩",
|
||||||
"zh_TW": "可暢順遊玩"
|
"zh_TW": "可暢順遊玩"
|
||||||
}
|
}
|
||||||
@@ -24267,7 +24367,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "Власна конфігурація",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
@@ -24292,7 +24392,7 @@
|
|||||||
"sv_SE": "",
|
"sv_SE": "",
|
||||||
"th_TH": "",
|
"th_TH": "",
|
||||||
"tr_TR": "",
|
"tr_TR": "",
|
||||||
"uk_UA": "(Глобальні)",
|
"uk_UA": "",
|
||||||
"zh_CN": "",
|
"zh_CN": "",
|
||||||
"zh_TW": ""
|
"zh_TW": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ namespace Ryujinx.Ava.Common.Locale
|
|||||||
{ LocaleKeys.RyujinxConfirm, [RyujinxApp.FullAppName] },
|
{ LocaleKeys.RyujinxConfirm, [RyujinxApp.FullAppName] },
|
||||||
{ LocaleKeys.RyujinxUpdater, [RyujinxApp.FullAppName] },
|
{ LocaleKeys.RyujinxUpdater, [RyujinxApp.FullAppName] },
|
||||||
{ LocaleKeys.RyujinxRebooter, [RyujinxApp.FullAppName] },
|
{ LocaleKeys.RyujinxRebooter, [RyujinxApp.FullAppName] },
|
||||||
{ LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, [CompatibilityDatabase.Entries.Length] },
|
{ LocaleKeys.CompatibilityListSearchBoxWatermarkWithCount, [CompatibilityCsv.Entries.Length] },
|
||||||
{ LocaleKeys.CompatibilityListTitle, [CompatibilityDatabase.Entries.Length] }
|
{ LocaleKeys.CompatibilityListTitle, [CompatibilityCsv.Entries.Length] }
|
||||||
});
|
});
|
||||||
|
|
||||||
Load();
|
Load();
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Avalonia.Markup.Xaml.MarkupExtensions;
|
using Avalonia.Markup.Xaml.MarkupExtensions;
|
||||||
|
using Humanizer;
|
||||||
using Projektanker.Icons.Avalonia;
|
using Projektanker.Icons.Avalonia;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
|
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ namespace Ryujinx.Ava.Common
|
|||||||
|
|
||||||
internal class TrimmerWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog
|
internal class TrimmerWindow : Ryujinx.Common.Logging.XCIFileTrimmerLog
|
||||||
{
|
{
|
||||||
private readonly XciTrimmerViewModel _viewModel;
|
private readonly XCITrimmerViewModel _viewModel;
|
||||||
|
|
||||||
public TrimmerWindow(XciTrimmerViewModel viewModel)
|
public TrimmerWindow(XCITrimmerViewModel viewModel)
|
||||||
{
|
{
|
||||||
_viewModel = viewModel;
|
_viewModel = viewModel;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ using Ryujinx.Common.Logging;
|
|||||||
using Ryujinx.HLE;
|
using Ryujinx.HLE;
|
||||||
using Ryujinx.HLE.Loaders.Processes;
|
using Ryujinx.HLE.Loaders.Processes;
|
||||||
using Ryujinx.Horizon;
|
using Ryujinx.Horizon;
|
||||||
|
using Ryujinx.Horizon.Prepo.Types;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems
|
namespace Ryujinx.Ava
|
||||||
{
|
{
|
||||||
public static class DiscordIntegrationModule
|
public static class DiscordIntegrationModule
|
||||||
{
|
{
|
||||||
@@ -123,7 +124,7 @@ namespace Ryujinx.Ava.Systems
|
|||||||
_currentApp = null;
|
_currentApp = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void HandlePlayReport(Horizon.Prepo.Types.PlayReport playReport)
|
private static void HandlePlayReport(PlayReport playReport)
|
||||||
{
|
{
|
||||||
if (_discordClient is null) return;
|
if (_discordClient is null) return;
|
||||||
if (!TitleIDs.CurrentApplication.Value.HasValue) return;
|
if (!TitleIDs.CurrentApplication.Value.HasValue) return;
|
||||||
@@ -2,7 +2,6 @@ using DiscordRPC;
|
|||||||
using LibHac.Tools.FsSystem;
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Audio.Backends.SDL2;
|
using Ryujinx.Audio.Backends.SDL2;
|
||||||
using Ryujinx.Ava;
|
using Ryujinx.Ava;
|
||||||
using Ryujinx.Ava.Systems;
|
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Configuration.Hid;
|
using Ryujinx.Common.Configuration.Hid;
|
||||||
@@ -12,6 +11,7 @@ using Ryujinx.Common.Configuration.Hid.Keyboard;
|
|||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
using Ryujinx.Graphics.GAL;
|
using Ryujinx.Graphics.GAL;
|
||||||
|
using Ryujinx.Graphics.GAL.Multithreading;
|
||||||
using Ryujinx.Graphics.OpenGL;
|
using Ryujinx.Graphics.OpenGL;
|
||||||
using Ryujinx.Graphics.Vulkan;
|
using Ryujinx.Graphics.Vulkan;
|
||||||
using Ryujinx.HLE;
|
using Ryujinx.HLE;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using Gommon;
|
|||||||
using Projektanker.Icons.Avalonia;
|
using Projektanker.Icons.Avalonia;
|
||||||
using Projektanker.Icons.Avalonia.FontAwesome;
|
using Projektanker.Icons.Avalonia.FontAwesome;
|
||||||
using Projektanker.Icons.Avalonia.MaterialDesign;
|
using Projektanker.Icons.Avalonia.MaterialDesign;
|
||||||
using Ryujinx.Ava.Systems;
|
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.Windows;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
|
using SkiaSharp;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
@@ -8,7 +10,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems
|
namespace Ryujinx.Ava
|
||||||
{
|
{
|
||||||
internal static class Rebooter
|
internal static class Rebooter
|
||||||
{
|
{
|
||||||
@@ -91,12 +91,10 @@
|
|||||||
<Content Include="..\..\distribution\legal\THIRDPARTY.md">
|
<Content Include="..\..\distribution\legal\THIRDPARTY.md">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
<TargetPath>THIRDPARTY.md</TargetPath>
|
<TargetPath>THIRDPARTY.md</TargetPath>
|
||||||
<Visible>False</Visible>
|
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="..\..\LICENSE.txt">
|
<Content Include="..\..\LICENSE.txt">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
<TargetPath>LICENSE.txt</TargetPath>
|
<TargetPath>LICENSE.txt</TargetPath>
|
||||||
<Visible>False</Visible>
|
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ using Avalonia.Styling;
|
|||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using FluentAvalonia.UI.Windowing;
|
using FluentAvalonia.UI.Windowing;
|
||||||
using Gommon;
|
using Gommon;
|
||||||
|
using Ryujinx.Ava.Common;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.Windows;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Ava.UI.Views.Dialog;
|
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using System;
|
using System;
|
||||||
@@ -150,7 +150,7 @@ namespace Ryujinx.Ava
|
|||||||
|
|
||||||
private async void AboutRyujinx_OnClick(object sender, EventArgs e)
|
private async void AboutRyujinx_OnClick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
await AboutView.Show();
|
await AboutWindow.Show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@ namespace Ryujinx.Ava.Systems.AppLibrary
|
|||||||
{
|
{
|
||||||
_id = value;
|
_id = value;
|
||||||
|
|
||||||
Compatibility = CompatibilityDatabase.Find(value);
|
Compatibility = CompatibilityCsv.Find(value);
|
||||||
RichPresenceSpec = PlayReports.Analyzer.TryGetSpec(IdString, out GameSpec gameSpec)
|
RichPresenceSpec = PlayReports.Analyzer.TryGetSpec(IdString, out GameSpec gameSpec)
|
||||||
? gameSpec
|
? gameSpec
|
||||||
: default(Optional<GameSpec>);
|
: default(Optional<GameSpec>);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems.AppLibrary
|
namespace Ryujinx.Ava.Systems.AppLibrary
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,9 +11,24 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.Systems
|
namespace Ryujinx.Ava.Systems
|
||||||
{
|
{
|
||||||
public class CompatibilityDatabase
|
public struct ColumnIndices(Func<ReadOnlySpan<char>, int> getIndex)
|
||||||
{
|
{
|
||||||
static CompatibilityDatabase() => Load();
|
public const string TitleIdCol = "\"title_id\"";
|
||||||
|
public const string GameNameCol = "\"game_name\"";
|
||||||
|
public const string LabelsCol = "\"labels\"";
|
||||||
|
public const string StatusCol = "\"status\"";
|
||||||
|
public const string LastUpdatedCol = "\"last_updated\"";
|
||||||
|
|
||||||
|
public readonly int TitleId = getIndex(TitleIdCol);
|
||||||
|
public readonly int GameName = getIndex(GameNameCol);
|
||||||
|
public readonly int Labels = getIndex(LabelsCol);
|
||||||
|
public readonly int Status = getIndex(StatusCol);
|
||||||
|
public readonly int LastUpdated = getIndex(LastUpdatedCol);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CompatibilityCsv
|
||||||
|
{
|
||||||
|
static CompatibilityCsv() => Load();
|
||||||
|
|
||||||
public static void Load()
|
public static void Load()
|
||||||
{
|
{
|
||||||
@@ -50,6 +65,16 @@ namespace Ryujinx.Ava.Systems
|
|||||||
|
|
||||||
public static CompatibilityEntry Find(ulong titleId)
|
public static CompatibilityEntry Find(ulong titleId)
|
||||||
=> Find(titleId.ToString("X16"));
|
=> Find(titleId.ToString("X16"));
|
||||||
|
|
||||||
|
public static LocaleKeys? GetStatus(string titleId)
|
||||||
|
=> Find(titleId)?.Status;
|
||||||
|
|
||||||
|
public static LocaleKeys? GetStatus(ulong titleId) => GetStatus(titleId.ToString("X16"));
|
||||||
|
|
||||||
|
public static string GetLabels(string titleId)
|
||||||
|
=> Find(titleId)?.FormattedIssueLabels;
|
||||||
|
|
||||||
|
public static string GetLabels(ulong titleId) => GetLabels(titleId.ToString("X16"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CompatibilityEntry
|
public class CompatibilityEntry
|
||||||
@@ -110,7 +135,6 @@ namespace Ryujinx.Ava.Systems
|
|||||||
|
|
||||||
public string FormattedIssueLabels => Labels
|
public string FormattedIssueLabels => Labels
|
||||||
.Select(FormatLabelName)
|
.Select(FormatLabelName)
|
||||||
.Where(x => x != null)
|
|
||||||
.JoinToString(", ");
|
.JoinToString(", ");
|
||||||
|
|
||||||
public override string ToString() =>
|
public override string ToString() =>
|
||||||
@@ -134,6 +158,7 @@ namespace Ryujinx.Ava.Systems
|
|||||||
"gui" => "GUI",
|
"gui" => "GUI",
|
||||||
"help wanted" => "Help Wanted",
|
"help wanted" => "Help Wanted",
|
||||||
"horizon" => "Horizon",
|
"horizon" => "Horizon",
|
||||||
|
"infra" => "Project Infra",
|
||||||
"invalid" => "Invalid",
|
"invalid" => "Invalid",
|
||||||
"kernel" => "Kernel",
|
"kernel" => "Kernel",
|
||||||
"ldn" => "LDN",
|
"ldn" => "LDN",
|
||||||
@@ -147,9 +172,9 @@ namespace Ryujinx.Ava.Systems
|
|||||||
"ldn-untested" => "LDN Untested",
|
"ldn-untested" => "LDN Untested",
|
||||||
"ldn-broken" => "LDN Broken",
|
"ldn-broken" => "LDN Broken",
|
||||||
"ldn-partial" => "Partial LDN",
|
"ldn-partial" => "Partial LDN",
|
||||||
"nvdec" => "GPU Video Decoding",
|
"nvdec" => "NVDEC",
|
||||||
"services" => "HLE Services",
|
"services" => "NX Services",
|
||||||
"services-horizon" => "New HLE Services",
|
"services-horizon" => "Horizon OS Services",
|
||||||
"slow" => "Runs Slow",
|
"slow" => "Runs Slow",
|
||||||
"crash" => "Crashes",
|
"crash" => "Crashes",
|
||||||
"deadlock" => "Deadlock",
|
"deadlock" => "Deadlock",
|
||||||
@@ -157,7 +182,7 @@ namespace Ryujinx.Ava.Systems
|
|||||||
"opengl" => "OpenGL",
|
"opengl" => "OpenGL",
|
||||||
"opengl-backend-bug" => "OpenGL Backend Bug",
|
"opengl-backend-bug" => "OpenGL Backend Bug",
|
||||||
"vulkan-backend-bug" => "Vulkan Backend Bug",
|
"vulkan-backend-bug" => "Vulkan Backend Bug",
|
||||||
"mac-bug" => "Mac-specific Problems",
|
"mac-bug" => "Mac-specific Bug(s)",
|
||||||
"amd-vendor-bug" => "AMD GPU Bug",
|
"amd-vendor-bug" => "AMD GPU Bug",
|
||||||
"intel-vendor-bug" => "Intel GPU Bug",
|
"intel-vendor-bug" => "Intel GPU Bug",
|
||||||
"loader-allocator" => "Loader Allocator",
|
"loader-allocator" => "Loader Allocator",
|
||||||
@@ -166,22 +191,18 @@ namespace Ryujinx.Ava.Systems
|
|||||||
"UE4" => "Unreal Engine 4",
|
"UE4" => "Unreal Engine 4",
|
||||||
"homebrew" => "Homebrew Content",
|
"homebrew" => "Homebrew Content",
|
||||||
"online-broken" => "Online Broken",
|
"online-broken" => "Online Broken",
|
||||||
_ => null
|
_ => Capitalize(labelName)
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
public struct ColumnIndices(Func<ReadOnlySpan<char>, int> getIndex)
|
|
||||||
{
|
|
||||||
private const string TitleIdCol = "\"title_id\"";
|
|
||||||
private const string GameNameCol = "\"game_name\"";
|
|
||||||
private const string LabelsCol = "\"labels\"";
|
|
||||||
private const string StatusCol = "\"status\"";
|
|
||||||
private const string LastUpdatedCol = "\"last_updated\"";
|
|
||||||
|
|
||||||
public readonly int TitleId = getIndex(TitleIdCol);
|
public static string Capitalize(string value)
|
||||||
public readonly int GameName = getIndex(GameNameCol);
|
{
|
||||||
public readonly int Labels = getIndex(LabelsCol);
|
if (value == string.Empty)
|
||||||
public readonly int Status = getIndex(StatusCol);
|
return string.Empty;
|
||||||
public readonly int LastUpdated = getIndex(LastUpdatedCol);
|
|
||||||
|
char firstChar = value[0];
|
||||||
|
string rest = value[1..];
|
||||||
|
|
||||||
|
return $"{char.ToUpper(firstChar)}{rest}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,7 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The current version of the file format
|
/// The current version of the file format
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const int CurrentVersion = 68;
|
public const int CurrentVersion = 67;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Version of the configuration file format
|
/// Version of the configuration file format
|
||||||
|
|||||||
@@ -160,7 +160,9 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||||||
DirtyHacks hacks = new (cff.DirtyHacks ?? []);
|
DirtyHacks hacks = new (cff.DirtyHacks ?? []);
|
||||||
|
|
||||||
Hacks.Xc2MenuSoftlockFix.Value = hacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix);
|
Hacks.Xc2MenuSoftlockFix.Value = hacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix);
|
||||||
|
|
||||||
|
Hacks.EnableShaderTranslationDelay.Value = hacks.IsEnabled(DirtyHack.ShaderTranslationDelay);
|
||||||
|
Hacks.ShaderTranslationDelay.Value = hacks[DirtyHack.ShaderTranslationDelay].CoerceAtLeast(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (configurationFileUpdated)
|
if (configurationFileUpdated)
|
||||||
@@ -439,8 +441,6 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||||||
(65, static cff => cff.UpdateCheckerType = cff.CheckUpdatesOnStart ? UpdaterType.PromptAtStartup : UpdaterType.Off),
|
(65, static cff => cff.UpdateCheckerType = cff.CheckUpdatesOnStart ? UpdaterType.PromptAtStartup : UpdaterType.Off),
|
||||||
(66, static cff => cff.DisableInputWhenOutOfFocus = false),
|
(66, static cff => cff.DisableInputWhenOutOfFocus = false),
|
||||||
(67, static cff => cff.FocusLostActionType = cff.DisableInputWhenOutOfFocus ? FocusLostType.BlockInput : FocusLostType.DoNothing)
|
(67, static cff => cff.FocusLostActionType = cff.DisableInputWhenOutOfFocus ? FocusLostType.BlockInput : FocusLostType.DoNothing)
|
||||||
// 68 was the version that added per-game configs; the file structure did not change
|
|
||||||
// the version was increased so external tools could know that your Ryujinx version has per-game config capabilities.
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ using Ryujinx.Common.Helper;
|
|||||||
using Ryujinx.Common.Logging;
|
using Ryujinx.Common.Logging;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
using Ryujinx.HLE;
|
using Ryujinx.HLE;
|
||||||
|
using Ryujinx.HLE.HOS.SystemState;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using RyuLogger = Ryujinx.Common.Logging.Logger;
|
using RyuLogger = Ryujinx.Common.Logging.Logger;
|
||||||
@@ -683,15 +684,18 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||||||
|
|
||||||
public ReactiveObject<bool> Xc2MenuSoftlockFix { get; private set; }
|
public ReactiveObject<bool> Xc2MenuSoftlockFix { get; private set; }
|
||||||
|
|
||||||
public ReactiveObject<bool> DisableNifmIsAnyInternetRequestAccepted { get; private set; }
|
public ReactiveObject<bool> EnableShaderTranslationDelay { get; private set; }
|
||||||
|
|
||||||
|
public ReactiveObject<int> ShaderTranslationDelay { get; private set; }
|
||||||
|
|
||||||
public HacksSection()
|
public HacksSection()
|
||||||
{
|
{
|
||||||
ShowDirtyHacks = new ReactiveObject<bool>();
|
ShowDirtyHacks = new ReactiveObject<bool>();
|
||||||
Xc2MenuSoftlockFix = new ReactiveObject<bool>();
|
Xc2MenuSoftlockFix = new ReactiveObject<bool>();
|
||||||
Xc2MenuSoftlockFix.Event += HackChanged;
|
Xc2MenuSoftlockFix.Event += HackChanged;
|
||||||
DisableNifmIsAnyInternetRequestAccepted = new ReactiveObject<bool>();
|
EnableShaderTranslationDelay = new ReactiveObject<bool>();
|
||||||
DisableNifmIsAnyInternetRequestAccepted.Event += HackChanged;
|
EnableShaderTranslationDelay.Event += HackChanged;
|
||||||
|
ShaderTranslationDelay = new ReactiveObject<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HackChanged(object sender, ReactiveEventArgs<bool> rxe)
|
private void HackChanged(object sender, ReactiveEventArgs<bool> rxe)
|
||||||
@@ -722,8 +726,8 @@ namespace Ryujinx.Ava.Systems.Configuration
|
|||||||
if (Xc2MenuSoftlockFix)
|
if (Xc2MenuSoftlockFix)
|
||||||
Apply(DirtyHack.Xc2MenuSoftlockFix);
|
Apply(DirtyHack.Xc2MenuSoftlockFix);
|
||||||
|
|
||||||
if (DisableNifmIsAnyInternetRequestAccepted)
|
if (EnableShaderTranslationDelay)
|
||||||
Apply(DirtyHack.NifmServiceDisableIsAnyInternetRequestAccepted);
|
Apply(DirtyHack.ShaderTranslationDelay, ShaderTranslationDelay);
|
||||||
|
|
||||||
return enabledHacks.ToArray();
|
return enabledHacks.ToArray();
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ using Ryujinx.Ava.Common.Locale;
|
|||||||
using Ryujinx.Ava.Common.Models;
|
using Ryujinx.Ava.Common.Models;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
|
using Ryujinx.Ava.UI.Views.Misc;
|
||||||
using Ryujinx.Ava.UI.Windows;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.UI.Views.Dialog;
|
|
||||||
using Ryujinx.Common.Configuration;
|
using Ryujinx.Common.Configuration;
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using Ryujinx.HLE.HOS;
|
using Ryujinx.HLE.HOS;
|
||||||
@@ -80,13 +80,13 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
public async void OpenTitleUpdateManager_Click(object sender, RoutedEventArgs args)
|
public async void OpenTitleUpdateManager_Click(object sender, RoutedEventArgs args)
|
||||||
{
|
{
|
||||||
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||||
await TitleUpdateManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
|
await TitleUpdateWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void OpenDownloadableContentManager_Click(object sender, RoutedEventArgs args)
|
public async void OpenDownloadableContentManager_Click(object sender, RoutedEventArgs args)
|
||||||
{
|
{
|
||||||
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||||
await DownloadableContentManagerView.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
|
await DownloadableContentManagerWindow.Show(viewModel.ApplicationLibrary, viewModel.SelectedApplication);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void OpenCheatManager_Click(object sender, RoutedEventArgs args)
|
public async void OpenCheatManager_Click(object sender, RoutedEventArgs args)
|
||||||
@@ -127,7 +127,7 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
public async void OpenModManager_Click(object sender, RoutedEventArgs args)
|
public async void OpenModManager_Click(object sender, RoutedEventArgs args)
|
||||||
{
|
{
|
||||||
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
if (sender is MenuItem { DataContext: MainWindowViewModel { SelectedApplication: not null } viewModel })
|
||||||
await ModManagerView.Show(
|
await ModManagerWindow.Show(
|
||||||
viewModel.SelectedApplication.Id,
|
viewModel.SelectedApplication.Id,
|
||||||
viewModel.SelectedApplication.IdBase,
|
viewModel.SelectedApplication.IdBase,
|
||||||
viewModel.ApplicationLibrary,
|
viewModel.ApplicationLibrary,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Layout;
|
||||||
using Avalonia.Media.Imaging;
|
using Avalonia.Media.Imaging;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Avalonia.Styling;
|
|||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using Gommon;
|
using Gommon;
|
||||||
|
using Ryujinx.Ava.Common;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using System;
|
using System;
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
using Gommon;
|
using Gommon;
|
||||||
using Ryujinx.Ava.Systems;
|
using Ryujinx.Ava.Systems;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using System;
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.ViewModels
|
namespace Ryujinx.Ava.UI.ViewModels
|
||||||
{
|
{
|
||||||
public class CompatibilityViewModel : BaseModel, IDisposable
|
public class CompatibilityViewModel : BaseModel
|
||||||
{
|
{
|
||||||
private readonly ApplicationLibrary _appLibrary;
|
private bool _onlyShowOwnedGames = true;
|
||||||
|
|
||||||
private IEnumerable<CompatibilityEntry> _currentEntries = CompatibilityDatabase.Entries;
|
private IEnumerable<CompatibilityEntry> _currentEntries = CompatibilityCsv.Entries;
|
||||||
private string[] _ownedGameTitleIds = [];
|
private string[] _ownedGameTitleIds = [];
|
||||||
|
|
||||||
public IEnumerable<CompatibilityEntry> CurrentEntries => OnlyShowOwnedGames
|
public IEnumerable<CompatibilityEntry> CurrentEntries => OnlyShowOwnedGames
|
||||||
@@ -20,27 +20,15 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
: _currentEntries;
|
: _currentEntries;
|
||||||
|
|
||||||
public CompatibilityViewModel() {}
|
public CompatibilityViewModel() {}
|
||||||
|
|
||||||
private void AppCountUpdated(object _, ApplicationCountUpdatedEventArgs __)
|
|
||||||
=> _ownedGameTitleIds = _appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray();
|
|
||||||
|
|
||||||
public CompatibilityViewModel(ApplicationLibrary appLibrary)
|
public CompatibilityViewModel(ApplicationLibrary appLibrary)
|
||||||
{
|
{
|
||||||
_appLibrary = appLibrary;
|
appLibrary.ApplicationCountUpdated += (_, _)
|
||||||
|
=> _ownedGameTitleIds = appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray();
|
||||||
|
|
||||||
AppCountUpdated(null, null);
|
_ownedGameTitleIds = appLibrary.Applications.Keys.Select(x => x.ToString("X16")).ToArray();
|
||||||
|
|
||||||
_appLibrary.ApplicationCountUpdated += AppCountUpdated;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void IDisposable.Dispose()
|
|
||||||
{
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
_appLibrary.ApplicationCountUpdated -= AppCountUpdated;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool _onlyShowOwnedGames = true;
|
|
||||||
|
|
||||||
public bool OnlyShowOwnedGames
|
public bool OnlyShowOwnedGames
|
||||||
{
|
{
|
||||||
get => _onlyShowOwnedGames;
|
get => _onlyShowOwnedGames;
|
||||||
@@ -58,11 +46,11 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(searchTerm))
|
if (string.IsNullOrEmpty(searchTerm))
|
||||||
{
|
{
|
||||||
SetEntries(CompatibilityDatabase.Entries);
|
SetEntries(CompatibilityCsv.Entries);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEntries(CompatibilityDatabase.Entries.Where(x =>
|
SetEntries(CompatibilityCsv.Entries.Where(x =>
|
||||||
x.GameName.ContainsIgnoreCase(searchTerm)
|
x.GameName.ContainsIgnoreCase(searchTerm)
|
||||||
|| x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm))));
|
|| x.TitleId.Check(tid => tid.ContainsIgnoreCase(searchTerm))));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
using Avalonia.Svg.Skia;
|
using Avalonia.Svg.Skia;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using FluentAvalonia.UI.Controls;
|
||||||
|
using Ryujinx.Ava.Input;
|
||||||
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.Models.Input;
|
using Ryujinx.Ava.UI.Models.Input;
|
||||||
using Ryujinx.Ava.UI.Views.Input;
|
using Ryujinx.Ava.UI.Views.Input;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
@@ -91,18 +95,21 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
}
|
}
|
||||||
|
|
||||||
public async void ShowMotionConfig()
|
public async void ShowMotionConfig()
|
||||||
{
|
{
|
||||||
await MotionInputView.Show(this);
|
await MotionInputView.Show(this);
|
||||||
|
ParentModel.IsModified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void ShowRumbleConfig()
|
public async void ShowRumbleConfig()
|
||||||
{
|
{
|
||||||
await RumbleInputView.Show(this);
|
await RumbleInputView.Show(this);
|
||||||
|
ParentModel.IsModified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void ShowLedConfig()
|
public async void ShowLedConfig()
|
||||||
{
|
{
|
||||||
await LedInputView.Show(this);
|
await LedInputView.Show(this);
|
||||||
|
ParentModel.IsModified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnParentModelChanged()
|
public void OnParentModelChanged()
|
||||||
|
|||||||
@@ -88,13 +88,40 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
public bool IsKeyboard => !IsController;
|
public bool IsKeyboard => !IsController;
|
||||||
public bool IsRight { get; set; }
|
public bool IsRight { get; set; }
|
||||||
public bool IsLeft { get; set; }
|
public bool IsLeft { get; set; }
|
||||||
|
public string RevertDeviceId { get; set; }
|
||||||
public bool HasLed => SelectedGamepad.Features.HasFlag(GamepadFeaturesFlag.Led);
|
public bool HasLed => SelectedGamepad.Features.HasFlag(GamepadFeaturesFlag.Led);
|
||||||
public bool CanClearLed => SelectedGamepad.Name.ContainsIgnoreCase("DualSense");
|
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 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
|
public object ConfigViewModel
|
||||||
{
|
{
|
||||||
get => _configViewModel;
|
get => _configViewModel;
|
||||||
@@ -120,14 +147,14 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (IsModified)
|
if (IsModified)
|
||||||
{
|
{
|
||||||
|
|
||||||
_playerIdChoose = value;
|
_playerIdChoose = value;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IsModified = false;
|
IsModified = false;
|
||||||
_playerId = value;
|
_playerId = value;
|
||||||
|
_isChangeTrackingActive = false;
|
||||||
|
|
||||||
if (!Enum.IsDefined<PlayerIndex>(_playerId))
|
if (!Enum.IsDefined<PlayerIndex>(_playerId))
|
||||||
{
|
{
|
||||||
@@ -135,13 +162,13 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
|
|
||||||
}
|
}
|
||||||
_isLoaded = false;
|
_isLoaded = false;
|
||||||
|
|
||||||
LoadConfiguration();
|
LoadConfiguration();
|
||||||
LoadDevice();
|
LoadDevice();
|
||||||
LoadProfiles();
|
LoadProfiles();
|
||||||
|
|
||||||
|
RevertDeviceId = Devices[Device].Id;
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
|
_isChangeTrackingActive = true;
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,6 +178,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
get => _controller;
|
get => _controller;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
MarkAsChanged();
|
||||||
|
|
||||||
_controller = value;
|
_controller = value;
|
||||||
|
|
||||||
if (_controller == -1)
|
if (_controller == -1)
|
||||||
@@ -185,11 +214,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
IsLeft = false;
|
IsLeft = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadInputDriver();
|
LoadInputDriver();
|
||||||
LoadProfiles();
|
LoadProfiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
NotifyChanges();
|
NotifyChanges();
|
||||||
}
|
}
|
||||||
@@ -229,6 +258,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
get => _device;
|
get => _device;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
MarkAsChanged();
|
||||||
|
|
||||||
_device = value < 0 ? 0 : value;
|
_device = value < 0 ? 0 : value;
|
||||||
|
|
||||||
if (_device >= Devices.Count)
|
if (_device >= Devices.Count)
|
||||||
@@ -248,13 +279,27 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FindPairedDeviceInConfigFile();
|
||||||
OnPropertyChanged();
|
OnPropertyChanged();
|
||||||
NotifyChanges();
|
NotifyChanges();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public InputConfig Config { get; set; }
|
public InputConfig Config { get; set; }
|
||||||
|
|
||||||
|
public bool _notificationView;
|
||||||
|
|
||||||
|
public bool NotificationView
|
||||||
|
{
|
||||||
|
get => _notificationView;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_notificationView = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public InputViewModel(UserControl owner) : this()
|
public InputViewModel(UserControl owner) : this()
|
||||||
{
|
{
|
||||||
if (Program.PreviewerDetached)
|
if (Program.PreviewerDetached)
|
||||||
@@ -274,6 +319,8 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
|
|
||||||
PlayerId = PlayerIndex.Player1;
|
PlayerId = PlayerIndex.Player1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_isChangeTrackingActive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public InputViewModel()
|
public InputViewModel()
|
||||||
@@ -311,8 +358,39 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
{
|
{
|
||||||
ConfigViewModel = new ControllerInputViewModel(this, new GamepadInputConfig(controllerInputConfig), VisualStick);
|
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
|
||||||
|
NotificationView = Config != null && Devices.FirstOrDefault(d => d.Id == Config.Id).Id != Config.Id && Config.PlayerIndex == PlayerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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.
|
||||||
|
NotificationView = false;
|
||||||
|
IsModified = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void LoadDevice()
|
public void LoadDevice()
|
||||||
{
|
{
|
||||||
if (Config == null || Config.Backend == InputBackendType.Invalid)
|
if (Config == null || Config.Backend == InputBackendType.Invalid)
|
||||||
@@ -378,14 +456,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()
|
private string GetCurrentGamepadId()
|
||||||
@@ -688,6 +786,12 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void LoadProfileButton()
|
||||||
|
{
|
||||||
|
LoadProfile();
|
||||||
|
IsModified = true;
|
||||||
|
}
|
||||||
|
|
||||||
public async void LoadProfile()
|
public async void LoadProfile()
|
||||||
{
|
{
|
||||||
if (Device == 0)
|
if (Device == 0)
|
||||||
@@ -739,9 +843,11 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
{
|
{
|
||||||
_isLoaded = false;
|
_isLoaded = false;
|
||||||
|
|
||||||
|
config.Id = Config.Id; // Set current device id instead of changing device(independent profiles)
|
||||||
|
|
||||||
LoadConfiguration(config);
|
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;
|
_isLoaded = true;
|
||||||
|
|
||||||
@@ -751,54 +857,58 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
|
|
||||||
public async void SaveProfile()
|
public async void SaveProfile()
|
||||||
{
|
{
|
||||||
if (Device == 0)
|
|
||||||
{
|
if (Device == 0)
|
||||||
return;
|
{
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ConfigViewModel == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ProfileName == LocaleManager.Instance[LocaleKeys.ControllerSettingsProfileDefault])
|
||||||
|
{
|
||||||
|
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileDefaultProfileOverwriteErrorMessage]);
|
||||||
|
|
||||||
if (ConfigViewModel == null)
|
return;
|
||||||
{
|
}
|
||||||
return;
|
else
|
||||||
}
|
{
|
||||||
|
bool validFileName = ProfileName.IndexOfAny(Path.GetInvalidFileNameChars()) == -1;
|
||||||
|
|
||||||
if (ProfileName == LocaleManager.Instance[LocaleKeys.ControllerSettingsProfileDefault])
|
if (validFileName)
|
||||||
{
|
{
|
||||||
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileDefaultProfileOverwriteErrorMessage]);
|
string path = Path.Combine(GetProfileBasePath(), ProfileName + ".json");
|
||||||
|
|
||||||
return;
|
InputConfig config = null;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool validFileName = ProfileName.IndexOfAny(Path.GetInvalidFileNameChars()) == -1;
|
|
||||||
|
|
||||||
if (validFileName)
|
if (IsKeyboard)
|
||||||
{
|
{
|
||||||
string path = Path.Combine(GetProfileBasePath(), ProfileName + ".json");
|
config = (ConfigViewModel as KeyboardInputViewModel).Config.GetConfig();
|
||||||
|
}
|
||||||
|
else if (IsController)
|
||||||
|
{
|
||||||
|
config = (ConfigViewModel as ControllerInputViewModel).Config.GetConfig();
|
||||||
|
}
|
||||||
|
|
||||||
InputConfig config = null;
|
config.ControllerType = Controllers[_controller].Type;
|
||||||
|
|
||||||
if (IsKeyboard)
|
string jsonString = JsonHelper.Serialize(config, _serializerContext.InputConfig);
|
||||||
{
|
|
||||||
config = (ConfigViewModel as KeyboardInputViewModel).Config.GetConfig();
|
|
||||||
}
|
|
||||||
else if (IsController)
|
|
||||||
{
|
|
||||||
config = (ConfigViewModel as ControllerInputViewModel).Config.GetConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
config.ControllerType = Controllers[_controller].Type;
|
await File.WriteAllTextAsync(path, jsonString);
|
||||||
|
|
||||||
string jsonString = JsonHelper.Serialize(config, _serializerContext.InputConfig);
|
LoadProfiles();
|
||||||
|
|
||||||
await File.WriteAllTextAsync(path, jsonString);
|
ProfileChoose = ProfileName; // Show new profile
|
||||||
|
}
|
||||||
LoadProfiles();
|
else
|
||||||
}
|
{
|
||||||
else
|
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileInvalidProfileNameErrorMessage]);
|
||||||
{
|
}
|
||||||
await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance[LocaleKeys.DialogProfileInvalidProfileNameErrorMessage]);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void RemoveProfile()
|
public async void RemoveProfile()
|
||||||
@@ -825,14 +935,33 @@ namespace Ryujinx.Ava.UI.ViewModels.Input
|
|||||||
}
|
}
|
||||||
|
|
||||||
LoadProfiles();
|
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()
|
public void Save()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (!IsModified)
|
||||||
|
{
|
||||||
|
return; //If the input settings were not touched, then do nothing
|
||||||
|
}
|
||||||
|
|
||||||
IsModified = false;
|
IsModified = false;
|
||||||
|
|
||||||
List<InputConfig> newConfig = [];
|
RevertDeviceId = Devices[Device].Id; // Remember selected device after saving
|
||||||
|
|
||||||
|
List <InputConfig> newConfig = [];
|
||||||
|
|
||||||
newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value);
|
newConfig.AddRange(ConfigurationState.Instance.Hid.InputConfig.Value);
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Avalonia.Controls;
|
|||||||
using Avalonia.Controls.ApplicationLifetimes;
|
using Avalonia.Controls.ApplicationLifetimes;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Media;
|
using Avalonia.Media;
|
||||||
|
using Avalonia.Media.Imaging;
|
||||||
using Avalonia.Platform.Storage;
|
using Avalonia.Platform.Storage;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
@@ -16,7 +17,6 @@ using LibHac.Ns;
|
|||||||
using Ryujinx.Ava.Common;
|
using Ryujinx.Ava.Common;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Input;
|
using Ryujinx.Ava.Input;
|
||||||
using Ryujinx.Ava.Systems;
|
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.Models;
|
using Ryujinx.Ava.UI.Models;
|
||||||
@@ -46,6 +46,7 @@ using System.Collections.ObjectModel;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Key = Ryujinx.Input.Key;
|
using Key = Ryujinx.Input.Key;
|
||||||
|
|||||||
@@ -16,12 +16,11 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
}
|
}
|
||||||
|
|
||||||
[ObservableProperty] private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix;
|
[ObservableProperty] private bool _xc2MenuSoftlockFix = ConfigurationState.Instance.Hacks.Xc2MenuSoftlockFix;
|
||||||
[ObservableProperty] private bool _nifmDisableIsAnyInternetRequestAccepted = ConfigurationState.Instance.Hacks.DisableNifmIsAnyInternetRequestAccepted;
|
|
||||||
|
|
||||||
public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb =>
|
public static string Xc2MenuFixTooltip { get; } = Lambda.String(sb =>
|
||||||
{
|
{
|
||||||
sb.AppendLine(
|
sb.AppendLine(
|
||||||
"This hack applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.")
|
"This fix applies a 2ms delay (via 'Thread.Sleep(2)') every time the game tries to read data from the emulated Switch filesystem.")
|
||||||
.AppendLine();
|
.AppendLine();
|
||||||
|
|
||||||
sb.AppendLine("From the issue on GitHub:").AppendLine();
|
sb.AppendLine("From the issue on GitHub:").AppendLine();
|
||||||
@@ -30,14 +29,5 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
"there is a low chance that the game will softlock, " +
|
"there is a low chance that the game will softlock, " +
|
||||||
"the submenu won't show up, while background music is still there.");
|
"the submenu won't show up, while background music is still there.");
|
||||||
});
|
});
|
||||||
|
|
||||||
public static string NifmDisableIsAnyInternetRequestAcceptedTooltip { get; } = Lambda.String(sb =>
|
|
||||||
{
|
|
||||||
sb.AppendLine(
|
|
||||||
"This hack simply sets 'IsAnyInternetRequestAccepted' to 'false' when initializing the Nifm IGeneralService.")
|
|
||||||
.AppendLine();
|
|
||||||
|
|
||||||
sb.Append("Lets DOOM 2016 go in game.");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -757,8 +757,6 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
|
|
||||||
// Dirty Hacks
|
// Dirty Hacks
|
||||||
config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFix;
|
config.Hacks.Xc2MenuSoftlockFix.Value = DirtyHacks.Xc2MenuSoftlockFix;
|
||||||
config.Hacks.DisableNifmIsAnyInternetRequestAccepted.Value =
|
|
||||||
DirtyHacks.NifmDisableIsAnyInternetRequestAccepted;
|
|
||||||
|
|
||||||
config.ToFileFormat().SaveConfig(Program.ConfigurationPath);
|
config.ToFileFormat().SaveConfig(Program.ConfigurationPath);
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ using static Ryujinx.Common.Utilities.XCIFileTrimmer;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.UI.ViewModels
|
namespace Ryujinx.Ava.UI.ViewModels
|
||||||
{
|
{
|
||||||
public class XciTrimmerViewModel : BaseModel
|
public class XCITrimmerViewModel : BaseModel
|
||||||
{
|
{
|
||||||
private const long _bytesPerMB = 1024 * 1024;
|
private const long _bytesPerMB = 1024 * 1024;
|
||||||
private enum ProcessingMode
|
private enum ProcessingMode
|
||||||
@@ -46,7 +46,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
private SortField _sortField = SortField.Name;
|
private SortField _sortField = SortField.Name;
|
||||||
private bool _sortAscending = true;
|
private bool _sortAscending = true;
|
||||||
|
|
||||||
public XciTrimmerViewModel(MainWindowViewModel mainWindowViewModel)
|
public XCITrimmerViewModel(MainWindowViewModel mainWindowViewModel)
|
||||||
{
|
{
|
||||||
_logger = new XCITrimmerLog.TrimmerWindow(this);
|
_logger = new XCITrimmerLog.TrimmerWindow(this);
|
||||||
_mainWindowViewModel = mainWindowViewModel;
|
_mainWindowViewModel = mainWindowViewModel;
|
||||||
@@ -254,9 +254,9 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||||||
|
|
||||||
private class CompareXCITrimmerFiles : IComparer<XCITrimmerFileModel>
|
private class CompareXCITrimmerFiles : IComparer<XCITrimmerFileModel>
|
||||||
{
|
{
|
||||||
private XciTrimmerViewModel _viewModel;
|
private XCITrimmerViewModel _viewModel;
|
||||||
|
|
||||||
public CompareXCITrimmerFiles(XciTrimmerViewModel ViewModel)
|
public CompareXCITrimmerFiles(XCITrimmerViewModel ViewModel)
|
||||||
{
|
{
|
||||||
_viewModel = ViewModel;
|
_viewModel = ViewModel;
|
||||||
}
|
}
|
||||||
@@ -4,10 +4,10 @@
|
|||||||
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
|
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:ui="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia"
|
||||||
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
||||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels.Input"
|
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels.Input"
|
||||||
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
|
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
|
||||||
xmlns:pt="using:Projektanker.Icons.Avalonia"
|
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
d:DesignHeight="800"
|
d:DesignHeight="800"
|
||||||
@@ -507,49 +507,65 @@
|
|||||||
CornerRadius="5"
|
CornerRadius="5"
|
||||||
VerticalAlignment="Bottom"
|
VerticalAlignment="Bottom"
|
||||||
HorizontalAlignment="Stretch">
|
HorizontalAlignment="Stretch">
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
<StackPanel Orientation="Vertical" Spacing="5">
|
<CheckBox
|
||||||
<CheckBox
|
Margin="10"
|
||||||
Margin="10, 10, 10, 0"
|
MinWidth="0"
|
||||||
MinWidth="0"
|
Grid.Column="0"
|
||||||
IsChecked="{Binding Config.EnableMotion, Mode=TwoWay}">
|
IsChecked="{Binding Config.EnableMotion, Mode=TwoWay}">
|
||||||
<TextBlock Text="{ext:Locale ControllerSettingsMotion}" />
|
<TextBlock Text="{ext:Locale ControllerSettingsMotion}" />
|
||||||
</CheckBox>
|
</CheckBox>
|
||||||
<Button
|
<Button
|
||||||
Margin="10, 0, 10, 10"
|
Margin="10"
|
||||||
Command="{Binding ShowMotionConfig}">
|
Grid.Column="1"
|
||||||
<pt:Icon Value="fa-solid fa-gear" />
|
Command="{Binding ShowMotionConfig}">
|
||||||
</Button>
|
<TextBlock Text="{ext:Locale ControllerSettingsConfigureGeneral}" />
|
||||||
</StackPanel>
|
</Button>
|
||||||
<controls:MiniVerticalSeparator Height="64"/>
|
</Grid>
|
||||||
<StackPanel Orientation="Vertical" Spacing="5">
|
</Border>
|
||||||
<CheckBox
|
<Border
|
||||||
Margin="10, 10, 10, 0"
|
BorderBrush="{DynamicResource ThemeControlBorderColor}"
|
||||||
MinWidth="0"
|
BorderThickness="1"
|
||||||
IsChecked="{Binding Config.EnableRumble, Mode=TwoWay}">
|
CornerRadius="5"
|
||||||
<TextBlock Text="{ext:Locale ControllerSettingsRumble}" />
|
HorizontalAlignment="Stretch"
|
||||||
</CheckBox>
|
Margin="0,-1,0,0">
|
||||||
<Button
|
<Grid ColumnDefinitions="*,Auto">
|
||||||
Margin="10, 0, 10, 10"
|
<CheckBox
|
||||||
Command="{Binding ShowRumbleConfig}">
|
Margin="10"
|
||||||
<pt:Icon Value="fa-solid fa-gear" />
|
MinWidth="0"
|
||||||
</Button>
|
Grid.Column="0"
|
||||||
</StackPanel>
|
IsChecked="{Binding Config.EnableRumble, Mode=TwoWay}">
|
||||||
<controls:MiniVerticalSeparator Height="64" IsVisible="{Binding ParentModel.HasLed}"/>
|
<TextBlock Text="{ext:Locale ControllerSettingsRumble}" />
|
||||||
<StackPanel Orientation="Vertical" Spacing="5">
|
</CheckBox>
|
||||||
<CheckBox
|
<Button
|
||||||
Margin="10, 10, 10, 0"
|
Margin="10"
|
||||||
MinWidth="0"
|
Grid.Column="1"
|
||||||
IsChecked="{Binding Config.EnableLedChanging, Mode=TwoWay}">
|
Command="{Binding ShowRumbleConfig}">
|
||||||
<TextBlock Text="{ext:Locale ControllerSettingsLed}" />
|
<TextBlock Text="{ext:Locale ControllerSettingsConfigureGeneral}" />
|
||||||
</CheckBox>
|
</Button>
|
||||||
<Button
|
</Grid>
|
||||||
Margin="10, 0, 10, 10"
|
</Border>
|
||||||
Command="{Binding ShowLedConfig}">
|
<Border
|
||||||
<pt:Icon Value="fa-solid fa-gear" />
|
BorderBrush="{DynamicResource ThemeControlBorderColor}"
|
||||||
</Button>
|
BorderThickness="1"
|
||||||
</StackPanel>
|
CornerRadius="5"
|
||||||
</StackPanel>
|
HorizontalAlignment="Stretch"
|
||||||
|
Margin="0,-1,0,0">
|
||||||
|
<Grid IsVisible="{Binding ParentModel.HasLed}" ColumnDefinitions="*,Auto">
|
||||||
|
<CheckBox
|
||||||
|
Margin="10, 10, 5, 10"
|
||||||
|
MinWidth="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
IsChecked="{Binding Config.EnableLedChanging, Mode=TwoWay}">
|
||||||
|
<TextBlock Text="{ext:Locale ControllerSettingsLed}" />
|
||||||
|
</CheckBox>
|
||||||
|
<Button
|
||||||
|
Margin="10"
|
||||||
|
Grid.Column="1"
|
||||||
|
Command="{Binding ShowLedConfig}">
|
||||||
|
<TextBlock Text="{ext:Locale ControllerSettingsConfigureGeneral}" />
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@@ -64,8 +64,9 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value)
|
if (!float.IsNaN(_changeSlider) && _changeSlider != (float)check.Value)
|
||||||
{
|
{
|
||||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
FlagInputConfigChanged();
|
||||||
|
|
||||||
_changeSlider = (float)check.Value;
|
_changeSlider = (float)check.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,8 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
{
|
{
|
||||||
if (sender is CheckBox { IsPointerOver: true })
|
if (sender is CheckBox { IsPointerOver: true })
|
||||||
{
|
{
|
||||||
(DataContext as ControllerInputViewModel)!.ParentModel.IsModified = true;
|
FlagInputConfigChanged();
|
||||||
|
|
||||||
_currentAssigner?.Cancel();
|
_currentAssigner?.Cancel();
|
||||||
_currentAssigner = null;
|
_currentAssigner = null;
|
||||||
}
|
}
|
||||||
@@ -102,7 +104,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
this.Focus(NavigationMethod.Pointer);
|
this.Focus(NavigationMethod.Pointer);
|
||||||
|
|
||||||
PointerPressed += MouseClick;
|
PointerPressed += MouseClick;
|
||||||
|
|
||||||
ControllerInputViewModel viewModel = (DataContext as ControllerInputViewModel);
|
ControllerInputViewModel viewModel = (DataContext as ControllerInputViewModel);
|
||||||
|
|
||||||
IKeyboard keyboard =
|
IKeyboard keyboard =
|
||||||
@@ -115,7 +117,7 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
if (e.ButtonValue.HasValue)
|
if (e.ButtonValue.HasValue)
|
||||||
{
|
{
|
||||||
Button buttonValue = e.ButtonValue.Value;
|
Button buttonValue = e.ButtonValue.Value;
|
||||||
viewModel.ParentModel.IsModified = true;
|
FlagInputConfigChanged();
|
||||||
|
|
||||||
switch (button.Name)
|
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)
|
private void MouseClick(object sender, PointerPressedEventArgs e)
|
||||||
{
|
{
|
||||||
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
||||||
@@ -232,7 +239,6 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
{
|
{
|
||||||
gamepad?.ClearLed();
|
gamepad?.ClearLed();
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentAssigner?.Cancel();
|
_currentAssigner?.Cancel();
|
||||||
_currentAssigner = null;
|
_currentAssigner = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,13 +41,20 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Margin="2"
|
Margin="2"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
VerticalAlignment="Center" ColumnDefinitions="Auto,*">
|
VerticalAlignment="Center" ColumnDefinitions="Auto,*,Auto">
|
||||||
<TextBlock
|
<StackPanel
|
||||||
|
Orientation="Vertical"
|
||||||
Margin="5,0,10,0"
|
Margin="5,0,10,0"
|
||||||
Width="90"
|
|
||||||
HorizontalAlignment="Left"
|
HorizontalAlignment="Left"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Text="{ext:Locale ControllerSettingsPlayer}" />
|
Width="90">
|
||||||
|
<TextBlock
|
||||||
|
Text="{ext:Locale ControllerSettingsPlayer}" />
|
||||||
|
<TextBlock
|
||||||
|
Classes="pending"
|
||||||
|
Text ="{ext:Locale ControllerSettingsModifiedNotification}"
|
||||||
|
IsVisible="{Binding IsModified}"/>
|
||||||
|
</StackPanel>
|
||||||
<ComboBox
|
<ComboBox
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Name="PlayerIndexBox"
|
Name="PlayerIndexBox"
|
||||||
@@ -62,6 +69,18 @@
|
|||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</ComboBox.ItemTemplate>
|
</ComboBox.ItemTemplate>
|
||||||
</ComboBox>
|
</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>
|
</Grid>
|
||||||
<!-- Profile Selection -->
|
<!-- Profile Selection -->
|
||||||
<Grid
|
<Grid
|
||||||
@@ -81,7 +100,8 @@
|
|||||||
Name="ProfileBox"
|
Name="ProfileBox"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
SelectedIndex="0"
|
SelectedItem="{Binding ProfileChoose, Mode=TwoWay}"
|
||||||
|
SelectionChanged="ComboBox_SelectionChanged"
|
||||||
ItemsSource="{Binding ProfilesList}"
|
ItemsSource="{Binding ProfilesList}"
|
||||||
Text="{Binding ProfileName, Mode=TwoWay}" />
|
Text="{Binding ProfileName, Mode=TwoWay}" />
|
||||||
<Button
|
<Button
|
||||||
@@ -90,7 +110,7 @@
|
|||||||
Margin="5,0,0,0"
|
Margin="5,0,0,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
ToolTip.Tip="{ext:Locale ControllerSettingsLoadProfileToolTip}"
|
ToolTip.Tip="{ext:Locale ControllerSettingsLoadProfileToolTip}"
|
||||||
Command="{Binding LoadProfile}">
|
Command="{Binding LoadProfileButton}">
|
||||||
<ui:SymbolIcon
|
<ui:SymbolIcon
|
||||||
Symbol="View"
|
Symbol="View"
|
||||||
FontSize="15"
|
FontSize="15"
|
||||||
@@ -148,7 +168,7 @@
|
|||||||
MinWidth="0"
|
MinWidth="0"
|
||||||
Margin="5,0,0,0"
|
Margin="5,0,0,0"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Command="{Binding LoadDevices}">
|
Command="{Binding LoadDevice}">
|
||||||
<ui:SymbolIcon
|
<ui:SymbolIcon
|
||||||
Symbol="Refresh"
|
Symbol="Refresh"
|
||||||
FontSize="15"
|
FontSize="15"
|
||||||
@@ -181,15 +201,36 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<ContentControl Content="{Binding ConfigViewModel}" IsVisible="{Binding ShowSettings}">
|
<ContentControl IsVisible="{Binding NotificationView}">
|
||||||
<ContentControl.DataTemplates>
|
<ContentControl.Content>
|
||||||
<DataTemplate DataType="viewModels:ControllerInputViewModel">
|
<StackPanel>
|
||||||
<views:ControllerInputView />
|
<TextBlock
|
||||||
</DataTemplate>
|
Margin="5,20,0,0"
|
||||||
<DataTemplate DataType="viewModels:KeyboardInputViewModel">
|
Text="{ext:Locale ControllerSettingsDisableDeviceForSaving}" />
|
||||||
<views:KeyboardInputView />
|
<Button
|
||||||
</DataTemplate>
|
MinWidth="0"
|
||||||
</ContentControl.DataTemplates>
|
Width="90"
|
||||||
|
Height="27"
|
||||||
|
Margin="5,10,0,0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Command="{Binding UnlinkDevice}">
|
||||||
|
<TextBlock
|
||||||
|
Text="{ext:Locale ControllerSettingsUnlink}"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
HorizontalAlignment="Center" />
|
||||||
|
</Button>
|
||||||
|
</StackPanel>
|
||||||
|
</ContentControl.Content>
|
||||||
</ContentControl>
|
</ContentControl>
|
||||||
|
<ContentControl Content="{Binding ConfigViewModel}" IsVisible="{Binding ShowSettings}">
|
||||||
|
<ContentControl.DataTemplates>
|
||||||
|
<DataTemplate DataType="viewModels:ControllerInputViewModel">
|
||||||
|
<views:ControllerInputView />
|
||||||
|
</DataTemplate>
|
||||||
|
<DataTemplate DataType="viewModels:KeyboardInputViewModel">
|
||||||
|
<views:KeyboardInputView />
|
||||||
|
</DataTemplate>
|
||||||
|
</ContentControl.DataTemplates>
|
||||||
|
</ContentControl>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
@@ -62,14 +63,23 @@ namespace Ryujinx.Ava.UI.Views.Input
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewModel.PlayerId = ViewModel.PlayerIdChoose;
|
|
||||||
|
|
||||||
ViewModel.IsModified = false;
|
ViewModel.IsModified = false;
|
||||||
}
|
ViewModel.PlayerId = ViewModel.PlayerIdChoose;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is FAComboBox faComboBox)
|
||||||
|
{
|
||||||
|
faComboBox.IsDropDownOpen = false;
|
||||||
|
ViewModel.IsModified = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
ViewModel.Dispose();
|
ViewModel.Dispose();
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ using Ryujinx.Ava.UI.Helpers;
|
|||||||
using Ryujinx.Ava.UI.ViewModels.Input;
|
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||||
using Ryujinx.Input;
|
using Ryujinx.Input;
|
||||||
using Ryujinx.Input.Assigner;
|
using Ryujinx.Input.Assigner;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
using Button = Ryujinx.Input.Button;
|
using Button = Ryujinx.Input.Button;
|
||||||
using Key = Ryujinx.Common.Configuration.Hid.Key;
|
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 shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
||||||
|
|
||||||
|
bool shouldRemoveBinding = e.GetCurrentPoint(this).Properties.IsRightButtonPressed;
|
||||||
|
|
||||||
|
if (shouldRemoveBinding)
|
||||||
|
{
|
||||||
|
DeleteBind();
|
||||||
|
}
|
||||||
|
|
||||||
_currentAssigner?.Cancel(shouldUnbind);
|
_currentAssigner?.Cancel(shouldUnbind);
|
||||||
|
|
||||||
PointerPressed -= MouseClick;
|
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)
|
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnDetachedFromVisualTree(e);
|
base.OnDetachedFromVisualTree(e);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using Ryujinx.Ava.UI.Windows;
|
|||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Ava.UI.Views.Dialog;
|
using Ryujinx.Ava.UI.Views.Misc;
|
||||||
using Ryujinx.Common;
|
using Ryujinx.Common;
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using Ryujinx.Common.Utilities;
|
using Ryujinx.Common.Utilities;
|
||||||
@@ -46,8 +46,8 @@ namespace Ryujinx.Ava.UI.Views.Main
|
|||||||
CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp);
|
CheatManagerMenuItem.Command = Commands.CreateSilentFail(OpenCheatManagerForCurrentApp);
|
||||||
InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes);
|
InstallFileTypesMenuItem.Command = Commands.Create(InstallFileTypes);
|
||||||
UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes);
|
UninstallFileTypesMenuItem.Command = Commands.Create(UninstallFileTypes);
|
||||||
XciTrimmerMenuItem.Command = Commands.Create(XciTrimmerView.Show);
|
XciTrimmerMenuItem.Command = Commands.Create(XCITrimmerWindow.Show);
|
||||||
AboutWindowMenuItem.Command = Commands.Create(AboutView.Show);
|
AboutWindowMenuItem.Command = Commands.Create(AboutWindow.Show);
|
||||||
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show());
|
CompatibilityListMenuItem.Command = Commands.Create(() => CompatibilityListWindow.Show());
|
||||||
|
|
||||||
UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand;
|
UpdateMenuItem.Command = MainWindowViewModel.UpdateCommand;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Avalonia;
|
using Avalonia;
|
||||||
|
using Avalonia.Controls;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
xmlns:ui="using:FluentAvalonia.UI.Controls"
|
xmlns:ui="using:FluentAvalonia.UI.Controls"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.ApplicationDataView"
|
x:Class="Ryujinx.Ava.UI.Views.Misc.ApplicationDataView"
|
||||||
x:DataType="viewModels:ApplicationDataViewModel">
|
x:DataType="viewModels:ApplicationDataViewModel">
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<Image Margin="0"
|
<Image Margin="0"
|
||||||
@@ -12,7 +12,7 @@ using Ryujinx.Ava.Systems.AppLibrary;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Views.Misc
|
||||||
{
|
{
|
||||||
public partial class ApplicationDataView : RyujinxControl<ApplicationDataViewModel>
|
public partial class ApplicationDataView : RyujinxControl<ApplicationDataViewModel>
|
||||||
{
|
{
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
xmlns:models="using:Ryujinx.Ava.Common.Models"
|
xmlns:models="using:Ryujinx.Ava.Common.Models"
|
||||||
xmlns:viewModels="using:Ryujinx.Ava.UI.ViewModels"
|
xmlns:viewModels="using:Ryujinx.Ava.UI.ViewModels"
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.DlcSelectView"
|
x:Class="Ryujinx.Ava.UI.Views.Misc.DlcSelectView"
|
||||||
x:DataType="viewModels:DlcSelectViewModel">
|
x:DataType="viewModels:DlcSelectViewModel">
|
||||||
<Grid RowDefinitions="*,Auto,*">
|
<Grid RowDefinitions="*,Auto,*">
|
||||||
<TextBlock
|
<TextBlock
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
using FluentAvalonia.UI.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Styling;
|
||||||
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Common.Models;
|
using Ryujinx.Ava.Common.Models;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
@@ -7,7 +9,7 @@ using Ryujinx.Ava.UI.ViewModels;
|
|||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Views.Misc
|
||||||
{
|
{
|
||||||
public partial class DlcSelectView : RyujinxControl<DlcSelectViewModel>
|
public partial class DlcSelectView : RyujinxControl<DlcSelectViewModel>
|
||||||
{
|
{
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
<TextBlock
|
<TextBlock
|
||||||
Foreground="{DynamicResource SecondaryTextColor}"
|
Foreground="{DynamicResource SecondaryTextColor}"
|
||||||
TextDecorations="Underline"
|
TextDecorations="Underline"
|
||||||
Text="Highly specific hacks & tricks to alleviate performance issues, crashing, or freezing. Can cause issues." />
|
Text="Highly specific hacks & tricks to alleviate performance issues, crashing, or freezing. Will cause issues." />
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Margin="0,10,0,0"
|
Margin="0,10,0,0"
|
||||||
Orientation="Horizontal"
|
Orientation="Horizontal"
|
||||||
@@ -43,18 +43,6 @@
|
|||||||
Text="Xenoblade Chronicles 2 Menu Softlock Fix" />
|
Text="Xenoblade Chronicles 2 Menu Softlock Fix" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Separator/>
|
<Separator/>
|
||||||
<StackPanel
|
|
||||||
Margin="0,10,0,0"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
ToolTip.Tip="{Binding DirtyHacks.NifmDisableIsAnyInternetRequestAcceptedTooltip}">
|
|
||||||
<CheckBox
|
|
||||||
Margin="0"
|
|
||||||
IsChecked="{Binding DirtyHacks.NifmDisableIsAnyInternetRequestAccepted}"/>
|
|
||||||
<TextBlock
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="Disable IsAnyInternetRequestAccepted" />
|
|
||||||
</StackPanel>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|||||||
@@ -3,19 +3,19 @@ using Avalonia.Controls.Primitives;
|
|||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Avalonia.LogicalTree;
|
using Avalonia.LogicalTree;
|
||||||
using Avalonia.Threading;
|
|
||||||
using Ryujinx.Ava.Input;
|
using Ryujinx.Ava.Input;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Input;
|
using Ryujinx.Input;
|
||||||
using Ryujinx.Input.Assigner;
|
using Ryujinx.Input.Assigner;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
using Button = Ryujinx.Input.Button;
|
using Button = Ryujinx.Input.Button;
|
||||||
using Key = Ryujinx.Common.Configuration.Hid.Key;
|
using Key = Ryujinx.Common.Configuration.Hid.Key;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Settings
|
namespace Ryujinx.Ava.UI.Views.Settings
|
||||||
{
|
{
|
||||||
public partial class SettingsHotkeysView : RyujinxControl<SettingsViewModel>
|
public partial class SettingsHotkeysView : UserControl
|
||||||
{
|
{
|
||||||
private ButtonKeyAssigner _currentAssigner;
|
private ButtonKeyAssigner _currentAssigner;
|
||||||
private readonly IGamepadDriver _avaloniaKeyboardDriver;
|
private readonly IGamepadDriver _avaloniaKeyboardDriver;
|
||||||
@@ -48,12 +48,47 @@ namespace Ryujinx.Ava.UI.Views.Settings
|
|||||||
private void MouseClick(object sender, PointerPressedEventArgs e)
|
private void MouseClick(object sender, PointerPressedEventArgs e)
|
||||||
{
|
{
|
||||||
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
bool shouldUnbind = e.GetCurrentPoint(this).Properties.IsMiddleButtonPressed;
|
||||||
|
bool shouldRemoveBinding = e.GetCurrentPoint(this).Properties.IsRightButtonPressed;
|
||||||
|
|
||||||
|
if (shouldRemoveBinding)
|
||||||
|
{
|
||||||
|
DeleteBind();
|
||||||
|
}
|
||||||
|
|
||||||
_currentAssigner?.Cancel(shouldUnbind);
|
_currentAssigner?.Cancel(shouldUnbind);
|
||||||
|
|
||||||
PointerPressed -= MouseClick;
|
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)
|
private void Button_IsCheckedChanged(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (sender is ToggleButton button)
|
if (sender is ToggleButton button)
|
||||||
@@ -80,49 +115,45 @@ namespace Ryujinx.Ava.UI.Views.Settings
|
|||||||
{
|
{
|
||||||
if (e.ButtonValue.HasValue)
|
if (e.ButtonValue.HasValue)
|
||||||
{
|
{
|
||||||
|
SettingsViewModel viewModel = (DataContext) as SettingsViewModel;
|
||||||
Button buttonValue = e.ButtonValue.Value;
|
Button buttonValue = e.ButtonValue.Value;
|
||||||
|
|
||||||
Dispatcher.UIThread.Post(() =>
|
switch (button.Name)
|
||||||
{
|
{
|
||||||
switch (button.Name)
|
case "ToggleVSyncMode":
|
||||||
{
|
viewModel.KeyboardHotkey.ToggleVSyncMode = buttonValue.AsHidType<Key>();
|
||||||
case "ToggleVSyncMode":
|
break;
|
||||||
ViewModel.KeyboardHotkey.ToggleVSyncMode = buttonValue.AsHidType<Key>();
|
case "Screenshot":
|
||||||
break;
|
viewModel.KeyboardHotkey.Screenshot = buttonValue.AsHidType<Key>();
|
||||||
case "Screenshot":
|
break;
|
||||||
ViewModel.KeyboardHotkey.Screenshot = buttonValue.AsHidType<Key>();
|
case "ShowUI":
|
||||||
break;
|
viewModel.KeyboardHotkey.ShowUI = buttonValue.AsHidType<Key>();
|
||||||
case "ShowUI":
|
break;
|
||||||
ViewModel.KeyboardHotkey.ShowUI = buttonValue.AsHidType<Key>();
|
case "Pause":
|
||||||
break;
|
viewModel.KeyboardHotkey.Pause = buttonValue.AsHidType<Key>();
|
||||||
case "Pause":
|
break;
|
||||||
ViewModel.KeyboardHotkey.Pause = buttonValue.AsHidType<Key>();
|
case "ToggleMute":
|
||||||
break;
|
viewModel.KeyboardHotkey.ToggleMute = buttonValue.AsHidType<Key>();
|
||||||
case "ToggleMute":
|
break;
|
||||||
ViewModel.KeyboardHotkey.ToggleMute = buttonValue.AsHidType<Key>();
|
case "ResScaleUp":
|
||||||
break;
|
viewModel.KeyboardHotkey.ResScaleUp = buttonValue.AsHidType<Key>();
|
||||||
case "ResScaleUp":
|
break;
|
||||||
ViewModel.KeyboardHotkey.ResScaleUp = buttonValue.AsHidType<Key>();
|
case "ResScaleDown":
|
||||||
break;
|
viewModel.KeyboardHotkey.ResScaleDown = buttonValue.AsHidType<Key>();
|
||||||
case "ResScaleDown":
|
break;
|
||||||
ViewModel.KeyboardHotkey.ResScaleDown = buttonValue.AsHidType<Key>();
|
case "VolumeUp":
|
||||||
break;
|
viewModel.KeyboardHotkey.VolumeUp = buttonValue.AsHidType<Key>();
|
||||||
case "VolumeUp":
|
break;
|
||||||
ViewModel.KeyboardHotkey.VolumeUp = buttonValue.AsHidType<Key>();
|
case "VolumeDown":
|
||||||
break;
|
viewModel.KeyboardHotkey.VolumeDown = buttonValue.AsHidType<Key>();
|
||||||
case "VolumeDown":
|
break;
|
||||||
ViewModel.KeyboardHotkey.VolumeDown = buttonValue.AsHidType<Key>();
|
case "CustomVSyncIntervalIncrement":
|
||||||
break;
|
viewModel.KeyboardHotkey.CustomVSyncIntervalIncrement = buttonValue.AsHidType<Key>();
|
||||||
case "CustomVSyncIntervalIncrement":
|
break;
|
||||||
ViewModel.KeyboardHotkey.CustomVSyncIntervalIncrement =
|
case "CustomVSyncIntervalDecrement":
|
||||||
buttonValue.AsHidType<Key>();
|
viewModel.KeyboardHotkey.CustomVSyncIntervalDecrement = buttonValue.AsHidType<Key>();
|
||||||
break;
|
break;
|
||||||
case "CustomVSyncIntervalDecrement":
|
}
|
||||||
ViewModel.KeyboardHotkey.CustomVSyncIntervalDecrement =
|
|
||||||
buttonValue.AsHidType<Key>();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Settings
|
namespace Ryujinx.Ava.UI.Views.Settings
|
||||||
{
|
{
|
||||||
public partial class SettingsNetworkView : RyujinxControl<SettingsViewModel>
|
public partial class SettingsNetworkView : UserControl
|
||||||
{
|
{
|
||||||
private readonly Random _random;
|
private readonly Random _random;
|
||||||
|
|
||||||
|
public SettingsViewModel ViewModel;
|
||||||
|
|
||||||
public SettingsNetworkView()
|
public SettingsNetworkView()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using TimeZone = Ryujinx.Ava.UI.Models.TimeZone;
|
using TimeZone = Ryujinx.Ava.UI.Models.TimeZone;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Settings
|
namespace Ryujinx.Ava.UI.Views.Settings
|
||||||
{
|
{
|
||||||
public partial class SettingsSystemView : RyujinxControl<SettingsViewModel>
|
public partial class SettingsSystemView : UserControl
|
||||||
{
|
{
|
||||||
|
public SettingsViewModel ViewModel;
|
||||||
|
|
||||||
public SettingsSystemView()
|
public SettingsSystemView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
|
xmlns:ext="clr-namespace:Ryujinx.Ava.Common.Markup"
|
||||||
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
xmlns:viewModels="clr-namespace:Ryujinx.Ava.UI.ViewModels"
|
||||||
|
xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
x:DataType="viewModels:SettingsViewModel">
|
x:DataType="viewModels:SettingsViewModel">
|
||||||
<Design.DataContext>
|
<Design.DataContext>
|
||||||
@@ -18,265 +19,246 @@
|
|||||||
HorizontalScrollBarVisibility="Disabled"
|
HorizontalScrollBarVisibility="Disabled"
|
||||||
VerticalScrollBarVisibility="Auto">
|
VerticalScrollBarVisibility="Auto">
|
||||||
<Border Classes="settings">
|
<Border Classes="settings">
|
||||||
<Grid ColumnDefinitions="Auto,Auto,*" HorizontalAlignment="Stretch">
|
<StackPanel
|
||||||
|
Margin="10"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Orientation="Vertical"
|
||||||
|
Spacing="10">
|
||||||
|
<TextBlock Classes="h1" Text="{ext:Locale SettingsTabGeneralGeneral}" />
|
||||||
|
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
|
||||||
|
<CheckBox IsChecked="{Binding EnableDiscordIntegration}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center"
|
||||||
|
ToolTip.Tip="{ext:Locale ToggleDiscordTooltip}"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralEnableDiscordRichPresence}" />
|
||||||
|
</StackPanel>
|
||||||
|
</CheckBox>
|
||||||
|
<CheckBox
|
||||||
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
IsChecked="{Binding ShowConfirmExit}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralShowConfirmExitDialog}" />
|
||||||
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
||||||
|
</StackPanel>
|
||||||
|
</CheckBox>
|
||||||
|
<CheckBox
|
||||||
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
IsChecked="{Binding RememberWindowState}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralRememberWindowState}" />
|
||||||
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
||||||
|
</StackPanel>
|
||||||
|
</CheckBox>
|
||||||
|
<CheckBox
|
||||||
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
IsChecked="{Binding ShowOldUI}"
|
||||||
|
ToolTip.Tip="{ext:Locale SettingsTabGeneralShowOldUIToolTip}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralShowOldUI}" />
|
||||||
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
||||||
|
</StackPanel>
|
||||||
|
</CheckBox>
|
||||||
|
<StackPanel
|
||||||
|
Margin="0, 15, 0, 0"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralFocusLossType}"
|
||||||
|
Width="150" />
|
||||||
|
<ComboBox SelectedIndex="{Binding FocusLostActionType}"
|
||||||
|
HorizontalContentAlignment="Left"
|
||||||
|
MinWidth="100">
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeDoNothing}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeBlockInput}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeMuteAudio}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeBlockInputAndMuteAudio}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypePauseEmulation}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
</ComboBox>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel
|
||||||
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
Margin="0, 15, 0, 0"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunch}"
|
||||||
|
Width="150" />
|
||||||
|
<ComboBox SelectedIndex="{Binding UpdateCheckerType}"
|
||||||
|
HorizontalContentAlignment="Left"
|
||||||
|
MinWidth="100">
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunchOff}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunchPromptAtStartup}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunchBackground}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
</ComboBox>
|
||||||
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel
|
||||||
|
Margin="0, 15, 0, 0"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<TextBlock VerticalAlignment="Center"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralHideCursor}"
|
||||||
|
Width="150" />
|
||||||
|
<ComboBox SelectedIndex="{Binding HideCursor}"
|
||||||
|
HorizontalContentAlignment="Left"
|
||||||
|
MinWidth="100">
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralHideCursorNever}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralHideCursorOnIdle}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralHideCursorAlways}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
</ComboBox>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel
|
||||||
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
Margin="0, 15, 0, 10"
|
||||||
|
Orientation="Horizontal">
|
||||||
|
<TextBlock
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralTheme}"
|
||||||
|
Width="150" />
|
||||||
|
<ComboBox SelectedIndex="{Binding BaseStyleIndex}"
|
||||||
|
HorizontalContentAlignment="Left"
|
||||||
|
MinWidth="100">
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralThemeAuto}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralThemeLight}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
<ComboBoxItem>
|
||||||
|
<TextBlock Text="{ext:Locale SettingsTabGeneralThemeDark}" />
|
||||||
|
</ComboBoxItem>
|
||||||
|
</ComboBox>
|
||||||
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
<Separator Height="1" />
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<TextBlock Classes="h1" Text="{ext:Locale SettingsTabGeneralGameDirectories}" />
|
||||||
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}"/>
|
||||||
|
</StackPanel>
|
||||||
<StackPanel
|
<StackPanel
|
||||||
Grid.Column="0"
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
Margin="10"
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
Margin="10,0,0,0"
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
Orientation="Vertical"
|
Orientation="Vertical"
|
||||||
Spacing="10">
|
Spacing="10">
|
||||||
<TextBlock Classes="h1" Text="{ext:Locale SettingsTabGeneralGeneral}" />
|
<ListBox
|
||||||
<StackPanel Margin="10,0,0,0" Orientation="Vertical">
|
Name="GameDirsList"
|
||||||
<CheckBox IsChecked="{Binding EnableDiscordIntegration}">
|
MinHeight="120"
|
||||||
<StackPanel Orientation="Horizontal">
|
ItemsSource="{Binding GameDirectories}">
|
||||||
<TextBlock VerticalAlignment="Center"
|
<ListBox.Styles>
|
||||||
ToolTip.Tip="{ext:Locale ToggleDiscordTooltip}"
|
<Style Selector="ListBoxItem">
|
||||||
Text="{ext:Locale SettingsTabGeneralEnableDiscordRichPresence}" />
|
<Setter Property="Padding" Value="10" />
|
||||||
</StackPanel>
|
<Setter Property="Background" Value="{DynamicResource ListBoxBackground}" />
|
||||||
</CheckBox>
|
</Style>
|
||||||
<CheckBox
|
</ListBox.Styles>
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
</ListBox>
|
||||||
Opacity="{Binding PanelOpacity}"
|
<Grid HorizontalAlignment="Stretch" ColumnDefinitions="*,Auto,Auto">
|
||||||
IsChecked="{Binding ShowConfirmExit}">
|
<TextBox
|
||||||
<StackPanel Orientation="Horizontal">
|
Name="GameDirPathBox"
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralShowConfirmExitDialog}" />
|
Margin="0"
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
ToolTip.Tip="{ext:Locale AddGameDirBoxTooltip}"
|
||||||
</StackPanel>
|
VerticalAlignment="Stretch" />
|
||||||
</CheckBox>
|
<Button
|
||||||
<CheckBox
|
Name="AddGameDirButton"
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
Grid.Column="1"
|
||||||
Opacity="{Binding PanelOpacity}"
|
MinWidth="90"
|
||||||
IsChecked="{Binding RememberWindowState}">
|
Margin="10,0,0,0"
|
||||||
<StackPanel Orientation="Horizontal">
|
ToolTip.Tip="{ext:Locale AddGameDirTooltip}">
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralRememberWindowState}" />
|
<TextBlock HorizontalAlignment="Center"
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
Text="{ext:Locale SettingsTabGeneralAdd}" />
|
||||||
</StackPanel>
|
</Button>
|
||||||
</CheckBox>
|
<Button
|
||||||
<CheckBox
|
Name="RemoveGameDirButton"
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
Grid.Column="2"
|
||||||
Opacity="{Binding PanelOpacity}"
|
MinWidth="90"
|
||||||
IsChecked="{Binding ShowOldUI}"
|
Margin="10,0,0,0"
|
||||||
ToolTip.Tip="{ext:Locale SettingsTabGeneralShowOldUIToolTip}">
|
ToolTip.Tip="{ext:Locale RemoveGameDirTooltip}"
|
||||||
<StackPanel Orientation="Horizontal">
|
Click="RemoveGameDirButton_OnClick">
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralShowOldUI}" />
|
<TextBlock HorizontalAlignment="Center"
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
Text="{ext:Locale SettingsTabGeneralRemove}" />
|
||||||
</StackPanel>
|
</Button>
|
||||||
</CheckBox>
|
</Grid>
|
||||||
<StackPanel
|
|
||||||
Margin="0, 15, 0, 0"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
<TextBlock VerticalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralFocusLossType}"
|
|
||||||
Width="150" />
|
|
||||||
<ComboBox SelectedIndex="{Binding FocusLostActionType}"
|
|
||||||
HorizontalContentAlignment="Left"
|
|
||||||
MinWidth="100">
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeDoNothing}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeBlockInput}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypeMuteAudio}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock
|
|
||||||
Text="{ext:Locale SettingsTabGeneralFocusLossTypeBlockInputAndMuteAudio}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralFocusLossTypePauseEmulation}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
</ComboBox>
|
|
||||||
</StackPanel>
|
|
||||||
<StackPanel
|
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
|
||||||
Opacity="{Binding PanelOpacity}"
|
|
||||||
Margin="0, 15, 0, 0"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
<TextBlock VerticalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunch}"
|
|
||||||
Width="150" />
|
|
||||||
<ComboBox SelectedIndex="{Binding UpdateCheckerType}"
|
|
||||||
HorizontalContentAlignment="Left"
|
|
||||||
MinWidth="100">
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunchOff}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock
|
|
||||||
Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunchPromptAtStartup}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralCheckUpdatesOnLaunchBackground}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
</ComboBox>
|
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
|
||||||
</StackPanel>
|
|
||||||
<StackPanel
|
|
||||||
Margin="0, 15, 0, 0"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
<TextBlock VerticalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralHideCursor}"
|
|
||||||
Width="150" />
|
|
||||||
<ComboBox SelectedIndex="{Binding HideCursor}"
|
|
||||||
HorizontalContentAlignment="Left"
|
|
||||||
MinWidth="100">
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralHideCursorNever}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralHideCursorOnIdle}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralHideCursorAlways}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
</ComboBox>
|
|
||||||
</StackPanel>
|
|
||||||
<StackPanel
|
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
|
||||||
Opacity="{Binding PanelOpacity}"
|
|
||||||
Margin="0, 15, 0, 10"
|
|
||||||
Orientation="Horizontal">
|
|
||||||
<TextBlock
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralTheme}"
|
|
||||||
Width="150" />
|
|
||||||
<ComboBox SelectedIndex="{Binding BaseStyleIndex}"
|
|
||||||
HorizontalContentAlignment="Left"
|
|
||||||
MinWidth="100">
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralThemeAuto}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralThemeLight}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
<ComboBoxItem>
|
|
||||||
<TextBlock Text="{ext:Locale SettingsTabGeneralThemeDark}" />
|
|
||||||
</ComboBoxItem>
|
|
||||||
</ComboBox>
|
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
|
||||||
</StackPanel>
|
|
||||||
</StackPanel>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<Border Grid.Column="1"
|
<Separator Height="1" />
|
||||||
HorizontalAlignment="Center"
|
<StackPanel Orientation="Vertical" Spacing="5">
|
||||||
VerticalAlignment="Top"
|
|
||||||
Margin="10, 10, 10, 0"
|
|
||||||
Height="405"
|
|
||||||
BorderBrush="Gray"
|
|
||||||
Background="Gray"
|
|
||||||
Width="1" />
|
|
||||||
<StackPanel
|
|
||||||
Margin="10"
|
|
||||||
Spacing="10"
|
|
||||||
Grid.Column="2"
|
|
||||||
Orientation="Vertical" HorizontalAlignment="Stretch">
|
|
||||||
<StackPanel Orientation="Horizontal">
|
<StackPanel Orientation="Horizontal">
|
||||||
<TextBlock Classes="h1" Text="{ext:Locale SettingsTabGeneralGameDirectories}" />
|
<TextBlock Classes="h1" Text="{ext:Locale SettingsTabGeneralAutoloadDirectories}" />
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}"/>
|
||||||
</StackPanel>
|
|
||||||
<StackPanel
|
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
|
||||||
Opacity="{Binding PanelOpacity}"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
Orientation="Vertical"
|
|
||||||
Spacing="10">
|
|
||||||
<ListBox
|
|
||||||
Name="GameDirsList"
|
|
||||||
MinHeight="120"
|
|
||||||
ItemsSource="{Binding GameDirectories}">
|
|
||||||
<ListBox.Styles>
|
|
||||||
<Style Selector="ListBoxItem">
|
|
||||||
<Setter Property="Padding" Value="10" />
|
|
||||||
<Setter Property="Background" Value="{DynamicResource ListBoxBackground}" />
|
|
||||||
</Style>
|
|
||||||
</ListBox.Styles>
|
|
||||||
</ListBox>
|
|
||||||
<Grid HorizontalAlignment="Stretch" ColumnDefinitions="*,Auto,Auto">
|
|
||||||
<TextBox
|
|
||||||
Name="GameDirPathBox"
|
|
||||||
Margin="0"
|
|
||||||
ToolTip.Tip="{ext:Locale AddGameDirBoxTooltip}"
|
|
||||||
VerticalAlignment="Stretch" />
|
|
||||||
<Button
|
|
||||||
Name="AddGameDirButton"
|
|
||||||
Grid.Column="1"
|
|
||||||
MinWidth="90"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
ToolTip.Tip="{ext:Locale AddGameDirTooltip}">
|
|
||||||
<TextBlock HorizontalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralAdd}" />
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
Name="RemoveGameDirButton"
|
|
||||||
Grid.Column="2"
|
|
||||||
MinWidth="90"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
ToolTip.Tip="{ext:Locale RemoveGameDirTooltip}"
|
|
||||||
Click="RemoveGameDirButton_OnClick">
|
|
||||||
<TextBlock HorizontalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralRemove}" />
|
|
||||||
</Button>
|
|
||||||
</Grid>
|
|
||||||
</StackPanel>
|
|
||||||
<Separator Height="1" />
|
|
||||||
<StackPanel Orientation="Vertical" Spacing="5">
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<TextBlock Classes="h1" Text="{ext:Locale SettingsTabGeneralAutoloadDirectories}" />
|
|
||||||
<TextBlock Classes="globalConfigMarker" IsVisible="{Binding IsGameTitleNotNull}" />
|
|
||||||
</StackPanel>
|
|
||||||
<TextBlock Foreground="{DynamicResource SecondaryTextColor}"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralAutoloadNote}" />
|
|
||||||
</StackPanel>
|
|
||||||
<StackPanel
|
|
||||||
IsEnabled="{Binding !IsGameTitleNotNull}"
|
|
||||||
Opacity="{Binding PanelOpacity}"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
HorizontalAlignment="Stretch"
|
|
||||||
Orientation="Vertical"
|
|
||||||
Spacing="10">
|
|
||||||
<ListBox
|
|
||||||
Name="AutoloadDirsList"
|
|
||||||
MinHeight="100"
|
|
||||||
ItemsSource="{Binding AutoloadDirectories}">
|
|
||||||
<ListBox.Styles>
|
|
||||||
<Style Selector="ListBoxItem">
|
|
||||||
<Setter Property="Padding" Value="10" />
|
|
||||||
<Setter Property="Background" Value="{DynamicResource ListBoxBackground}" />
|
|
||||||
</Style>
|
|
||||||
</ListBox.Styles>
|
|
||||||
</ListBox>
|
|
||||||
<Grid HorizontalAlignment="Stretch" ColumnDefinitions="*,Auto,Auto">
|
|
||||||
<TextBox
|
|
||||||
Name="AutoloadDirPathBox"
|
|
||||||
Margin="0"
|
|
||||||
ToolTip.Tip="{ext:Locale AddAutoloadDirBoxTooltip}"
|
|
||||||
VerticalAlignment="Stretch" />
|
|
||||||
<Button
|
|
||||||
Name="AddAutoloadDirButton"
|
|
||||||
Grid.Column="1"
|
|
||||||
MinWidth="90"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
ToolTip.Tip="{ext:Locale AddAutoloadDirTooltip}">
|
|
||||||
<TextBlock HorizontalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralAdd}" />
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
Name="RemoveAutoloadDirButton"
|
|
||||||
Grid.Column="2"
|
|
||||||
MinWidth="90"
|
|
||||||
Margin="10,0,0,0"
|
|
||||||
ToolTip.Tip="{ext:Locale RemoveAutoloadDirTooltip}"
|
|
||||||
Click="RemoveAutoloadDirButton_OnClick">
|
|
||||||
<TextBlock HorizontalAlignment="Center"
|
|
||||||
Text="{ext:Locale SettingsTabGeneralRemove}" />
|
|
||||||
</Button>
|
|
||||||
</Grid>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
<TextBlock Foreground="{DynamicResource SecondaryTextColor}" Text="{ext:Locale SettingsTabGeneralAutoloadNote}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
<StackPanel
|
||||||
|
IsEnabled="{Binding !IsGameTitleNotNull}"
|
||||||
|
Opacity="{Binding PanelOpacity}"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
HorizontalAlignment="Stretch"
|
||||||
|
Orientation="Vertical"
|
||||||
|
Spacing="10">
|
||||||
|
<ListBox
|
||||||
|
Name="AutoloadDirsList"
|
||||||
|
MinHeight="100"
|
||||||
|
ItemsSource="{Binding AutoloadDirectories}">
|
||||||
|
<ListBox.Styles>
|
||||||
|
<Style Selector="ListBoxItem">
|
||||||
|
<Setter Property="Padding" Value="10" />
|
||||||
|
<Setter Property="Background" Value="{DynamicResource ListBoxBackground}" />
|
||||||
|
</Style>
|
||||||
|
</ListBox.Styles>
|
||||||
|
</ListBox>
|
||||||
|
<Grid HorizontalAlignment="Stretch" ColumnDefinitions="*,Auto,Auto">
|
||||||
|
<TextBox
|
||||||
|
Name="AutoloadDirPathBox"
|
||||||
|
Margin="0"
|
||||||
|
ToolTip.Tip="{ext:Locale AddAutoloadDirBoxTooltip}"
|
||||||
|
VerticalAlignment="Stretch" />
|
||||||
|
<Button
|
||||||
|
Name="AddAutoloadDirButton"
|
||||||
|
Grid.Column="1"
|
||||||
|
MinWidth="90"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
ToolTip.Tip="{ext:Locale AddAutoloadDirTooltip}">
|
||||||
|
<TextBlock HorizontalAlignment="Center"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralAdd}" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
Name="RemoveAutoloadDirButton"
|
||||||
|
Grid.Column="2"
|
||||||
|
MinWidth="90"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
ToolTip.Tip="{ext:Locale RemoveAutoloadDirTooltip}"
|
||||||
|
Click="RemoveAutoloadDirButton_OnClick">
|
||||||
|
<TextBlock HorizontalAlignment="Center"
|
||||||
|
Text="{ext:Locale SettingsTabGeneralRemove}" />
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
</Border>
|
</Border>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</UserControl>
|
</UserControl>
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ using Avalonia.Controls;
|
|||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Avalonia.Platform.Storage;
|
using Avalonia.Platform.Storage;
|
||||||
using Gommon;
|
using Gommon;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Ava.Utilities;
|
using Ryujinx.Ava.Utilities;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -14,18 +14,20 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Settings
|
namespace Ryujinx.Ava.UI.Views.Settings
|
||||||
{
|
{
|
||||||
public partial class SettingsUiView : RyujinxControl<SettingsViewModel>
|
public partial class SettingsUiView : UserControl
|
||||||
{
|
{
|
||||||
|
public SettingsViewModel ViewModel;
|
||||||
|
|
||||||
public SettingsUiView()
|
public SettingsUiView()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
AddGameDirButton.Command =
|
AddGameDirButton.Command =
|
||||||
Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories));
|
Commands.Create(() => AddDirButton(GameDirPathBox, ViewModel.GameDirectories, true));
|
||||||
AddAutoloadDirButton.Command =
|
AddAutoloadDirButton.Command =
|
||||||
Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories));
|
Commands.Create(() => AddDirButton(AutoloadDirPathBox, ViewModel.AutoloadDirectories, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AddDirButton(TextBox addDirBox, AvaloniaList<string> directories)
|
private async Task AddDirButton(TextBox addDirBox, AvaloniaList<string> directories, bool isGameList)
|
||||||
{
|
{
|
||||||
string path = addDirBox.Text;
|
string path = addDirBox.Text;
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Ryujinx.Ava.UI.Controls;
|
|||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.Models;
|
using Ryujinx.Ava.UI.Models;
|
||||||
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
using Ryujinx.HLE.HOS.Services.Account.Acc;
|
||||||
|
using System;
|
||||||
using UserProfile = Ryujinx.Ava.UI.Models.UserProfile;
|
using UserProfile = Ryujinx.Ava.UI.Models.UserProfile;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.User
|
namespace Ryujinx.Ava.UI.Views.User
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using FluentAvalonia.UI.Navigation;
|
using FluentAvalonia.UI.Navigation;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<UserControl
|
<UserControl
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.AboutView"
|
x:Class="Ryujinx.Ava.UI.Windows.AboutWindow"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
using Avalonia.Interactivity;
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Layout;
|
||||||
|
using Avalonia.Styling;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
@@ -11,11 +13,11 @@ using Ryujinx.Common.Helper;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Button = Avalonia.Controls.Button;
|
using Button = Avalonia.Controls.Button;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class AboutView : RyujinxControl<AboutWindowViewModel>
|
public partial class AboutWindow : RyujinxControl<AboutWindowViewModel>
|
||||||
{
|
{
|
||||||
public AboutView()
|
public AboutWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
|
||||||
@@ -32,7 +34,7 @@ namespace Ryujinx.Ava.UI.Views.Dialog
|
|||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
SecondaryButtonText = string.Empty,
|
SecondaryButtonText = string.Empty,
|
||||||
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
|
CloseButtonText = LocaleManager.Instance[LocaleKeys.UserProfilesClose],
|
||||||
Content = new AboutView { ViewModel = viewModel }
|
Content = new AboutWindow { ViewModel = viewModel }
|
||||||
};
|
};
|
||||||
|
|
||||||
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
|
await ContentDialogHelper.ShowAsync(contentDialog.ApplyStyles());
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
using Avalonia.Collections;
|
using Avalonia.Collections;
|
||||||
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.UI.Models;
|
using Ryujinx.Ava.UI.Models;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.HLE.FileSystem;
|
using Ryujinx.HLE.FileSystem;
|
||||||
using Ryujinx.HLE.HOS;
|
using Ryujinx.HLE.HOS;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
<DataTemplate DataType="{x:Type systems:CompatibilityEntry}">
|
<DataTemplate DataType="{x:Type systems:CompatibilityEntry}">
|
||||||
<Grid MinWidth="800"
|
<Grid MinWidth="800"
|
||||||
Margin="10"
|
Margin="10"
|
||||||
ColumnDefinitions="Auto,Auto,Auto,*"
|
ColumnDefinitions="*,Auto,Auto,*"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
ToolTip.Tip="{Binding LocalizedLastUpdated}">
|
ToolTip.Tip="{Binding LocalizedLastUpdated}">
|
||||||
<TextBlock Grid.Column="0"
|
<TextBlock Grid.Column="0"
|
||||||
|
|||||||
@@ -1,24 +1,25 @@
|
|||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Styling;
|
||||||
|
using FluentAvalonia.UI.Controls;
|
||||||
|
using FluentAvalonia.UI.Windowing;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
|
using Ryujinx.Ava.UI.Windows;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Windows
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class CompatibilityListWindow : StyleableAppWindow
|
public partial class CompatibilityListWindow : StyleableAppWindow
|
||||||
{
|
{
|
||||||
public static async Task Show(string titleId = null)
|
public static Task Show(string titleId = null) =>
|
||||||
{
|
ShowAsync(new CompatibilityListWindow
|
||||||
using CompatibilityViewModel compatWindow = new(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary);
|
|
||||||
|
|
||||||
await ShowAsync(new CompatibilityListWindow
|
|
||||||
{
|
{
|
||||||
DataContext = compatWindow,
|
DataContext = new CompatibilityViewModel(RyujinxApp.MainWindow.ViewModel.ApplicationLibrary),
|
||||||
SearchBoxFlush = { Text = titleId ?? string.Empty },
|
SearchBoxFlush = { Text = titleId ?? string.Empty },
|
||||||
SearchBoxNormal = { Text = titleId ?? string.Empty }
|
SearchBoxNormal = { Text = titleId ?? string.Empty }
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
public CompatibilityListWindow() : base(useCustomTitleBar: true, 37)
|
public CompatibilityListWindow() : base(useCustomTitleBar: true, 37)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<UserControl
|
<UserControl
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.DownloadableContentManagerView"
|
x:Class="Ryujinx.Ava.UI.Windows.DownloadableContentManagerWindow"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@@ -6,16 +6,26 @@ using Ryujinx.Ava.Common.Locale;
|
|||||||
using Ryujinx.Ava.Common.Models;
|
using Ryujinx.Ava.Common.Models;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class DownloadableContentManagerView : RyujinxControl<DownloadableContentManagerViewModel>
|
public partial class DownloadableContentManagerWindow : UserControl
|
||||||
{
|
{
|
||||||
public DownloadableContentManagerView()
|
public DownloadableContentManagerViewModel ViewModel;
|
||||||
|
|
||||||
|
public DownloadableContentManagerWindow()
|
||||||
{
|
{
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DownloadableContentManagerWindow(ApplicationLibrary applicationLibrary, ApplicationData applicationData)
|
||||||
|
{
|
||||||
|
DataContext = ViewModel = new DownloadableContentManagerViewModel(applicationLibrary, applicationData);
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,11 +36,8 @@ namespace Ryujinx.Ava.UI.Views.Dialog
|
|||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
SecondaryButtonText = string.Empty,
|
SecondaryButtonText = string.Empty,
|
||||||
CloseButtonText = string.Empty,
|
CloseButtonText = string.Empty,
|
||||||
|
Content = new DownloadableContentManagerWindow(applicationLibrary, applicationData),
|
||||||
Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], applicationData.Name, applicationData.IdBaseString),
|
Title = string.Format(LocaleManager.Instance[LocaleKeys.DlcWindowTitle], applicationData.Name, applicationData.IdBaseString),
|
||||||
Content = new DownloadableContentManagerView
|
|
||||||
{
|
|
||||||
ViewModel = new DownloadableContentManagerViewModel(applicationLibrary, applicationData)
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
|
Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common"
|
xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common"
|
||||||
Width="1100"
|
Width="1100"
|
||||||
Height="910"
|
Height="910"
|
||||||
MinWidth="1037"
|
MinWidth="800"
|
||||||
MinHeight="480"
|
MinHeight="480"
|
||||||
WindowStartupLocation="CenterOwner"
|
WindowStartupLocation="CenterOwner"
|
||||||
x:DataType="viewModels:SettingsViewModel"
|
x:DataType="viewModels:SettingsViewModel"
|
||||||
|
|||||||
@@ -1,9 +1,25 @@
|
|||||||
|
using Avalonia;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Controls.Shapes;
|
||||||
|
using Avalonia.Input;
|
||||||
|
using Avalonia.Media.Imaging;
|
||||||
|
using FluentAvalonia.Core;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
|
using Projektanker.Icons.Avalonia;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
|
using Ryujinx.Ava.UI.Models;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
|
using Ryujinx.Ava.UI.ViewModels.Input;
|
||||||
|
using Ryujinx.Ava.Utilities;
|
||||||
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
|
using Ryujinx.Common.Configuration;
|
||||||
|
using Ryujinx.HLE.FileSystem;
|
||||||
|
using Ryujinx.HLE.HOS.SystemState;
|
||||||
|
using Ryujinx.Input;
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Key = Avalonia.Input.Key;
|
||||||
|
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Windows
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ using SkiaSharp;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Helpers
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public static class IconColorPicker
|
static class IconColorPicker
|
||||||
{
|
{
|
||||||
private const int ColorsPerLine = 64;
|
private const int ColorsPerLine = 64;
|
||||||
private const int TotalColors = ColorsPerLine * ColorsPerLine;
|
private const int TotalColors = ColorsPerLine * ColorsPerLine;
|
||||||
@@ -7,12 +7,13 @@ using Avalonia.Platform;
|
|||||||
using Avalonia.Threading;
|
using Avalonia.Threading;
|
||||||
using DynamicData;
|
using DynamicData;
|
||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
|
using FluentAvalonia.UI.Windowing;
|
||||||
using Gommon;
|
using Gommon;
|
||||||
using LibHac.Ns;
|
using LibHac.Ns;
|
||||||
|
using LibHac.Tools.FsSystem;
|
||||||
using Ryujinx.Ava.Common;
|
using Ryujinx.Ava.Common;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Input;
|
using Ryujinx.Ava.Input;
|
||||||
using Ryujinx.Ava.Systems;
|
|
||||||
using Ryujinx.Ava.UI.Applet;
|
using Ryujinx.Ava.UI.Applet;
|
||||||
using Ryujinx.Ava.UI.Helpers;
|
using Ryujinx.Ava.UI.Helpers;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
Width="500"
|
Width="500"
|
||||||
Height="380"
|
Height="380"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.ModManagerView"
|
x:Class="Ryujinx.Ava.UI.Windows.ModManagerWindow"
|
||||||
x:CompileBindings="True"
|
x:CompileBindings="True"
|
||||||
x:DataType="viewModels:ModManagerViewModel"
|
x:DataType="viewModels:ModManagerViewModel"
|
||||||
Focusable="True">
|
Focusable="True">
|
||||||
@@ -7,17 +7,27 @@ using Ryujinx.Ava.UI.Helpers;
|
|||||||
using Ryujinx.Ava.UI.Models;
|
using Ryujinx.Ava.UI.Models;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Button = Avalonia.Controls.Button;
|
using Button = Avalonia.Controls.Button;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class ModManagerView : RyujinxControl<ModManagerViewModel>
|
public partial class ModManagerWindow : UserControl
|
||||||
{
|
{
|
||||||
public ModManagerView()
|
public readonly ModManagerViewModel ViewModel;
|
||||||
|
|
||||||
|
public ModManagerWindow()
|
||||||
{
|
{
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ModManagerWindow(ulong titleId, ulong titleIdBase, ApplicationLibrary applicationLibrary)
|
||||||
|
{
|
||||||
|
DataContext = ViewModel = new ModManagerViewModel(titleId, titleIdBase, applicationLibrary);
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,10 +38,7 @@ namespace Ryujinx.Ava.UI.Views.Dialog
|
|||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
SecondaryButtonText = string.Empty,
|
SecondaryButtonText = string.Empty,
|
||||||
CloseButtonText = string.Empty,
|
CloseButtonText = string.Empty,
|
||||||
Content = new ModManagerView
|
Content = new ModManagerWindow(titleId, titleIdBase, appLibrary),
|
||||||
{
|
|
||||||
ViewModel = new ModManagerViewModel(titleId, titleIdBase, appLibrary)
|
|
||||||
},
|
|
||||||
Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowTitle], titleName, titleId.ToString("X16")),
|
Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowTitle], titleName, titleId.ToString("X16")),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common"
|
xmlns:helper="clr-namespace:Ryujinx.Common.Helper;assembly=Ryujinx.Common"
|
||||||
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
xmlns:controls="clr-namespace:Ryujinx.Ava.UI.Controls"
|
||||||
Width="1100"
|
Width="1100"
|
||||||
MinWidth="844"
|
MinWidth="800"
|
||||||
MinHeight="480"
|
MinHeight="480"
|
||||||
Title="{ext:WindowTitle Settings}"
|
Title="{ext:WindowTitle Settings}"
|
||||||
WindowStartupLocation="CenterOwner"
|
WindowStartupLocation="CenterOwner"
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ namespace Ryujinx.Ava.UI.Windows
|
|||||||
: NavigationViewPaneDisplayMode.Top;
|
: NavigationViewPaneDisplayMode.Top;
|
||||||
|
|
||||||
Height = ConfigurationState.Instance.ShowOldUI
|
Height = ConfigurationState.Instance.ShowOldUI
|
||||||
? 906
|
? 927
|
||||||
: 954; // nav panel is put on top with custom title bar so account for new height
|
: 993; // nav panel is put on top with custom title bar so account for new height
|
||||||
|
|
||||||
Load();
|
Load();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using FluentAvalonia.UI.Windowing;
|
|||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Systems.Configuration;
|
using Ryujinx.Ava.Systems.Configuration;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
using Ryujinx.Ava.UI.Controls;
|
||||||
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Windows
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<UserControl
|
<UserControl
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.TitleUpdateManagerView"
|
x:Class="Ryujinx.Ava.UI.Windows.TitleUpdateWindow"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@@ -6,16 +6,26 @@ using Ryujinx.Ava.Common.Locale;
|
|||||||
using Ryujinx.Ava.Common.Models;
|
using Ryujinx.Ava.Common.Models;
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using Ryujinx.Ava.Systems.AppLibrary;
|
using Ryujinx.Ava.Systems.AppLibrary;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Common.Helper;
|
using Ryujinx.Common.Helper;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class TitleUpdateManagerView : RyujinxControl<TitleUpdateViewModel>
|
public partial class TitleUpdateWindow : UserControl
|
||||||
{
|
{
|
||||||
public TitleUpdateManagerView()
|
public readonly TitleUpdateViewModel ViewModel;
|
||||||
|
|
||||||
|
public TitleUpdateWindow()
|
||||||
{
|
{
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TitleUpdateWindow(ApplicationLibrary applicationLibrary, ApplicationData applicationData)
|
||||||
|
{
|
||||||
|
DataContext = ViewModel = new TitleUpdateViewModel(applicationLibrary, applicationData);
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,11 +36,8 @@ namespace Ryujinx.Ava.UI.Views.Dialog
|
|||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
SecondaryButtonText = string.Empty,
|
SecondaryButtonText = string.Empty,
|
||||||
CloseButtonText = string.Empty,
|
CloseButtonText = string.Empty,
|
||||||
|
Content = new TitleUpdateWindow(applicationLibrary, applicationData),
|
||||||
Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, applicationData.Name, applicationData.IdBaseString),
|
Title = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.GameUpdateWindowHeading, applicationData.Name, applicationData.IdBaseString),
|
||||||
Content = new TitleUpdateManagerView
|
|
||||||
{
|
|
||||||
ViewModel = new TitleUpdateViewModel(applicationLibrary, applicationData)
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
|
Style bottomBorder = new(x => x.OfType<Grid>().Name("DialogSpace").Child().OfType<Border>());
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<UserControl
|
<UserControl
|
||||||
x:Class="Ryujinx.Ava.UI.Views.Dialog.XciTrimmerView"
|
x:Class="Ryujinx.Ava.UI.Windows.XCITrimmerWindow"
|
||||||
xmlns="https://github.com/avaloniaui"
|
xmlns="https://github.com/avaloniaui"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
xmlns:models="clr-namespace:Ryujinx.Ava.Common.Models"
|
xmlns:models="clr-namespace:Ryujinx.Ava.Common.Models"
|
||||||
Width="700"
|
Width="700"
|
||||||
Height="600"
|
Height="600"
|
||||||
x:DataType="viewModels:XciTrimmerViewModel"
|
x:DataType="viewModels:XCITrimmerViewModel"
|
||||||
Focusable="True"
|
Focusable="True"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<Grid Margin="20 0 20 0" RowDefinitions="Auto,Auto,*,Auto,Auto">
|
<Grid Margin="20 0 20 0" RowDefinitions="Auto,Auto,*,Auto,Auto">
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Stretch"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
CornerRadius="5"
|
CornerRadius="5"
|
||||||
IsVisible="{Binding $parent[UserControl].((viewModels:XciTrimmerViewModel)DataContext).Processing}"
|
IsVisible="{Binding $parent[UserControl].((viewModels:XCITrimmerViewModel)DataContext).Processing}"
|
||||||
Maximum="100"
|
Maximum="100"
|
||||||
Minimum="0"
|
Minimum="0"
|
||||||
Value="{Binding PercentageProgress}" />
|
Value="{Binding PercentageProgress}" />
|
||||||
@@ -4,17 +4,27 @@ using Avalonia.Styling;
|
|||||||
using FluentAvalonia.UI.Controls;
|
using FluentAvalonia.UI.Controls;
|
||||||
using Ryujinx.Ava.Common.Locale;
|
using Ryujinx.Ava.Common.Locale;
|
||||||
using Ryujinx.Ava.Common.Models;
|
using Ryujinx.Ava.Common.Models;
|
||||||
using Ryujinx.Ava.UI.Controls;
|
|
||||||
using Ryujinx.Ava.UI.ViewModels;
|
using Ryujinx.Ava.UI.ViewModels;
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.UI.Views.Dialog
|
namespace Ryujinx.Ava.UI.Windows
|
||||||
{
|
{
|
||||||
public partial class XciTrimmerView : RyujinxControl<XciTrimmerViewModel>
|
public partial class XCITrimmerWindow : UserControl
|
||||||
{
|
{
|
||||||
public XciTrimmerView()
|
public XCITrimmerViewModel ViewModel;
|
||||||
|
|
||||||
|
public XCITrimmerWindow()
|
||||||
{
|
{
|
||||||
|
DataContext = this;
|
||||||
|
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public XCITrimmerWindow(MainWindowViewModel mainWindowViewModel)
|
||||||
|
{
|
||||||
|
DataContext = ViewModel = new XCITrimmerViewModel(mainWindowViewModel);
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,10 +35,7 @@ namespace Ryujinx.Ava.UI.Views.Dialog
|
|||||||
PrimaryButtonText = string.Empty,
|
PrimaryButtonText = string.Empty,
|
||||||
SecondaryButtonText = string.Empty,
|
SecondaryButtonText = string.Empty,
|
||||||
CloseButtonText = string.Empty,
|
CloseButtonText = string.Empty,
|
||||||
Content = new XciTrimmerView
|
Content = new XCITrimmerWindow(RyujinxApp.MainWindow.ViewModel),
|
||||||
{
|
|
||||||
ViewModel = new XciTrimmerViewModel(RyujinxApp.MainWindow.ViewModel)
|
|
||||||
},
|
|
||||||
Title = LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]
|
Title = LocaleManager.Instance[LocaleKeys.XCITrimmerWindowTitle]
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -63,7 +70,7 @@ namespace Ryujinx.Ava.UI.Views.Dialog
|
|||||||
public void Sort_Checked(object sender, RoutedEventArgs args)
|
public void Sort_Checked(object sender, RoutedEventArgs args)
|
||||||
{
|
{
|
||||||
if (sender is RadioButton { Tag: string sortField })
|
if (sender is RadioButton { Tag: string sortField })
|
||||||
ViewModel.SortingField = Enum.Parse<XciTrimmerViewModel.SortField>(sortField);
|
ViewModel.SortingField = Enum.Parse<XCITrimmerViewModel.SortField>(sortField);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Order_Checked(object sender, RoutedEventArgs args)
|
public void Order_Checked(object sender, RoutedEventArgs args)
|
||||||
@@ -27,7 +27,7 @@ using System.Text;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Ryujinx.Ava.Systems
|
namespace Ryujinx.Ava
|
||||||
{
|
{
|
||||||
internal static class Updater
|
internal static class Updater
|
||||||
{
|
{
|
||||||
Reference in New Issue
Block a user