diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs index 2ae31d0e..787e64c2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/AdvancedDbCollectionView.cs @@ -23,9 +23,9 @@ internal sealed class AdvancedDbCollectionView : AdvancedCollectionView this.serviceProvider = serviceProvider; } - public IDisposable SuppressSavingToDatabase() + public IDisposable SuppressChangeCurrentItem() { - return new SavingToDatabaseSuppression(this); + return new CurrentItemSuppression(this); } protected override void OnCurrentChangedOverride() @@ -54,18 +54,21 @@ internal sealed class AdvancedDbCollectionView : AdvancedCollectionView } } - private sealed class SavingToDatabaseSuppression : IDisposable + private sealed class CurrentItemSuppression : IDisposable { private readonly AdvancedDbCollectionView view; + private readonly TEntity? currentItem; - public SavingToDatabaseSuppression(AdvancedDbCollectionView view) + public CurrentItemSuppression(AdvancedDbCollectionView view) { this.view = view; + currentItem = view.CurrentItem; view.savingToDatabase = false; } public void Dispose() { + view.MoveCurrentTo(currentItem); view.savingToDatabase = true; } } @@ -87,9 +90,9 @@ internal sealed class AdvancedDbCollectionView : Advance this.serviceProvider = serviceProvider; } - public IDisposable SuppressSavingToDatabase() + public IDisposable SuppressChangeCurrentItem() { - return new SavingToDatabaseSuppression(this); + return new CurrentItemSuppression(this); } protected override void OnCurrentChangedOverride() @@ -118,18 +121,21 @@ internal sealed class AdvancedDbCollectionView : Advance } } - private sealed class SavingToDatabaseSuppression : IDisposable + private sealed class CurrentItemSuppression : IDisposable { private readonly AdvancedDbCollectionView view; + private readonly TEntityAccess? currentItem; - public SavingToDatabaseSuppression(AdvancedDbCollectionView view) + public CurrentItemSuppression(AdvancedDbCollectionView view) { this.view = view; + currentItem = view.CurrentItem; view.savingToDatabase = false; } public void Dispose() { + view.MoveCurrentTo(currentItem); view.savingToDatabase = true; } } diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Database/IAdvancedDbCollectionView.cs b/src/Snap.Hutao/Snap.Hutao/Core/Database/IAdvancedDbCollectionView.cs index 8900e1d7..e3a132b9 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Database/IAdvancedDbCollectionView.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Database/IAdvancedDbCollectionView.cs @@ -8,5 +8,5 @@ namespace Snap.Hutao.Core.Database; internal interface IAdvancedDbCollectionView : IAdvancedCollectionView where TEntity : class { - IDisposable SuppressSavingToDatabase(); + IDisposable SuppressChangeCurrentItem(); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/UniformStaggeredLayoutState.cs b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/UniformStaggeredLayoutState.cs index d3e7c121..6f31057d 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/UniformStaggeredLayoutState.cs +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/UniformStaggeredLayoutState.cs @@ -117,12 +117,9 @@ internal sealed class UniformStaggeredLayoutState internal void RecycleElements() { - if (context.ItemCount > 0) + for (int i = 0; i < context.ItemCount; i++) { - for (int i = 0; i < items.Count; i++) - { - RecycleElementAt(i); - } + RecycleElementAt(i); } } diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/WrapLayoutState.cs b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/WrapLayoutState.cs index 3b76d464..d41da159 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/WrapLayoutState.cs +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/Control/Layout/WrapLayoutState.cs @@ -41,7 +41,7 @@ internal sealed class WrapLayoutState public void Clear() { - for (int i = 0; i < items.Count; i++) + for (int i = 0; i < context.ItemCount; i++) { RecycleElementAt(i); } diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml index c040e7ff..bd7dafff 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/AvatarPropertyPage.xaml @@ -491,7 +491,7 @@ - + - - + + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/CultivationPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/CultivationPage.xaml index 4dd41976..b8f46c4b 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/CultivationPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/CultivationPage.xaml @@ -260,150 +260,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 16 - 0 - 0 - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + 16 + 0 + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/GachaLogPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/GachaLogPage.xaml index 95716d25..adcbfe4b 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/GachaLogPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/GachaLogPage.xaml @@ -235,270 +235,8 @@ - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiAvatarPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiAvatarPage.xaml index 6289812e..c1c56677 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiAvatarPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiAvatarPage.xaml @@ -300,8 +300,11 @@ - - + + + + + @@ -812,6 +815,6 @@ - - + + \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiMonsterPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiMonsterPage.xaml index d31e0ab7..6eecc75f 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiMonsterPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiMonsterPage.xaml @@ -86,8 +86,11 @@ - - + + + + + @@ -220,6 +223,5 @@ - - + diff --git a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiWeaponPage.xaml b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiWeaponPage.xaml index 5d4a3fd3..2d6e3ef2 100644 --- a/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiWeaponPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/UI/Xaml/View/Page/WikiWeaponPage.xaml @@ -162,8 +162,11 @@ - - + + + + + @@ -419,6 +422,5 @@ - - + diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs index 128e8548..e60c426a 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Achievement/AchievementViewModel.cs @@ -148,7 +148,7 @@ internal sealed partial class AchievementViewModel : Abstraction.ViewModel, INav protected override void UninitializeOverride() { - using (Archives?.SuppressSavingToDatabase()) + using (Archives?.SuppressChangeCurrentItem()) { Archives = default; } diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarPropertyViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarPropertyViewModel.cs index 39c37d9a..4da123a3 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarPropertyViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/AvatarPropertyViewModel.cs @@ -122,6 +122,7 @@ internal sealed partial class AvatarPropertyViewModel : Abstraction.ViewModel, I { try { + IsInitialized = false; ValueResult summaryResult; using (await EnterCriticalSectionAsync().ConfigureAwait(false)) { @@ -166,6 +167,10 @@ internal sealed partial class AvatarPropertyViewModel : Abstraction.ViewModel, I catch (OperationCanceledException) { } + finally + { + IsInitialized = true; + } } [Command("CultivateCommand")] diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs index 1993e15b..f3179873 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/Cultivation/CultivationViewModel.cs @@ -41,6 +41,7 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel private List? inventoryItems; private ObservableCollection? cultivateEntries; private ObservableCollection? statisticsItems; + private bool entriesUpdating; public AdvancedDbCollectionView? Projects { @@ -65,6 +66,8 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel public ObservableCollection? CultivateEntries { get => cultivateEntries; set => SetProperty(ref cultivateEntries, value); } + public bool EntriesUpdating { get => entriesUpdating; set => SetProperty(ref entriesUpdating, value); } + public ObservableCollection? StatisticsItems { get => statisticsItems; set => SetProperty(ref statisticsItems, value); } protected override async ValueTask InitializeOverrideAsync() @@ -74,6 +77,13 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel await taskContext.SwitchToMainThreadAsync(); Projects = cultivationService.Projects; Projects.MoveCurrentTo(Projects.SourceCollection.SelectedOrDefault()); + + // Force update when re-entering the page + if (Projects.CurrentItem is not null && CultivateEntries is null) + { + await UpdateEntryCollectionAsync(Projects.CurrentItem).ConfigureAwait(false); + } + return true; } @@ -82,7 +92,7 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel protected override void UninitializeOverride() { - using (Projects?.SuppressSavingToDatabase()) + using (Projects?.SuppressChangeCurrentItem()) { Projects = default; } @@ -146,22 +156,31 @@ internal sealed partial class CultivationViewModel : Abstraction.ViewModel private async ValueTask UpdateEntryCollectionAsync(CultivateProject? project) { - if (project is null) + try { - return; + EntriesUpdating = true; + if (project is null) + { + return; + } + + CultivationMetadataContext context = await metadataService.GetContextAsync().ConfigureAwait(false); + + ObservableCollection entries = await cultivationService + .GetCultivateEntriesAsync(project, context) + .ConfigureAwait(false); + + await taskContext.SwitchToMainThreadAsync(); + CultivateEntries = entries; + + await UpdateInventoryItemsAsync().ConfigureAwait(false); + await UpdateStatisticsItemsAsync().ConfigureAwait(false); + } + finally + { + await taskContext.SwitchToMainThreadAsync(); + EntriesUpdating = false; } - - CultivationMetadataContext context = await metadataService.GetContextAsync().ConfigureAwait(false); - - ObservableCollection entries = await cultivationService - .GetCultivateEntriesAsync(project, context) - .ConfigureAwait(false); - - await taskContext.SwitchToMainThreadAsync(); - CultivateEntries = entries; - - await UpdateInventoryItemsAsync().ConfigureAwait(false); - await UpdateStatisticsItemsAsync().ConfigureAwait(false); } [Command("RemoveEntryCommand")] diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs index 413e8e66..78d3da8e 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/GachaLog/GachaLogViewModel.cs @@ -92,7 +92,14 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel Archives.MoveCurrentTo(Archives.SourceCollection.SelectedOrDefault()); } - return true; + // When `Archives.CurrentItem` is not null, the `Initialization` actually completed in + // `UpdateStatisticsAsync`, so we return false to make the view hide until the actual + // initialization is complete. But we return true when no archives are available, + // so that the empty view can show up. + if (Archives.CurrentItem is null) + { + return true; + } } } catch (OperationCanceledException) @@ -104,7 +111,7 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel protected override void UninitializeOverride() { - using (Archives?.SuppressSavingToDatabase()) + using (Archives?.SuppressChangeCurrentItem()) { Archives = default; } @@ -311,6 +318,7 @@ internal sealed partial class GachaLogViewModel : Abstraction.ViewModel { if (archive is null) { + IsInitialized = false; Statistics = default; return; }