From 67b058f1264e0db8cbdeabd35ccee736cce58c53 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Thu, 11 Apr 2024 13:50:12 +0800 Subject: [PATCH 1/4] fix hutao statistics unavailable --- .../Factory/HutaoStatisticsFactory.cs | 6 +-- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 33 +++++++++------- .../View/Control/HutaoStatisticsPanel.xaml | 13 +++++++ .../View/Control/HutaoStatisticsPanel.xaml.cs | 38 +++++++++++++++++++ .../Snap.Hutao/View/Page/GachaLogPage.xaml | 17 ++------- .../ViewModel/GachaLog/HutaoStatistics.cs | 2 +- 6 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml create mode 100644 src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs index f7c0ddaa..397f65ee 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/GachaLog/Factory/HutaoStatisticsFactory.cs @@ -19,7 +19,7 @@ internal sealed class HutaoStatisticsFactory private readonly GachaEvent avatarEvent; private readonly GachaEvent avatarEvent2; private readonly GachaEvent weaponEvent; - private readonly GachaEvent chronicledEvent; + private readonly GachaEvent? chronicledEvent; public HutaoStatisticsFactory(in HutaoStatisticsFactoryMetadataContext context) { @@ -32,7 +32,7 @@ internal sealed class HutaoStatisticsFactory avatarEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.ActivityAvatar); avatarEvent2 = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.SpecialActivityAvatar); weaponEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.ActivityWeapon); - chronicledEvent = context.GachaEvents.Single(g => g.From < now && g.To > now && g.Type == GachaType.ActivityCity); + chronicledEvent = context.GachaEvents.SingleOrDefault(g => g.From < now && g.To > now && g.Type == GachaType.ActivityCity); } public HutaoStatistics Create(GachaEventStatistics raw) @@ -42,7 +42,7 @@ internal sealed class HutaoStatisticsFactory AvatarEvent = CreateWishSummary(avatarEvent, raw.AvatarEvent), AvatarEvent2 = CreateWishSummary(avatarEvent2, raw.AvatarEvent2), WeaponEvent = CreateWishSummary(weaponEvent, raw.WeaponEvent), - Chronicled = CreateWishSummary(chronicledEvent, raw.Chronicled), + Chronicled = chronicledEvent is null ? null : CreateWishSummary(chronicledEvent, raw.Chronicled), }; } diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 7f427d0c..04a6a060 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -35,11 +35,11 @@ Debug;Release true true @@ -52,7 +52,7 @@ - + @@ -153,6 +153,7 @@ + @@ -205,7 +206,7 @@ - + @@ -220,7 +221,7 @@ - + @@ -348,6 +349,10 @@ package has not yet been restored --> + + + MSBuild:Compile + @@ -389,37 +394,37 @@ MSBuild:Compile - + MSBuild:Compile - + MSBuild:Compile - + MSBuild:Compile - + MSBuild:Compile - + MSBuild:Compile - + MSBuild:Compile @@ -569,13 +574,13 @@ MSBuild:Compile - + MSBuild:Compile - + MSBuild:Compile @@ -617,7 +622,7 @@ MSBuild:Compile - + diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml new file mode 100644 index 00000000..0a0e99e9 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs new file mode 100644 index 00000000..4dd8b5c1 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs @@ -0,0 +1,38 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.UI.Xaml; +using Snap.Hutao.Control.Panel; +using Snap.Hutao.ViewModel.GachaLog; + +namespace Snap.Hutao.View.Control; + +[DependencyProperty("Statistics", typeof(HutaoStatistics), default, nameof(OnStatisticsChanged))] +internal sealed partial class HutaoStatisticsPanel : HorizontalEqualPanel +{ + public HutaoStatisticsPanel() + { + InitializeComponent(); + + if (DataContext is HutaoStatistics statistics && statistics.Chronicled is { } chronicled) + { + Children.Add(new HutaoStatisticsCard + { + DataContext = chronicled, + }); + } + } + + private static void OnStatisticsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + HutaoStatisticsPanel panel = (HutaoStatisticsPanel)obj; + + if (args.NewValue is HutaoStatistics { Chronicled: { } chronicled }) + { + panel.Children.Add(new HutaoStatisticsCard + { + DataContext = chronicled, + }); + } + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml index 84c93d6c..1147c210 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml @@ -468,24 +468,15 @@ Margin="16" CornerRadius="{ThemeResource ControlCornerRadius}" IsLoading="{Binding HutaoCloudStatisticsViewModel.IsInitialized, Converter={StaticResource BoolNegationConverter}}"/> - - - - - - - - - - - - + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs index 1602ff3f..5824c5a8 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/HutaoStatistics.cs @@ -26,5 +26,5 @@ internal sealed class HutaoStatistics /// /// 集录祈愿 /// - public HutaoWishSummary Chronicled { get; set; } = default!; + public HutaoWishSummary? Chronicled { get; set; } } \ No newline at end of file From bbb97cd8027c7456167e96bedb087d46e7d82b46 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Thu, 11 Apr 2024 17:56:51 +0800 Subject: [PATCH 2/4] fix typo --- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 04a6a060..26eef9d5 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -349,6 +349,7 @@ package has not yet been restored --> + MSBuild:Compile From 2cec0f5e0e692d612e254eb173794fbbcb4cab02 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Wed, 17 Apr 2024 11:03:38 +0800 Subject: [PATCH 3/4] refactor GachaLog statistics --- .../Control/Panel/HorizontalEqualPanel.cs | 15 +++++++- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 6 --- .../View/Control/HutaoStatisticsPanel.xaml | 13 ------- .../View/Control/HutaoStatisticsPanel.xaml.cs | 38 ------------------- .../Snap.Hutao/View/Page/GachaLogPage.xaml | 9 +++-- 5 files changed, 19 insertions(+), 62 deletions(-) delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs b/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs index 1a9a893d..7828c2e9 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs @@ -18,11 +18,17 @@ internal partial class HorizontalEqualPanel : Microsoft.UI.Xaml.Controls.Panel protected override Size MeasureOverride(Size availableSize) { + int itemCount = Children.Count(child => child.Visibility is Visibility.Visible); foreach (UIElement child in Children) { + if (child.Visibility is Visibility.Collapsed) + { + continue; + } + // ScrollViewer will always return an Infinity Size, we should use ActualWidth for this situation. double availableWidth = double.IsInfinity(availableSize.Width) ? ActualWidth : availableSize.Width; - double childAvailableWidth = (availableWidth + Spacing) / Children.Count; + double childAvailableWidth = (availableWidth + Spacing) / itemCount; double childMaxAvailableWidth = Math.Max(MinItemWidth, childAvailableWidth); child.Measure(new(childMaxAvailableWidth - Spacing, ActualHeight)); } @@ -32,13 +38,18 @@ internal partial class HorizontalEqualPanel : Microsoft.UI.Xaml.Controls.Panel protected override Size ArrangeOverride(Size finalSize) { - int itemCount = Children.Count; + int itemCount = Children.Count(child => child.Visibility is Visibility.Visible); double availableItemWidth = (finalSize.Width - (Spacing * (itemCount - 1))) / itemCount; double actualItemWidth = Math.Max(MinItemWidth, availableItemWidth); double offset = 0; foreach (UIElement child in Children) { + if (child.Visibility is Visibility.Collapsed) + { + continue; + } + child.Arrange(new Rect(offset, 0, actualItemWidth, finalSize.Height)); offset += actualItemWidth + Spacing; } diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 26eef9d5..32071b4a 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -153,7 +153,6 @@ - @@ -350,11 +349,6 @@ - - - MSBuild:Compile - - MSBuild:Compile diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml b/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml deleted file mode 100644 index 0a0e99e9..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs deleted file mode 100644 index 4dd8b5c1..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Control/HutaoStatisticsPanel.xaml.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Microsoft.UI.Xaml; -using Snap.Hutao.Control.Panel; -using Snap.Hutao.ViewModel.GachaLog; - -namespace Snap.Hutao.View.Control; - -[DependencyProperty("Statistics", typeof(HutaoStatistics), default, nameof(OnStatisticsChanged))] -internal sealed partial class HutaoStatisticsPanel : HorizontalEqualPanel -{ - public HutaoStatisticsPanel() - { - InitializeComponent(); - - if (DataContext is HutaoStatistics statistics && statistics.Chronicled is { } chronicled) - { - Children.Add(new HutaoStatisticsCard - { - DataContext = chronicled, - }); - } - } - - private static void OnStatisticsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) - { - HutaoStatisticsPanel panel = (HutaoStatisticsPanel)obj; - - if (args.NewValue is HutaoStatistics { Chronicled: { } chronicled }) - { - panel.Children.Add(new HutaoStatisticsCard - { - DataContext = chronicled, - }); - } - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml index 1147c210..46245bd0 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/GachaLogPage.xaml @@ -468,15 +468,18 @@ Margin="16" CornerRadius="{ThemeResource ControlCornerRadius}" IsLoading="{Binding HutaoCloudStatisticsViewModel.IsInitialized, Converter={StaticResource BoolNegationConverter}}"/> - - + + + + + From 12492164918a9b665f7d38c2bf392b0ed8f4d5d6 Mon Sep 17 00:00:00 2001 From: Lightczx <1686188646@qq.com> Date: Wed, 17 Apr 2024 13:49:55 +0800 Subject: [PATCH 4/4] Update HorizontalEqualPanel.cs --- .../Control/Panel/HorizontalEqualPanel.cs | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs b/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs index 7828c2e9..4a1ac080 100644 --- a/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs +++ b/src/Snap.Hutao/Snap.Hutao/Control/Panel/HorizontalEqualPanel.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Microsoft.UI.Xaml; +using System.Runtime.InteropServices; using Windows.Foundation; namespace Snap.Hutao.Control.Panel; @@ -18,19 +19,14 @@ internal partial class HorizontalEqualPanel : Microsoft.UI.Xaml.Controls.Panel protected override Size MeasureOverride(Size availableSize) { - int itemCount = Children.Count(child => child.Visibility is Visibility.Visible); - foreach (UIElement child in Children) + List visibleChildren = Children.Where(child => child.Visibility is Visibility.Visible).ToList(); + foreach (ref readonly UIElement visibleChild in CollectionsMarshal.AsSpan(visibleChildren)) { - if (child.Visibility is Visibility.Collapsed) - { - continue; - } - // ScrollViewer will always return an Infinity Size, we should use ActualWidth for this situation. double availableWidth = double.IsInfinity(availableSize.Width) ? ActualWidth : availableSize.Width; - double childAvailableWidth = (availableWidth + Spacing) / itemCount; + double childAvailableWidth = (availableWidth + Spacing) / visibleChildren.Count; double childMaxAvailableWidth = Math.Max(MinItemWidth, childAvailableWidth); - child.Measure(new(childMaxAvailableWidth - Spacing, ActualHeight)); + visibleChild.Measure(new(childMaxAvailableWidth - Spacing, ActualHeight)); } return base.MeasureOverride(availableSize); @@ -38,19 +34,14 @@ internal partial class HorizontalEqualPanel : Microsoft.UI.Xaml.Controls.Panel protected override Size ArrangeOverride(Size finalSize) { - int itemCount = Children.Count(child => child.Visibility is Visibility.Visible); - double availableItemWidth = (finalSize.Width - (Spacing * (itemCount - 1))) / itemCount; + List visibleChildren = Children.Where(child => child.Visibility is Visibility.Visible).ToList(); + double availableItemWidth = (finalSize.Width - (Spacing * (visibleChildren.Count - 1))) / visibleChildren.Count; double actualItemWidth = Math.Max(MinItemWidth, availableItemWidth); double offset = 0; - foreach (UIElement child in Children) + foreach (ref readonly UIElement visibleChild in CollectionsMarshal.AsSpan(visibleChildren)) { - if (child.Visibility is Visibility.Collapsed) - { - continue; - } - - child.Arrange(new Rect(offset, 0, actualItemWidth, finalSize.Height)); + visibleChild.Arrange(new Rect(offset, 0, actualItemWidth, finalSize.Height)); offset += actualItemWidth + Spacing; } @@ -60,7 +51,8 @@ internal partial class HorizontalEqualPanel : Microsoft.UI.Xaml.Controls.Panel private static void OnLoaded(object sender, RoutedEventArgs e) { HorizontalEqualPanel panel = (HorizontalEqualPanel)sender; - panel.MinWidth = (panel.MinItemWidth * panel.Children.Count) + (panel.Spacing * (panel.Children.Count - 1)); + int vivibleChildrenCount = panel.Children.Count(child => child.Visibility is Visibility.Visible); + panel.MinWidth = (panel.MinItemWidth * vivibleChildrenCount) + (panel.Spacing * (vivibleChildrenCount - 1)); } private static void OnSizeChanged(object sender, SizeChangedEventArgs e)