diff --git a/src/Snap.Hutao/Snap.Hutao/App.xaml.cs b/src/Snap.Hutao/Snap.Hutao/App.xaml.cs
index 32a2a17e..b1ad7866 100644
--- a/src/Snap.Hutao/Snap.Hutao/App.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/App.xaml.cs
@@ -1,8 +1,6 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
-using CommunityToolkit.Mvvm.Messaging;
-using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.Windows.AppLifecycle;
using Snap.Hutao.Core.LifeCycle;
@@ -11,57 +9,31 @@ using Snap.Hutao.Extension;
using Snap.Hutao.Service.Metadata;
using System.Diagnostics;
using Windows.Storage;
-using Windows.UI.ViewManagement;
namespace Snap.Hutao;
///
/// Provides application-specific behavior to supplement the default Application class.
///
+[Injection(InjectAs.Singleton)]
public partial class App : Application
{
- private static Window? window;
private readonly ILogger logger;
///
/// Initializes the singleton application object.
///
- public App()
+ /// 日志器
+ public App(ILogger logger)
{
// load app resource
InitializeComponent();
- InitializeDependencyInjection();
- // Notice that we already call InitializeDependencyInjection() above
- // so we can use Ioc here.
- logger = Ioc.Default.GetRequiredService>();
+ this.logger = logger;
_ = new ExceptionRecorder(this, logger);
}
- ///
- /// 当前窗口
- ///
- public static Window? Window { get => window; set => window = value; }
-
- ///
- public static new App Current
- {
- get => (App)Application.Current;
- }
-
- ///
- public static StorageFolder CacheFolder
- {
- get => ApplicationData.Current.TemporaryFolder;
- }
-
- ///
- public static ApplicationDataContainer Settings
- {
- get => ApplicationData.Current.LocalSettings;
- }
-
///
[SuppressMessage("", "VSTHRD100")]
protected override async void OnLaunched(LaunchActivatedEventArgs args)
@@ -71,11 +43,11 @@ public partial class App : Application
if (firstInstance.IsCurrent)
{
- // manually invoke the
+ // manually invoke
Activation.Activate(firstInstance, activatedEventArgs);
firstInstance.Activated += Activation.Activate;
- logger.LogInformation(EventIds.CommonLog, "Cache folder : {folder}", CacheFolder.Path);
+ logger.LogInformation(EventIds.CommonLog, "Cache folder : {folder}", ApplicationData.Current.TemporaryFolder.Path);
Ioc.Default
.GetRequiredService()
@@ -90,29 +62,4 @@ public partial class App : Application
Process.GetCurrentProcess().Kill();
}
}
-
- private static void InitializeDependencyInjection()
- {
- IServiceProvider services = new ServiceCollection()
-
- // Microsoft extension
- .AddLogging(builder => builder
- .AddDebug()
- .AddDatabase())
- .AddMemoryCache()
-
- // Hutao extensions
- .AddJsonSerializerOptions()
- .AddDatebase()
- .AddInjections()
- .AddHttpClients()
-
- // Discrete services
- .AddSingleton(WeakReferenceMessenger.Default)
- .AddSingleton(new UISettings())
-
- .BuildServiceProvider();
-
- Ioc.Default.ConfigureServices(services);
- }
-}
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png
index 7440f0d4..cb6b3afd 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/LockScreenLogo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png
index 32f486a8..e08dacb2 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/SplashScreen.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png
index 53ee3777..7965f313 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Square150x150Logo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png
index f713bba6..5dd40c80 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
index dc9f5bea..f44a5c8d 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png b/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png
index a4586f26..f0a29d4f 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png and b/src/Snap.Hutao/Snap.Hutao/Assets/StoreLogo.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png b/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png
index 8b4a5d0d..7b1d7f2f 100644
Binary files a/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png and b/src/Snap.Hutao/Snap.Hutao/Assets/Wide310x150Logo.scale-200.png differ
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs b/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs
new file mode 100644
index 00000000..514cb957
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Extension/ContentDialogExtensions.cs
@@ -0,0 +1,39 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.UI.Xaml.Controls;
+using Snap.Hutao.Extension;
+
+namespace Snap.Hutao.Control.Extension;
+
+///
+/// 对话框扩展
+///
+internal static class ContentDialogExtensions
+{
+ ///
+ /// 阻止用户交互
+ ///
+ /// 对话框
+ /// 用于恢复用户交互
+ public static IDisposable BlockInteraction(this ContentDialog contentDialog)
+ {
+ contentDialog.ShowAsync().AsTask().SafeForget();
+ return new ContentDialogHider(contentDialog);
+ }
+
+ private struct ContentDialogHider : IDisposable
+ {
+ private readonly ContentDialog contentDialog;
+
+ public ContentDialogHider(ContentDialog contentDialog)
+ {
+ this.contentDialog = contentDialog;
+ }
+
+ public void Dispose()
+ {
+ contentDialog.Hide();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs
index 124b4362..dc77c05c 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/CompositionImage.cs
@@ -8,7 +8,6 @@ using Microsoft.UI.Xaml.Hosting;
using Microsoft.UI.Xaml.Media;
using Snap.Hutao.Core;
using Snap.Hutao.Core.Caching;
-using Snap.Hutao.Core.Exception;
using Snap.Hutao.Core.Threading;
using Snap.Hutao.Extension;
using Snap.Hutao.Service.Abstraction;
@@ -132,13 +131,8 @@ public abstract class CompositionImage : Microsoft.UI.Xaml.Controls.Control
{
imageSurface = await LoadImageSurfaceAsync(storageFile, token);
}
- catch (COMException ex) when (ex.Is(COMError.STG_E_FILENOTFOUND))
+ catch (COMException)
{
- // Image file not found.
- }
- catch (COMException ex) when (ex.Is(COMError.WINCODEC_ERR_COMPONENTNOTFOUND))
- {
- // Image is broken, remove it
await imageCache.RemoveAsync(uri.Enumerate());
}
diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs b/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs
index 2bd53b11..b7492dac 100644
--- a/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Control/Image/MonoChrome.cs
@@ -55,7 +55,7 @@ public class MonoChrome : CompositionImage
{
ElementTheme.Light => ApplicationTheme.Light,
ElementTheme.Dark => ApplicationTheme.Dark,
- _ => App.Current.RequestedTheme,
+ _ => Ioc.Default.GetRequiredService().RequestedTheme,
};
backgroundBrush.Color = theme switch
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Caching/CacheBase.cs b/src/Snap.Hutao/Snap.Hutao/Core/Caching/CacheBase.cs
index 3d99fe1c..f33dbd83 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Caching/CacheBase.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Caching/CacheBase.cs
@@ -216,7 +216,7 @@ public abstract class CacheBase
using (await cacheFolderSemaphore.EnterAsync().ConfigureAwait(false))
{
- baseFolder ??= App.CacheFolder;
+ baseFolder ??= ApplicationData.Current.TemporaryFolder;
if (string.IsNullOrWhiteSpace(cacheFolderName))
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
index f0214284..b2a2882d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs
@@ -23,6 +23,7 @@ internal static class Activation
/// 激活参数
public static void Activate(object? sender, AppActivationArguments args)
{
+ _ = sender;
HandleActivationAsync(args).SafeForget();
}
@@ -43,7 +44,7 @@ internal static class Activation
private static async Task HandleActivationCoreAsync(AppActivationArguments args)
{
- App.Window = Ioc.Default.GetRequiredService();
+ _ = Ioc.Default.GetRequiredService();
IInfoBarService infoBarService = Ioc.Default.GetRequiredService();
await infoBarService.WaitInitializationAsync().ConfigureAwait(false);
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Setting/LocalSetting.cs b/src/Snap.Hutao/Snap.Hutao/Core/Setting/LocalSetting.cs
index 91555939..f536d772 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Setting/LocalSetting.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Setting/LocalSetting.cs
@@ -18,7 +18,7 @@ internal static class LocalSetting
static LocalSetting()
{
- Container = App.Settings;
+ Container = ApplicationData.Current.LocalSettings;
}
///
@@ -28,7 +28,7 @@ internal static class LocalSetting
/// 键
/// 默认值
/// 获取的值
- [return:MaybeNull]
+ [return: MaybeNull]
public static T Get(string key, [AllowNull] T defaultValue = default)
{
if (Container.Values.TryGetValue(key, out object? value))
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/ThemeHelper.cs b/src/Snap.Hutao/Snap.Hutao/Core/ThemeHelper.cs
index 5296e21f..be0ab011 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/ThemeHelper.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/ThemeHelper.cs
@@ -57,4 +57,20 @@ public static class ThemeHelper
_ => throw Must.NeverHappen(),
};
}
+
+ ///
+ /// 检查是否为暗黑模式
+ ///
+ /// 当前元素主题
+ /// 当前应用主题
+ /// 是否为暗黑模式
+ public static bool IsDarkMode(ElementTheme elementTheme, ApplicationTheme applicationTheme)
+ {
+ return elementTheme switch
+ {
+ ElementTheme.Default => applicationTheme == ApplicationTheme.Dark,
+ ElementTheme.Dark => true,
+ _ => false,
+ };
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatherQueueSwitchOperation.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatherQueueSwitchOperation.cs
index 84d483a9..2a86b9da 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatherQueueSwitchOperation.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/DispatherQueueSwitchOperation.cs
@@ -25,7 +25,10 @@ public struct DispatherQueueSwitchOperation : IAwaitable
/// 是否完成
///
- public bool IsCompleted => dispatherQueue.HasThreadAccess;
+ public bool IsCompleted
+ {
+ get => dispatherQueue.HasThreadAccess;
+ }
///
public void OnCompleted(Action continuation)
diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/WindowManager.cs b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/WindowManager.cs
index e9caeff4..3d122ef2 100644
--- a/src/Snap.Hutao/Snap.Hutao/Core/Windowing/WindowManager.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Core/Windowing/WindowManager.cs
@@ -116,10 +116,12 @@ internal sealed class WindowManager : IDisposable
appTitleBar.ButtonBackgroundColor = Colors.Transparent;
appTitleBar.ButtonInactiveBackgroundColor = Colors.Transparent;
- Color systemBaseLowColor = (Color)App.Current.Resources["SystemBaseLowColor"];
+ App app = Ioc.Default.GetRequiredService();
+
+ Color systemBaseLowColor = (Color)app.Resources["SystemBaseLowColor"];
appTitleBar.ButtonHoverBackgroundColor = systemBaseLowColor;
- Color systemBaseMediumLowColor = (Color)App.Current.Resources["SystemBaseMediumLowColor"];
+ Color systemBaseMediumLowColor = (Color)app.Resources["SystemBaseMediumLowColor"];
appTitleBar.ButtonPressedBackgroundColor = systemBaseMediumLowColor;
// The Foreground doesn't accept Alpha channel. So we translate it to gray.
@@ -127,7 +129,7 @@ internal sealed class WindowManager : IDisposable
byte result = (byte)((systemBaseMediumLowColor.A / 255.0) * light);
appTitleBar.ButtonInactiveForegroundColor = Color.FromArgb(0xFF, result, result, result);
- Color systemBaseHighColor = (Color)App.Current.Resources["SystemBaseHighColor"];
+ Color systemBaseHighColor = (Color)app.Resources["SystemBaseHighColor"];
appTitleBar.ButtonForegroundColor = systemBaseHighColor;
appTitleBar.ButtonHoverForegroundColor = systemBaseHighColor;
appTitleBar.ButtonPressedForegroundColor = systemBaseHighColor;
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/FightProperty.cs b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/FightProperty.cs
index 2b84fac8..6b46e62d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/FightProperty.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Intrinsic/FightProperty.cs
@@ -194,6 +194,8 @@ public enum FightProperty
///
/// 草元素伤害加成
///
+ [Description("草元素伤害加成")]
+ [Format(FormatMethod.Percent)]
FIGHT_PROP_GRASS_ADD_HURT = 43,
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarIconConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarIconConverter.cs
index 57055dd6..07178fbe 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarIconConverter.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarIconConverter.cs
@@ -10,7 +10,7 @@ namespace Snap.Hutao.Model.Metadata.Converter;
///
internal class AvatarIconConverter : IValueConverter
{
- private const string BaseUrl = "https://upload-bbs.mihoyo.com/game_record/genshin/character_icon/{0}.png";
+ private const string BaseUrl = "https://static.snapgenshin.com/AvatarIcon/{0}.png";
///
public object Convert(object value, Type targetType, object parameter, string language)
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarSideIconConverter.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarSideIconConverter.cs
index be2ae510..43e29385 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarSideIconConverter.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Converter/AvatarSideIconConverter.cs
@@ -10,7 +10,7 @@ namespace Snap.Hutao.Model.Metadata.Converter;
///
internal class AvatarSideIconConverter : IValueConverter
{
- private const string BaseUrl = "https://upload-bbs.mihoyo.com/game_record/genshin/character_side_icon/{0}.png";
+ private const string BaseUrl = "https://static.snapgenshin.com/AvatarIcon/{0}.png";
///
public object Convert(object value, Type targetType, object parameter, string language)
diff --git a/src/Snap.Hutao/Snap.Hutao/Program.cs b/src/Snap.Hutao/Snap.Hutao/Program.cs
index 60c7c8a6..6fb20333 100644
--- a/src/Snap.Hutao/Snap.Hutao/Program.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Program.cs
@@ -1,10 +1,14 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
+using CommunityToolkit.Mvvm.Messaging;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml;
+using Snap.Hutao.Core.Logging;
using Snap.Hutao.Core.Threading;
using System.Runtime.InteropServices;
+using Windows.UI.ViewManagement;
using WinRT;
namespace Snap.Hutao;
@@ -35,12 +39,44 @@ public static class Program
XamlCheckProcessRequirements();
ComWrappersSupport.InitializeComWrappers();
- Application.Start(p =>
- {
- dispatcherQueue = DispatcherQueue.GetForCurrentThread();
- DispatcherQueueSynchronizationContext context = new(dispatcherQueue);
- SynchronizationContext.SetSynchronizationContext(context);
- _ = new App();
- });
+ InitializeDependencyInjection();
+
+ // In a Desktop app this runs a message pump internally,
+ // and does not return until the application shuts down.
+ Application.Start(InitializeApp);
+ }
+
+ private static void InitializeApp(ApplicationInitializationCallbackParams param)
+ {
+ dispatcherQueue = DispatcherQueue.GetForCurrentThread();
+ DispatcherQueueSynchronizationContext context = new(dispatcherQueue);
+ SynchronizationContext.SetSynchronizationContext(context);
+
+ _ = Ioc.Default.GetRequiredService();
+ }
+
+ private static void InitializeDependencyInjection()
+ {
+ IServiceProvider services = new ServiceCollection()
+
+ // Microsoft extension
+ .AddLogging(builder => builder
+ .AddDebug()
+ .AddDatabase())
+ .AddMemoryCache()
+
+ // Hutao extensions
+ .AddJsonSerializerOptions()
+ .AddDatebase()
+ .AddInjections()
+ .AddHttpClients()
+
+ // Discrete services
+ .AddSingleton(WeakReferenceMessenger.Default)
+ .AddSingleton(new UISettings())
+
+ .BuildServiceProvider();
+
+ Ioc.Default.ConfigureServices(services);
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs
index f87e5bf0..7a3cbeb5 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/AchievementService.cs
@@ -151,6 +151,12 @@ internal class AchievementService : IAchievementService
}
}
+ ///
+ public Task ImportFromUIAFAsync(EntityArchive archive, List list, ImportOption option)
+ {
+ return Task.Run(() => ImportFromUIAF(archive, list, option));
+ }
+
///
public void SaveAchievements(EntityArchive archive, IList achievements)
{
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs
index 40547697..8075562b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/IAchievementService.cs
@@ -40,9 +40,18 @@ internal interface IAchievementService
/// 用户
/// UIAF数据
/// 选项
- /// 导入
+ /// 导入结果
ImportResult ImportFromUIAF(EntityArchive archive, List list, ImportOption option);
+ ///
+ /// 异步导入UIAF数据
+ ///
+ /// 用户
+ /// UIAF数据
+ /// 选项
+ /// 导入结果
+ Task ImportFromUIAFAsync(EntityArchive archive, List list, ImportOption option);
+
///
/// 异步移除存档
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/ImportResult.cs b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/ImportResult.cs
index 02b8a283..5a02cea8 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Achievement/ImportResult.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Achievement/ImportResult.cs
@@ -35,4 +35,10 @@ public struct ImportResult
Update = update;
Remove = remove;
}
+
+ ///
+ public override string ToString()
+ {
+ return $"新增:{Add} 个成就 | 更新:{Update} 个成就 | 删除{Remove} 个成就";
+ }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml
index 349e2f87..b5e9c69a 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml
@@ -50,7 +50,7 @@
diff --git a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs
index c17d50c5..0bdeb2e5 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/View/MainView.xaml.cs
@@ -50,13 +50,15 @@ public sealed partial class MainView : UserControl
{
await Program.SwitchToMainThreadAsync();
- if (!ThemeHelper.Equals(App.Current.RequestedTheme, RequestedTheme))
+ App current = Ioc.Default.GetRequiredService();
+
+ if (!ThemeHelper.Equals(current.RequestedTheme, RequestedTheme))
{
ILogger logger = Ioc.Default.GetRequiredService>();
- logger.LogInformation(EventIds.CommonLog, "Element Theme [{element}] App Theme [{app}]", RequestedTheme, App.Current.RequestedTheme);
+ logger.LogInformation(EventIds.CommonLog, "Element Theme [{element}] App Theme [{app}]", RequestedTheme, current.RequestedTheme);
// Update controls' theme which presents in the PopupRoot
- RequestedTheme = ThemeHelper.ApplicationToElement(App.Current.RequestedTheme);
+ RequestedTheme = ThemeHelper.ApplicationToElement(current.RequestedTheme);
}
}
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AnnouncementContentPage.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Page/AnnouncementContentPage.xaml.cs
index cf3cecae..e489dcb1 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/AnnouncementContentPage.xaml.cs
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AnnouncementContentPage.xaml.cs
@@ -4,6 +4,7 @@
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Navigation;
using Microsoft.Web.WebView2.Core;
+using Snap.Hutao.Core;
using Snap.Hutao.Extension;
using Snap.Hutao.Service.Navigation;
using Windows.System;
@@ -21,7 +22,8 @@ public sealed partial class AnnouncementContentPage : Microsoft.UI.Xaml.Controls
private const string LightColor3 = "color:rgba(204,204,204,1)";
private const string LightColor4 = "color:rgba(198,196,191,1)";
private const string LightColor5 = "color:rgba(170,170,170,1)";
- private const string LightAccentColor = "background-color: rgb(0,40,70)";
+ private const string LightAccentColor1 = "background-color: rgb(0,40,70)";
+ private const string LightAccentColor2 = "background-color: rgb(1,40,70)";
// find in content
private const string DarkColor1 = "color:rgba(0,0,0,1)";
@@ -30,6 +32,7 @@ public sealed partial class AnnouncementContentPage : Microsoft.UI.Xaml.Controls
private const string DarkColor4 = "color:rgba(57,59,64,1)";
private const string DarkColor5 = "color:rgba(85,85,85,1)";
private const string DarkAccentColor1 = "background-color: rgb(255, 215, 185);";
+ private const string DarkAccentColor2 = "background-color: rgb(254, 245, 231);";
// support click open browser.
private const string MihoyoSDKDefinition =
@@ -66,25 +69,19 @@ openInWebview: function(url){ location.href = url }}";
return rawContent;
}
- bool isDarkMode = theme switch
- {
- ElementTheme.Default => App.Current.RequestedTheme == ApplicationTheme.Dark,
- ElementTheme.Dark => true,
- _ => false,
- };
-
- if (isDarkMode)
+ if (ThemeHelper.IsDarkMode(theme, Ioc.Default.GetRequiredService().RequestedTheme))
{
rawContent = rawContent
.Replace(DarkColor5, LightColor5)
.Replace(DarkColor4, LightColor4)
.Replace(DarkColor3, LightColor3)
.Replace(DarkColor2, LightColor2)
- .Replace(DarkAccentColor1, LightAccentColor);
+ .Replace(DarkAccentColor1, LightAccentColor1)
+ .Replace(DarkAccentColor2, LightAccentColor2);
}
// wrap a default color body around
- return $@"{rawContent}";
+ return $@"().RequestedTheme) ? LightColor1 : DarkColor1)}"">{rawContent}";
}
private async Task LoadAnnouncementAsync(INavigationData data)
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
index 2b45b625..065c4dff 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
@@ -25,9 +25,7 @@
-
-
+ Description="根本没有检查更新选项"/>
+ Description="所有账号的所有角色都会签到,每次间隔 5-15s">
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs
index fe3147dd..5e563157 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AchievementViewModel.cs
@@ -7,6 +7,7 @@ using CommunityToolkit.WinUI.UI;
using Microsoft.UI.Xaml.Controls;
using Snap.Hutao.Control;
using Snap.Hutao.Control.Cancellable;
+using Snap.Hutao.Control.Extension;
using Snap.Hutao.Extension;
using Snap.Hutao.Factory.Abstraction;
using Snap.Hutao.Message;
@@ -21,6 +22,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
+using System.Runtime.InteropServices;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage;
using Windows.Storage.Pickers;
@@ -211,7 +213,7 @@ internal class AchievementViewModel
private static Task ShowImportFailDialogAsync(string message)
{
- return new ContentDialog2(App.Window!)
+ return new ContentDialog2(Ioc.Default.GetRequiredService())
{
Title = "导入失败",
Content = message,
@@ -239,7 +241,8 @@ internal class AchievementViewModel
if (metaInitialized)
{
- AchievementGoals = await metadataService.GetAchievementGoalsAsync(CancellationToken);
+ List goals = await metadataService.GetAchievementGoalsAsync(CancellationToken);
+ AchievementGoals = goals.OrderBy(goal => goal.Order).ToList();
Archives = achievementService.GetArchiveCollection();
@@ -265,7 +268,8 @@ internal class AchievementViewModel
private async Task AddArchiveAsync()
{
- (bool isOk, string name) = await new AchievementArchiveCreateDialog(App.Window!).GetInputAsync();
+ MainWindow mainWindow = Ioc.Default.GetRequiredService();
+ (bool isOk, string name) = await new AchievementArchiveCreateDialog(mainWindow).GetInputAsync();
if (isOk)
{
@@ -292,7 +296,8 @@ internal class AchievementViewModel
{
if (Archives != null && SelectedArchive != null)
{
- ContentDialogResult result = await new ContentDialog2(App.Window!)
+ MainWindow mainWindow = Ioc.Default.GetRequiredService();
+ ContentDialogResult result = await new ContentDialog2(mainWindow)
{
Title = $"确定要删除存档 {SelectedArchive.Name} 吗?",
Content = "该操作是不可逆的,该存档和其内的所有成就状态会丢失。",
@@ -321,25 +326,9 @@ internal class AchievementViewModel
return;
}
- string json = await Clipboard.GetContent().GetTextAsync();
-
- if (GetUIAFFromString(json) is UIAF uiaf)
+ if (await GetUIAFFromClipboardAsync() is UIAF uiaf)
{
- if (uiaf.IsCurrentVersionSupported())
- {
- (bool isOk, ImportOption option) = await new AchievementImportDialog(App.Window!, uiaf).GetImportOptionAsync();
-
- if (isOk)
- {
- ImportResult result = achievementService.ImportFromUIAF(achievementService.CurrentArchive, uiaf.List, option);
- infoBarService!.Success($"新增:{result.Add} 个成就 | 更新:{result.Update} 个成就 | 删除{result.Remove} 个成就");
- await UpdateAchievementsAsync(achievementService.CurrentArchive);
- }
- }
- else
- {
- await ShowImportFailDialogAsync("数据的 UIAF 版本过低,无法导入");
- }
+ await TryImportUIAFInternalAsync(achievementService.CurrentArchive, uiaf);
}
else
{
@@ -363,21 +352,7 @@ internal class AchievementViewModel
{
if (await GetUIAFFromFileAsync(file) is UIAF uiaf)
{
- if (uiaf.IsCurrentVersionSupported())
- {
- (bool isOk, ImportOption option) = await new AchievementImportDialog(App.Window!, uiaf).GetImportOptionAsync();
-
- if (isOk)
- {
- ImportResult result = achievementService.ImportFromUIAF(achievementService.CurrentArchive, uiaf.List, option);
- infoBarService!.Success($"新增:{result.Add} 个成就 | 更新:{result.Update} 个成就 | 删除{result.Remove} 个成就");
- await UpdateAchievementsAsync(achievementService.CurrentArchive);
- }
- }
- else
- {
- await ShowImportFailDialogAsync("数据的 UIAF 版本过低,无法导入");
- }
+ await TryImportUIAFInternalAsync(achievementService.CurrentArchive, uiaf);
}
else
{
@@ -386,9 +361,20 @@ internal class AchievementViewModel
}
}
- private UIAF? GetUIAFFromString(string json)
+ private async Task GetUIAFFromClipboardAsync()
{
UIAF? uiaf = null;
+ string json;
+ try
+ {
+ json = await Clipboard.GetContent().GetTextAsync();
+ }
+ catch (COMException ex)
+ {
+ infoBarService?.Error(ex);
+ return null;
+ }
+
try
{
uiaf = JsonSerializer.Deserialize(json, options);
@@ -422,6 +408,41 @@ internal class AchievementViewModel
return uiaf;
}
+ private async Task TryImportUIAFInternalAsync(Model.Entity.AchievementArchive archive, UIAF uiaf)
+ {
+ if (uiaf.IsCurrentVersionSupported())
+ {
+ MainWindow mainWindow = Ioc.Default.GetRequiredService();
+ (bool isOk, ImportOption option) = await new AchievementImportDialog(mainWindow, uiaf).GetImportOptionAsync();
+
+ if (isOk)
+ {
+ ContentDialog2 importingDialog = new(Ioc.Default.GetRequiredService())
+ {
+ Title = "导入成就中",
+ Content = new ProgressBar() { IsIndeterminate = true },
+ DefaultButton = ContentDialogButton.Primary,
+ };
+
+ ImportResult result;
+ using (importingDialog.BlockInteraction())
+ {
+ result = await achievementService.ImportFromUIAFAsync(archive, uiaf.List, option);
+ }
+
+ infoBarService.Success(result.ToString());
+ await UpdateAchievementsAsync(archive);
+ return true;
+ }
+ }
+ else
+ {
+ await ShowImportFailDialogAsync("数据的 UIAF 版本过低,无法导入");
+ }
+
+ return false;
+ }
+
private void UpdateAchievementFilter(AchievementGoal? goal)
{
if (Achievements != null)
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs
index 987937ef..537f91a8 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/ExperimentalFeaturesViewModel.cs
@@ -7,6 +7,7 @@ using Snap.Hutao.Factory.Abstraction;
using Snap.Hutao.Service.Abstraction;
using Snap.Hutao.Service.Sign;
using System.Text;
+using Windows.Storage;
using Windows.System;
namespace Snap.Hutao.ViewModel;
@@ -60,7 +61,7 @@ internal class ExperimentalFeaturesViewModel : ObservableObject
private Task OpenCacheFolderAsync()
{
- return Launcher.LaunchFolderAsync(App.CacheFolder).AsTask();
+ return Launcher.LaunchFolderAsync(ApplicationData.Current.TemporaryFolder).AsTask();
}
private Task OpenDataFolderAsync()
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs
index 21457a57..1adde3a6 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/UserViewModel.cs
@@ -121,7 +121,8 @@ internal class UserViewModel : ObservableObject
private async Task AddUserAsync()
{
// Get cookie from user input
- (bool isOk, string cookie) = await new UserDialog(App.Window!).GetInputCookieAsync();
+ MainWindow mainWindow = Ioc.Default.GetRequiredService();
+ (bool isOk, string cookie) = await new UserDialog(mainWindow).GetInputCookieAsync();
// User confirms the input
if (isOk)
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs
index 4b8267f2..f5fe7055 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Hk4e/Common/Announcement/Announcement.cs
@@ -161,7 +161,7 @@ public class Announcement : AnnouncementContent
/// 提醒版本
///
[JsonPropertyName("remind_ver")]
- public int RemindVer { get; set; }
+ public int RemindVersion { get; set; }
///
/// 是否含有内容