From c5dada3f72558c8b2efcef2d987ea45f15d8f1e0 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Sat, 15 Jul 2023 22:54:50 +0800 Subject: [PATCH] guide window --- .../DependencyInjectionTest.cs | 2 +- .../Snap.Hutao/Core/LifeCycle/Activation.cs | 11 ++++- .../Snap.Hutao/Core/Setting/SettingKeys.cs | 5 +++ src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml | 35 ++++++++++++++++ src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml.cs | 40 +++++++++++++++++++ .../Snap.Hutao/LaunchGameWindow.xaml | 1 - .../Snap.Hutao/LaunchGameWindow.xaml.cs | 8 ++-- .../Snap.Hutao/Package.appxmanifest | 2 +- .../Resource/Localization/SH.Designer.cs | 9 +++++ .../Snap.Hutao/Resource/Localization/SH.resx | 3 ++ .../Factory/GachaStatisticsExtension.cs | 4 +- .../Factory/TypedWishSummaryBuilder.cs | 2 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 13 ++++++ .../View/Control/StatisticsCard.xaml | 3 +- .../Snap.Hutao/View/Guide/GuideView.xaml | 28 +++++++++++++ .../Snap.Hutao/View/Guide/GuideView.xaml.cs | 20 ++++++++++ .../ViewModel/GachaLog/SummaryItem.cs | 5 +++ .../Snap.Hutao/ViewModel/Guide/GuideState.cs | 20 ++++++++++ .../ViewModel/Guide/GuideViewModel.cs | 16 ++++++++ 19 files changed, 215 insertions(+), 12 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml create mode 100644 src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideState.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs diff --git a/src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs b/src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs index dd31a6b3..05e390dd 100644 --- a/src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs +++ b/src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using System; namespace Snap.Hutao.Test; diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs index ef09f39d..3d51f653 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs @@ -9,6 +9,7 @@ using Snap.Hutao.Service.DailyNote; using Snap.Hutao.Service.Hutao; using Snap.Hutao.Service.Metadata; using Snap.Hutao.Service.Navigation; +using Snap.Hutao.ViewModel.Guide; using System.Diagnostics; namespace Snap.Hutao.Core.LifeCycle; @@ -149,7 +150,15 @@ internal sealed class Activation : IActivation // Increase launch times LocalSetting.Set(SettingKeys.LaunchTimes, LocalSetting.Get(SettingKeys.LaunchTimes, 0) + 1); - await WaitMainWindowAsync().ConfigureAwait(false); + if (LocalSetting.Get(SettingKeys.Major1Minor7Revision0GuideState, (uint)GuideState.None) < (uint)GuideState.Completed) + { + await taskContext.SwitchToMainThreadAsync(); + serviceProvider.GetRequiredService(); + } + else + { + await WaitMainWindowAsync().ConfigureAwait(false); + } } private async Task WaitMainWindowAsync() diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs b/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs index 9a4e7d21..6b27d46d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Setting/SettingKeys.cs @@ -45,6 +45,11 @@ internal static class SettingKeys /// public const string IsInfoBarToggleChecked = "IsInfoBarToggleChecked"; + /// + /// 1.7.0 版本指引状态 + /// + public const string Major1Minor7Revision0GuideState = "Major1Minor7Revision0GuideState"; + #region StaticResource /// diff --git a/src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml b/src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml new file mode 100644 index 00000000..4e7739fa --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml.cs b/src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml.cs new file mode 100644 index 00000000..e3bf17d2 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/GuideWindow.xaml.cs @@ -0,0 +1,40 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml; +using Snap.Hutao.Core.Windowing; +using Windows.Win32.UI.WindowsAndMessaging; + +namespace Snap.Hutao; + +/// +/// ָ +/// +[Injection(InjectAs.Singleton)] +internal sealed partial class GuideWindow : Window, IWindowOptionsSource +{ + private const int MinWidth = 800; + private const int MinHeight = 450; + + private const int MaxWidth = 1200; + private const int MaxHeight = 750; + + private readonly WindowOptions windowOptions; + + public GuideWindow(IServiceProvider serviceProvider) + { + InitializeComponent(); + windowOptions = new(this, DragableGrid, new(MinWidth, MinHeight)); + ExtendedWindow.Initialize(this, Ioc.Default); + } + + WindowOptions IWindowOptionsSource.WindowOptions { get => windowOptions; } + + public unsafe void ProcessMinMaxInfo(MINMAXINFO* pInfo, double scalingFactor) + { + pInfo->ptMinTrackSize.X = (int)Math.Max(MinWidth * scalingFactor, pInfo->ptMinTrackSize.X); + pInfo->ptMinTrackSize.Y = (int)Math.Max(MinHeight * scalingFactor, pInfo->ptMinTrackSize.Y); + pInfo->ptMaxTrackSize.X = (int)Math.Min(MaxWidth * scalingFactor, pInfo->ptMaxTrackSize.X); + pInfo->ptMaxTrackSize.Y = (int)Math.Min(MaxHeight * scalingFactor, pInfo->ptMaxTrackSize.Y); + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml index df1bf4a5..54be3a57 100644 --- a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml +++ b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml @@ -11,7 +11,6 @@ mc:Ignorable="d"> - diff --git a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs index a2b0ae5b..735e4e27 100644 --- a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs +++ b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml.cs @@ -27,13 +27,13 @@ internal sealed partial class LaunchGameWindow : Window, IDisposable, IWindowOpt /// /// 构造一个新的启动游戏窗口 /// - /// 范围工厂 - public LaunchGameWindow(IServiceScopeFactory scopeFactory) + /// 服务提供器 + public LaunchGameWindow(IServiceProvider serviceProvider) { InitializeComponent(); - scope = scopeFactory.CreateScope(); - windowOptions = new(this, DragableGrid, new(320, 320)); + scope = serviceProvider.CreateScope(); + windowOptions = new(this, DragableGrid, new(MaxWidth, MaxHeight)); ExtendedWindow.Initialize(this, scope.ServiceProvider); RootGrid.DataContext = scope.ServiceProvider.GetRequiredService(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest index a8b63caa..157edda4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.6.6.0" /> Snap Hutao diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index fc124f96..6ee9d15e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -267,6 +267,15 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 欢迎使用胡桃 的本地化字符串。 + /// + internal static string GuideWindowTitle { + get { + return ResourceManager.GetString("GuideWindowTitle", resourceCulture); + } + } + /// /// 查找类似 选择账号并启动 的本地化字符串。 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 1023f6b4..55623d9b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -2132,4 +2132,7 @@ {0:00.000%} 概率下一抽获得五星物品 + + 欢迎使用胡桃 + \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs index 3c9ffd8a..46628523 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsExtension.cs @@ -41,7 +41,8 @@ internal static class GachaStatisticsExtension /// 完成添加 /// /// 简述物品列表 - public static void CompleteAdding(this List summaryItems) + /// 五星保底阈值 + public static void CompleteAdding(this List summaryItems, int guaranteeOrangeThreshold) { // we can't trust first item's prev state. bool isPreviousUp = true; @@ -56,6 +57,7 @@ internal static class GachaStatisticsExtension isPreviousUp = item.IsUp; item.Color = GetColorByName(item.Name); + item.GuaranteeOrangeThreshold = guaranteeOrangeThreshold; } // reverse items diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs index 83fa4b55..595b4652 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/TypedWishSummaryBuilder.cs @@ -142,7 +142,7 @@ internal sealed class TypedWishSummaryBuilder /// 类型化祈愿统计信息 public TypedWishSummary ToTypedWishSummary() { - summaryItems.CompleteAdding(); + summaryItems.CompleteAdding(guaranteeOrangeThreshold); double totalCount = totalCountTracker; TypedWishSummary summary = new() diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 6a2e08d4..f68545c8 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -73,6 +73,7 @@ + @@ -137,6 +138,7 @@ + @@ -302,6 +304,12 @@ + + + MSBuild:Compile + + + MSBuild:Compile @@ -596,4 +604,9 @@ MSBuild:Compile + + + MSBuild:Compile + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml index ecc12a95..3eba6420 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/StatisticsCard.xaml @@ -22,7 +22,6 @@ - @@ -36,7 +35,7 @@ MinHeight="32" Background="{ThemeResource CardBackgroundFillColorSecondaryBrush}" CornerRadius="{StaticResource CompatCornerRadius}" - Maximum="{Binding Path=DataContext.GuaranteeOrangeThreshold, Source={StaticResource SummaryProxy}}" + Maximum="{Binding GuaranteeOrangeThreshold}" Opacity="0.2" Value="{Binding LastPull}"> diff --git a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml new file mode 100644 index 00000000..3d29b4f8 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs new file mode 100644 index 00000000..4996d50f --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/View/Guide/GuideView.xaml.cs @@ -0,0 +1,20 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml.Controls; +using Snap.Hutao.ViewModel.Guide; + +namespace Snap.Hutao.View.Guide; + +/// +/// 指引视图 +/// +internal sealed partial class GuideView : UserControl +{ + public GuideView() + { + InitializeComponent(); + DataContext = Ioc.Default.GetRequiredService(); + _ = 1; + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/SummaryItem.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/SummaryItem.cs index 27c4b46d..e25c02f0 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/SummaryItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/SummaryItem.cs @@ -21,6 +21,11 @@ internal sealed class SummaryItem : Item /// public bool IsGuarantee { get; set; } + /// + /// 五星保底阈值 + /// + public int GuaranteeOrangeThreshold { get; set; } + /// /// 据上次 /// diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideState.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideState.cs new file mode 100644 index 00000000..fb11ca11 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideState.cs @@ -0,0 +1,20 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.ViewModel.Guide; + +/// +/// 指引状态 +/// +internal enum GuideState : uint +{ + /// + /// 尚未开始 + /// + None, + + /// + /// 完成 + /// + Completed, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs new file mode 100644 index 00000000..392ed422 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Guide/GuideViewModel.cs @@ -0,0 +1,16 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.ViewModel.Guide; + +/// +/// 指引视图模型 +/// +[Injection(InjectAs.Transient)] +internal sealed class GuideViewModel : Abstraction.ViewModel +{ + protected override Task OpenUIAsync() + { + throw new NotImplementedException(); + } +} \ No newline at end of file