Jelajahi Sumber

UI: Add a show changelog button in the Updater, for new updates & when you're on the latest version.

Evan Husted 1 tahun lalu
induk
melakukan
f8d63f9a2f

+ 2 - 2
Directory.Packages.props

@@ -38,7 +38,7 @@
     <PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" />
     <PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
     <PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
-    <PackageVersion Include="Gommon" Version="2.6.5" />
+    <PackageVersion Include="Gommon" Version="2.6.6" />
     <PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
     <PackageVersion Include="shaderc.net" Version="0.1.0" />
     <PackageVersion Include="SharpZipLib" Version="1.4.2" />
@@ -52,4 +52,4 @@
     <PackageVersion Include="System.Management" Version="8.0.0" />
     <PackageVersion Include="UnicornEngine.Unicorn" Version="2.0.2-rc1-fb78016" />
   </ItemGroup>
-</Project>
+</Project>

+ 9 - 0
src/Ryujinx.Common/ReleaseInformation.cs

@@ -1,3 +1,4 @@
+using System;
 using System.Reflection;
 
 namespace Ryujinx.Common
@@ -35,5 +36,13 @@ namespace Ryujinx.Common
         public static bool IsReleaseBuild => IsValid && ReleaseChannelName.Equals(ReleaseChannel);
 
         public static string Version => IsValid ? BuildVersion : Assembly.GetEntryAssembly()!.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
+
+        public static string GetChangelogUrl(Version currentVersion, Version newVersion) =>
+            IsCanaryBuild 
+                ? $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/compare/Canary-{currentVersion}...Canary-{newVersion}" 
+                : $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelSourceRepo}/releases/tag/{newVersion}";
+        
+        public static string GetChangelogForVersion(Version version) =>
+            $"https://github.com/{ReleaseChannelOwner}/{ReleaseChannelRepo}/releases/tag/{version}";
     }
 }

+ 1 - 0
src/Ryujinx/Assets/Locales/ar_SA.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "جاري استخراج التحديث...",
   "DialogUpdaterRenamingMessage": "إعادة تسمية التحديث...",
   "DialogUpdaterAddingFilesMessage": "إضافة تحديث جديد...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "اكتمل التحديث",
   "DialogUpdaterRestartMessage": "هل تريد إعادة تشغيل ريوجينكس الآن؟",
   "DialogUpdaterNoInternetMessage": "أنت غير متصل بالإنترنت.",

+ 1 - 0
src/Ryujinx/Assets/Locales/de_DE.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Update wird entpackt...",
   "DialogUpdaterRenamingMessage": "Update wird umbenannt...",
   "DialogUpdaterAddingFilesMessage": "Update wird hinzugefügt...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Update abgeschlossen!",
   "DialogUpdaterRestartMessage": "Ryujinx jetzt neu starten?",
   "DialogUpdaterNoInternetMessage": "Es besteht keine Verbindung mit dem Internet!",

+ 1 - 0
src/Ryujinx/Assets/Locales/el_GR.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Εξαγωγή Ενημέρωσης...",
   "DialogUpdaterRenamingMessage": "Μετονομασία Ενημέρωσης...",
   "DialogUpdaterAddingFilesMessage": "Προσθήκη Νέας Ενημέρωσης...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Η Ενημέρωση Ολοκληρώθηκε!",
   "DialogUpdaterRestartMessage": "Θέλετε να επανεκκινήσετε το Ryujinx τώρα;",
   "DialogUpdaterNoInternetMessage": "Δεν είστε συνδεδεμένοι στο Διαδίκτυο!",

+ 1 - 0
src/Ryujinx/Assets/Locales/en_US.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Extracting Update...",
   "DialogUpdaterRenamingMessage": "Renaming Update...",
   "DialogUpdaterAddingFilesMessage": "Adding New Update...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Update Complete!",
   "DialogUpdaterRestartMessage": "Do you want to restart Ryujinx now?",
   "DialogUpdaterNoInternetMessage": "You are not connected to the Internet!",

+ 1 - 0
src/Ryujinx/Assets/Locales/es_ES.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Extrayendo actualización...",
   "DialogUpdaterRenamingMessage": "Renombrando actualización...",
   "DialogUpdaterAddingFilesMessage": "Aplicando actualización...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "¡Actualización completa!",
   "DialogUpdaterRestartMessage": "¿Quieres reiniciar Ryujinx?",
   "DialogUpdaterNoInternetMessage": "¡No estás conectado a internet!",

+ 1 - 0
src/Ryujinx/Assets/Locales/fr_FR.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Extraction de la mise à jour…",
   "DialogUpdaterRenamingMessage": "Renommage de la mise à jour...",
   "DialogUpdaterAddingFilesMessage": "Ajout d'une nouvelle mise à jour...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Mise à jour terminée !",
   "DialogUpdaterRestartMessage": "Voulez-vous redémarrer Ryujinx maintenant ?",
   "DialogUpdaterNoInternetMessage": "Vous n'êtes pas connecté à Internet !",

+ 1 - 0
src/Ryujinx/Assets/Locales/he_IL.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "מחלץ עדכון...",
   "DialogUpdaterRenamingMessage": "משנה את שם העדכון...",
   "DialogUpdaterAddingFilesMessage": "מוסיף עדכון חדש...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "העדכון הושלם!",
   "DialogUpdaterRestartMessage": "האם אתם רוצים להפעיל מחדש את ריוג'ינקס עכשיו?",
   "DialogUpdaterNoInternetMessage": "אתם לא מחוברים לאינטרנט!",

+ 1 - 0
src/Ryujinx/Assets/Locales/it_IT.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Estrazione dell'aggiornamento...",
   "DialogUpdaterRenamingMessage": "Rinominazione dell'aggiornamento...",
   "DialogUpdaterAddingFilesMessage": "Aggiunta del nuovo aggiornamento...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Aggiornamento completato!",
   "DialogUpdaterRestartMessage": "Vuoi riavviare Ryujinx adesso?",
   "DialogUpdaterNoInternetMessage": "Non sei connesso ad Internet!",

+ 1 - 0
src/Ryujinx/Assets/Locales/ja_JP.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "アップデートを展開中...",
   "DialogUpdaterRenamingMessage": "アップデートをリネーム中...",
   "DialogUpdaterAddingFilesMessage": "新規アップデートを追加中...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "アップデート完了!",
   "DialogUpdaterRestartMessage": "すぐに Ryujinx を再起動しますか?",
   "DialogUpdaterNoInternetMessage": "インターネットに接続されていません!",

+ 1 - 0
src/Ryujinx/Assets/Locales/ko_KR.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "업데이트 추출 중...",
   "DialogUpdaterRenamingMessage": "이름 변경 업데이트...",
   "DialogUpdaterAddingFilesMessage": "새 업데이트 추가 중...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "업데이트가 완료되었습니다!",
   "DialogUpdaterRestartMessage": "지금 Ryujinx를 다시 시작하시겠습니까?",
   "DialogUpdaterNoInternetMessage": "인터넷에 연결되어 있지 않습니다!",

+ 1 - 0
src/Ryujinx/Assets/Locales/pl_PL.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Wypakowywanie Aktualizacji...",
   "DialogUpdaterRenamingMessage": "Zmiana Nazwy Aktualizacji...",
   "DialogUpdaterAddingFilesMessage": "Dodawanie Nowej Aktualizacji...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Aktualizacja Zakończona!",
   "DialogUpdaterRestartMessage": "Czy chcesz teraz zrestartować Ryujinx?",
   "DialogUpdaterNoInternetMessage": "Nie masz połączenia z Internetem!",

+ 1 - 0
src/Ryujinx/Assets/Locales/pt_BR.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Extraindo atualização...",
   "DialogUpdaterRenamingMessage": "Renomeando atualização...",
   "DialogUpdaterAddingFilesMessage": "Adicionando nova atualização...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Atualização concluída!",
   "DialogUpdaterRestartMessage": "Deseja reiniciar o Ryujinx agora?",
   "DialogUpdaterNoInternetMessage": "Você não está conectado à Internet!",

+ 1 - 0
src/Ryujinx/Assets/Locales/ru_RU.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Извлечение обновления...",
   "DialogUpdaterRenamingMessage": "Переименование обновления...",
   "DialogUpdaterAddingFilesMessage": "Добавление нового обновления...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Обновление завершено",
   "DialogUpdaterRestartMessage": "Перезапустить Ryujinx?",
   "DialogUpdaterNoInternetMessage": "Вы не подключены к интернету",

+ 1 - 0
src/Ryujinx/Assets/Locales/th_TH.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "กำลังแตกไฟล์อัปเดต...",
   "DialogUpdaterRenamingMessage": "กำลังลบไฟล์เก่า...",
   "DialogUpdaterAddingFilesMessage": "กำลังเพิ่มไฟล์อัปเดตใหม่...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "อัปเดตเสร็จสมบูรณ์แล้ว!",
   "DialogUpdaterRestartMessage": "คุณต้องการรีสตาร์ท Ryujinx ตอนนี้หรือไม่?",
   "DialogUpdaterNoInternetMessage": "คุณไม่ได้เชื่อมต่อกับอินเทอร์เน็ต!",

+ 1 - 0
src/Ryujinx/Assets/Locales/tr_TR.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Güncelleme Ayıklanıyor...",
   "DialogUpdaterRenamingMessage": "Güncelleme Yeniden Adlandırılıyor...",
   "DialogUpdaterAddingFilesMessage": "Yeni Güncelleme Ekleniyor...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Güncelleme Tamamlandı!",
   "DialogUpdaterRestartMessage": "Ryujinx'i şimdi yeniden başlatmak istiyor musunuz?",
   "DialogUpdaterNoInternetMessage": "İnternete bağlı değilsiniz!",

+ 1 - 0
src/Ryujinx/Assets/Locales/uk_UA.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "Видобування оновлення...",
   "DialogUpdaterRenamingMessage": "Перейменування оновлення...",
   "DialogUpdaterAddingFilesMessage": "Додавання нового оновлення...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "Оновлення завершено!",
   "DialogUpdaterRestartMessage": "Перезапустити Ryujinx зараз?",
   "DialogUpdaterNoInternetMessage": "Ви не підключені до Інтернету!",

+ 1 - 0
src/Ryujinx/Assets/Locales/zh_CN.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "正在提取更新...",
   "DialogUpdaterRenamingMessage": "正在重命名更新...",
   "DialogUpdaterAddingFilesMessage": "安装更新中...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "更新成功!",
   "DialogUpdaterRestartMessage": "是否立即重启 Ryujinx 模拟器?",
   "DialogUpdaterNoInternetMessage": "没有连接到网络",

+ 1 - 0
src/Ryujinx/Assets/Locales/zh_TW.json

@@ -457,6 +457,7 @@
   "DialogUpdaterExtractionMessage": "正在提取更新...",
   "DialogUpdaterRenamingMessage": "重新命名更新...",
   "DialogUpdaterAddingFilesMessage": "加入新更新...",
+  "DialogUpdaterShowChangelogMessage": "Show Changelog",
   "DialogUpdaterCompleteMessage": "更新成功!",
   "DialogUpdaterRestartMessage": "您現在要重新啟動 Ryujinx 嗎?",
   "DialogUpdaterNoInternetMessage": "您沒有連線到網際網路!",

+ 34 - 0
src/Ryujinx/UI/Helpers/ContentDialogHelper.cs

@@ -261,6 +261,16 @@ namespace Ryujinx.Ava.UI.Helpers
                 string.Empty,
                 LocaleManager.Instance[LocaleKeys.InputDialogOk],
                 (int)Symbol.Important);
+        
+        internal static async Task<UserResult> CreateUpdaterUpToDateInfoDialog(string primary, string secondaryText)
+            => await ShowTextDialog(
+                LocaleManager.Instance[LocaleKeys.DialogUpdaterTitle],
+                primary,
+                secondaryText,
+                LocaleManager.Instance[LocaleKeys.DialogUpdaterShowChangelogMessage],
+                string.Empty,
+                LocaleManager.Instance[LocaleKeys.InputDialogOk],
+                (int)Symbol.Important);
 
         internal static async Task CreateWarningDialog(string primary, string secondaryText)
             => await ShowTextDialog(
@@ -309,6 +319,30 @@ namespace Ryujinx.Ava.UI.Helpers
 
             return response == UserResult.Yes;
         }
+        
+        internal static async Task<UserResult> CreateUpdaterChoiceDialog(string title, string primary, string secondaryText)
+        {
+            if (_isChoiceDialogOpen)
+            {
+                return UserResult.Cancel;
+            }
+
+            _isChoiceDialogOpen = true;
+
+            UserResult response = await ShowTextDialog(
+                title,
+                primary,
+                secondaryText,
+                LocaleManager.Instance[LocaleKeys.InputDialogYes],
+                LocaleManager.Instance[LocaleKeys.DialogUpdaterShowChangelogMessage],
+                LocaleManager.Instance[LocaleKeys.InputDialogNo],
+                (int)Symbol.Help,
+                UserResult.Yes);
+
+            _isChoiceDialogOpen = false;
+
+            return response;
+        }
 
         internal static async Task<bool> CreateExitDialog()
         {

+ 24 - 9
src/Ryujinx/Updater.cs

@@ -176,9 +176,14 @@ namespace Ryujinx.Ava
             {
                 if (showVersionUpToDate)
                 {
-                    await ContentDialogHelper.CreateUpdaterInfoDialog(
+                    UserResult userResult = await ContentDialogHelper.CreateUpdaterUpToDateInfoDialog(
                         LocaleManager.Instance[LocaleKeys.DialogUpdaterAlreadyOnLatestVersionMessage],
                         string.Empty);
+
+                    if (userResult is UserResult.Yes)
+                    {
+                        OpenHelper.OpenUrl(ReleaseInformation.GetChangelogForVersion(currentVersion));
+                    }
                 }
 
                 _running = false;
@@ -206,19 +211,29 @@ namespace Ryujinx.Ava
 
             await Dispatcher.UIThread.InvokeAsync(async () =>
             {
+                string newVersionString = ReleaseInformation.IsCanaryBuild
+                    ? $"Canary {currentVersion} -> Canary {newVersion}"
+                    : $"{currentVersion} -> {newVersion}";
+                
+                RequestUserToUpdate:
                 // Show a message asking the user if they want to update
-                var shouldUpdate = await ContentDialogHelper.CreateChoiceDialog(
+                UserResult shouldUpdate = await ContentDialogHelper.CreateUpdaterChoiceDialog(
                     LocaleManager.Instance[LocaleKeys.RyujinxUpdater],
                     LocaleManager.Instance[LocaleKeys.RyujinxUpdaterMessage],
-                    $"{Program.Version} -> {newVersion}");
+                    newVersionString);
 
-                if (shouldUpdate)
-                {
-                    await UpdateRyujinx(mainWindow, _buildUrl);
-                }
-                else
+                switch (shouldUpdate)
                 {
-                    _running = false;
+                    case UserResult.Yes:
+                        await UpdateRyujinx(mainWindow, _buildUrl);
+                        break;
+                    // Secondary button maps to no, which in this case is the show changelog button.
+                    case UserResult.No:
+                        OpenHelper.OpenUrl(ReleaseInformation.GetChangelogUrl(currentVersion, newVersion));
+                        goto RequestUserToUpdate;
+                    default:
+                        _running = false;
+                        break;
                 }
             });
         }