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);