From 2a25b7e0ada5f110143e36d74fa15f7ce829d4f7 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Thu, 27 Feb 2025 11:17:01 -0700 Subject: [PATCH] Load MainWindow before library finishes loading like Classic --- Source/LibationAvalonia/App.axaml.cs | 15 +++++++++------ Source/LibationAvalonia/ViewModels/MainVM.cs | 8 +++++++- .../ViewModels/ProductsDisplayViewModel.cs | 8 +++++++- .../LibationAvalonia/Views/MainWindow.axaml.cs | 18 ++++++++---------- .../GridView/LibraryBookEntry[TStatus].cs | 3 ++- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index 59fe3f75..70b091d6 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -1,8 +1,6 @@ using ApplicationServices; using Avalonia; -using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Input; using Avalonia.Markup.Xaml; using Avalonia.Media; using Avalonia.Platform; @@ -14,14 +12,13 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using ReactiveUI; -using DataLayer; +using Avalonia.Threading; namespace LibationAvalonia { public class App : Application { - public static Window MainWindow { get; private set; } + public static MainWindow MainWindow { get; private set; } public static IBrush ProcessQueueBookFailedBrush { get; private set; } public static IBrush ProcessQueueBookCompletedBrush { get; private set; } public static IBrush ProcessQueueBookCancelledBrush { get; private set; } @@ -216,11 +213,17 @@ namespace LibationAvalonia LoadStyles(); var mainWindow = new MainWindow(); desktop.MainWindow = MainWindow = mainWindow; - mainWindow.OnLibraryLoaded(LibraryTask.GetAwaiter().GetResult()); + mainWindow.Loaded += MainWindow_Loaded; mainWindow.RestoreSizeAndLocation(Configuration.Instance); mainWindow.Show(); } + private static async void MainWindow_Loaded(object sender, Avalonia.Interactivity.RoutedEventArgs e) + { + var library = await LibraryTask; + await Dispatcher.UIThread.InvokeAsync(() => MainWindow.OnLibraryLoadedAsync(library)); + } + private static void LoadStyles() { ProcessQueueBookFailedBrush = AvaloniaUtils.GetBrushFromResources(nameof(ProcessQueueBookFailedBrush)); diff --git a/Source/LibationAvalonia/ViewModels/MainVM.cs b/Source/LibationAvalonia/ViewModels/MainVM.cs index 86c69d9d..b5f102bd 100644 --- a/Source/LibationAvalonia/ViewModels/MainVM.cs +++ b/Source/LibationAvalonia/ViewModels/MainVM.cs @@ -20,7 +20,7 @@ namespace LibationAvalonia.ViewModels MainWindow = mainWindow; ProductsDisplay.RemovableCountChanged += (_, removeCount) => RemoveBooksButtonText = removeCount == 1 ? "Remove 1 Book from Libation" : $"Remove {removeCount} Books from Libation"; - LibraryCommands.LibrarySizeChanged += async (_, _) => await ProductsDisplay.UpdateGridAsync(DbContexts.GetLibrary_Flat_NoTracking(includeParents: true)); + LibraryCommands.LibrarySizeChanged += LibraryCommands_LibrarySizeChanged; Configure_NonUI(); Configure_BackupCounts(); @@ -34,6 +34,12 @@ namespace LibationAvalonia.ViewModels Configure_VisibleBooks(); } + private async void LibraryCommands_LibrarySizeChanged(object sender, System.EventArgs e) + { + var fullLibrary = await System.Threading.Tasks.Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true)); + await ProductsDisplay.UpdateGridAsync(fullLibrary); + } + private static string menufyText(string header) => Configuration.IsMacOs ? header : $"_{header}"; } } diff --git a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs index 419b387a..d8bfee95 100644 --- a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs @@ -28,7 +28,13 @@ namespace LibationAvalonia.ViewModels /// Grid entries included in the filter set. If null, all grid entries are shown private HashSet FilteredInGridEntries; public string FilterString { get; private set; } - public DataGridCollectionView GridEntries { get; private set; } + + private DataGridCollectionView _gridEntries; + public DataGridCollectionView GridEntries + { + get => _gridEntries; + private set => this.RaiseAndSetIfChanged(ref _gridEntries, value); + } private bool _removeColumnVisible; public bool RemoveColumnVisible { get => _removeColumnVisible; private set => this.RaiseAndSetIfChanged(ref _removeColumnVisible, value); } diff --git a/Source/LibationAvalonia/Views/MainWindow.axaml.cs b/Source/LibationAvalonia/Views/MainWindow.axaml.cs index 87823b17..1850c857 100644 --- a/Source/LibationAvalonia/Views/MainWindow.axaml.cs +++ b/Source/LibationAvalonia/Views/MainWindow.axaml.cs @@ -23,7 +23,6 @@ namespace LibationAvalonia.Views Opened += MainWindow_Opened; Closing += MainWindow_Closing; - LibraryLoaded += MainWindow_LibraryLoaded; KeyBindings.Add(new KeyBinding { Command = ReactiveCommand.Create(selectAndFocusSearchBox), Gesture = new KeyGesture(Key.F, Configuration.IsMacOs ? KeyModifiers.Meta : KeyModifiers.Control) }); @@ -56,21 +55,20 @@ namespace LibationAvalonia.Views this.SaveSizeAndLocation(Configuration.Instance); } - private async void MainWindow_LibraryLoaded(object sender, List dbBooks) - { - if (QuickFilters.UseDefault) - await ViewModel.PerformFilter(QuickFilters.Filters.FirstOrDefault()); - - await ViewModel.ProductsDisplay.BindToGridAsync(dbBooks); - } - private void selectAndFocusSearchBox() { filterSearchTb.SelectAll(); filterSearchTb.Focus(); } - public void OnLibraryLoaded(List initialLibrary) => LibraryLoaded?.Invoke(this, initialLibrary); + public async System.Threading.Tasks.Task OnLibraryLoadedAsync(List initialLibrary) + { + if (QuickFilters.UseDefault) + await ViewModel.PerformFilter(QuickFilters.Filters.FirstOrDefault()); + + await ViewModel.ProductsDisplay.BindToGridAsync(initialLibrary); + } + public void ProductsDisplay_LiberateClicked(object _, LibraryBook libraryBook) => ViewModel.LiberateClicked(libraryBook); public void ProductsDisplay_LiberateSeriesClicked(object _, ISeriesEntry series) => ViewModel.LiberateSeriesClicked(series); public void ProductsDisplay_ConvertToMp3Clicked(object _, LibraryBook libraryBook) => ViewModel.ConvertToMp3Clicked(libraryBook); diff --git a/Source/LibationUiBase/GridView/LibraryBookEntry[TStatus].cs b/Source/LibationUiBase/GridView/LibraryBookEntry[TStatus].cs index 062bd376..85fbb9ea 100644 --- a/Source/LibationUiBase/GridView/LibraryBookEntry[TStatus].cs +++ b/Source/LibationUiBase/GridView/LibraryBookEntry[TStatus].cs @@ -33,10 +33,11 @@ namespace LibationUiBase.GridView LoadCover(); } - public static async Task> GetAllProductsAsync(IEnumerable libraryBooks) { var products = libraryBooks.Where(lb => lb.Book.IsProduct()).ToArray(); + if (products.Length == 0) + return []; int parallelism = int.Max(1, Environment.ProcessorCount - 1);