diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs
index 1263d84f..18bbdbad 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.Constant.cs
@@ -19,6 +19,7 @@ internal sealed partial class SettingEntry
public const string AnnouncementRegion = "AnnouncementRegion";
public const string IsEmptyHistoryWishVisible = "IsEmptyHistoryWishVisible";
+ public const string IsUnobtainedWishItemVisible = "IsUnobtainedWishItemVisible";
public const string GeetestCustomCompositeUrl = "GeetestCustomCompositeUrl";
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
index 34f52421..58c6d46b 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
@@ -2702,6 +2702,12 @@
贡献翻译
+
+ 在祈愿记录页面角色与武器页签显示未抽取到的祈愿物品
+
+
+ 未抽取到的祈愿物品
+
前往商店
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs
index b09b066b..9fb24aa6 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs
@@ -16,6 +16,7 @@ namespace Snap.Hutao.Service;
internal sealed partial class AppOptions : DbStoreOptions
{
private bool? isEmptyHistoryWishVisible;
+ private bool? isUnobtainedWishItemVisible;
private BackdropType? backdropType;
private ElementTheme? elementTheme;
private BackgroundImageType? backgroundImageType;
@@ -24,10 +25,16 @@ internal sealed partial class AppOptions : DbStoreOptions
public bool IsEmptyHistoryWishVisible
{
- get => GetOption(ref isEmptyHistoryWishVisible, SettingEntry.IsEmptyHistoryWishVisible);
+ get => GetOption(ref isEmptyHistoryWishVisible, SettingEntry.IsEmptyHistoryWishVisible, false);
set => SetOption(ref isEmptyHistoryWishVisible, SettingEntry.IsEmptyHistoryWishVisible, value);
}
+ public bool IsUnobtainedWishItemVisible
+ {
+ get => GetOption(ref isUnobtainedWishItemVisible, SettingEntry.IsUnobtainedWishItemVisible, false);
+ set => SetOption(ref isUnobtainedWishItemVisible, SettingEntry.IsUnobtainedWishItemVisible, value);
+ }
+
public List> BackdropTypes { get; } = CollectionsNameValue.FromEnum(type => type >= 0);
public BackdropType BackdropType
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs
index 035fb8bd..cc988e76 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/GachaStatisticsFactory.cs
@@ -3,6 +3,7 @@
using Snap.Hutao.Core.ExceptionService;
using Snap.Hutao.Model.Intrinsic;
+using Snap.Hutao.Model.Metadata;
using Snap.Hutao.Model.Metadata.Avatar;
using Snap.Hutao.Model.Metadata.Weapon;
using Snap.Hutao.Service.Metadata;
@@ -10,6 +11,7 @@ using Snap.Hutao.Service.Metadata.ContextAbstraction;
using Snap.Hutao.ViewModel.GachaLog;
using Snap.Hutao.Web.Hoyolab.Hk4e.Event.GachaInfo;
using Snap.Hutao.Web.Hutao.GachaLog;
+using System.Collections.Frozen;
using System.Runtime.InteropServices;
namespace Snap.Hutao.Service.GachaLog.Factory;
@@ -22,7 +24,24 @@ namespace Snap.Hutao.Service.GachaLog.Factory;
[Injection(InjectAs.Scoped, typeof(IGachaStatisticsFactory))]
internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
{
- private readonly IMetadataService metadataService;
+ private static readonly FrozenSet BlueStandardWeaponIdsSet = FrozenSet.ToFrozenSet(
+ [
+ 11301U, 11302U, 11306U,
+ 12301U, 12302U, 12305U,
+ 13303U,
+ 14301U, 14302U, 14304U,
+ 15301U, 15302U, 15304U
+ ]);
+
+ private static readonly FrozenSet PurpleStandardWeaponIdsSet = FrozenSet.ToFrozenSet(
+ [
+ 11401U, 11402U, 11403U, 11405U,
+ 12401U, 12402U, 12403U, 12405U,
+ 13401U, 13407U,
+ 14401U, 14402U, 14403U, 14409U,
+ 15401U, 15402U, 15403U, 15405U
+ ]);
+
private readonly HomaGachaLogClient homaGachaLogClient;
private readonly ITaskContext taskContext;
private readonly AppOptions options;
@@ -33,7 +52,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
await taskContext.SwitchToBackgroundAsync();
List historyWishBuilders = context.GachaEvents.SelectList(gachaEvent => new HistoryWishBuilder(gachaEvent, context));
- return CreateCore(taskContext, homaGachaLogClient, items, historyWishBuilders, context, options.IsEmptyHistoryWishVisible);
+ return CreateCore(taskContext, homaGachaLogClient, items, historyWishBuilders, context, options);
}
private static GachaStatistics CreateCore(
@@ -42,7 +61,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
List items,
List historyWishBuilders,
in GachaLogServiceMetadataContext context,
- bool isEmptyHistoryWishVisible)
+ AppOptions appOptions)
{
TypedWishSummaryBuilderContext standardContext = TypedWishSummaryBuilderContext.StandardWish(taskContext, gachaLogClient);
TypedWishSummaryBuilder standardWishBuilder = new(standardContext);
@@ -62,6 +81,45 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
Dictionary purpleWeaponCounter = [];
Dictionary blueWeaponCounter = [];
+ if (appOptions.IsUnobtainedWishItemVisible)
+ {
+ orangeAvatarCounter = context.IdAvatarMap.Values
+ .Where(avatar => avatar.Quality == QualityType.QUALITY_ORANGE)
+ .ToDictionary(avatar => avatar, _ => 0);
+ purpleAvatarCounter = context.IdAvatarMap.Values
+ .Where(avatar => avatar.Quality == QualityType.QUALITY_PURPLE)
+ .ToDictionary(avatar => avatar, _ => 0);
+ orangeWeaponCounter = context.IdWeaponMap.Values
+ .Where(weapon => weapon.Quality == QualityType.QUALITY_ORANGE)
+ .ToDictionary(weapon => weapon, _ => 0);
+
+ HashSet purpleWeapons = [];
+ foreach (uint weaponId in PurpleStandardWeaponIdsSet)
+ {
+ purpleWeapons.Add(context.IdWeaponMap[weaponId]);
+ }
+
+ foreach (GachaEvent gachaEvent in context.GachaEvents)
+ {
+ if (gachaEvent.Type is GachaType.ActivityWeapon)
+ {
+ foreach (uint weaponId in gachaEvent.UpPurpleList)
+ {
+ purpleWeapons.Add(context.IdWeaponMap[weaponId]);
+ }
+ }
+ }
+
+ HashSet blueWeapons = [];
+ foreach (uint weaponId in BlueStandardWeaponIdsSet)
+ {
+ blueWeapons.Add(context.IdWeaponMap[weaponId]);
+ }
+
+ purpleWeaponCounter = purpleWeapons.ToDictionary(weapon => weapon, _ => 0);
+ blueWeaponCounter = blueWeapons.ToDictionary(weapon => weapon, _ => 0);
+ }
+
// Pre group builders
Dictionary> historyWishBuilderMap = historyWishBuilders
.GroupBy(b => b.ConfigType)
@@ -148,7 +206,7 @@ internal sealed partial class GachaStatisticsFactory : IGachaStatisticsFactory
{
// history
HistoryWishes = historyWishBuilders
- .Where(b => isEmptyHistoryWishVisible || (!b.IsEmpty))
+ .Where(b => appOptions.IsEmptyHistoryWishVisible || (!b.IsEmpty))
.OrderByDescending(builder => builder.From)
.ThenBy(builder => builder.ConfigType, GachaTypeComparer.Shared)
.Select(builder => builder.ToHistoryWish())
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml
index 46245bd0..42c3b62c 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml
@@ -3,7 +3,8 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cw="using:CommunityToolkit.WinUI"
- xmlns:cwc="using:CommunityToolkit.WinUI.Controls"
+ xmlns:cwcont="using:CommunityToolkit.WinUI.Controls"
+ xmlns:cwconv="using:CommunityToolkit.WinUI.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mxi="using:Microsoft.Xaml.Interactivity"
@@ -24,6 +25,11 @@
+
+ 1.0
+ 0.4
+
+
@@ -120,12 +126,12 @@
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewPageGachaLogHutaoCloudNotAllowed}"
TextAlignment="Center"/>
-
-
-
+
-
+
@@ -501,35 +508,35 @@
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{shcm:ResourceString Name=ViewPageGachaLogHint}"/>
-
-
-
-
-
-
+
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
index 3a701268..0c9cec0e 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/SettingPage.xaml
@@ -559,6 +559,15 @@
OffContent="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleOff}"
OnContent="{shcm:ResourceString Name=ViewPageSettingEmptyHistoryVisibleOn}"/>
+
+
+