Improve re-display function

This commit is contained in:
Michael Bucari-Tovo 2022-07-15 13:09:19 -06:00
parent d62821cd60
commit c2a2e51bde
9 changed files with 100 additions and 93 deletions

View File

@ -55,6 +55,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
public abstract bool IsSeries { get; }
public abstract bool IsEpisode { get; }
public abstract bool IsBook { get; }
public IBrush BackgroundBrush => IsEpisode ? App.SeriesEntryGridBackgroundBrush : null;
#endregion

View File

@ -9,6 +9,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
{
private string _filterString;
private string _removeBooksButtonText = "Remove # Books from Libation";
private bool _removeBooksButtonEnabled = true;
private bool _autoScanChecked = true;
private bool _firstFilterIsDefault = true;
private bool _removeButtonsVisible = true;
@ -31,6 +32,10 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
public string RemoveBooksButtonText { get => _removeBooksButtonText; set => this.RaiseAndSetIfChanged(ref _removeBooksButtonText, value); }
/// <summary> Indicates if the "Remove # Books from Libation" button is enabled </summary>
public bool RemoveBooksButtonEnabled { get => _removeBooksButtonEnabled; set { this.RaiseAndSetIfChanged(ref _removeBooksButtonEnabled, value); } }
/// <summary> Auto scanning accounts is enables </summary>
public bool AutoScanChecked
{
@ -44,7 +49,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
}
/// <summary> Indicates that the first quick filter is the default filter </summary>
/// <summary> Indicates if the first quick filter is the default filter </summary>
public bool FirstFilterIsDefault
{
get => _firstFilterIsDefault;
@ -57,7 +62,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
}
/// <summary> Indicates if the "Remove # Books from Libation" and "Done Removing" buttons shouls be visible </summary>
/// <summary> Indicates if the "Remove # Books from Libation" and "Done Removing" buttons should be visible </summary>
public bool RemoveButtonsVisible
{
get => _removeButtonsVisible;
@ -70,6 +75,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
/// <summary> The number of accounts currently being scanned </summary>
public int NumAccountsScanning
{
@ -83,7 +89,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
}
}
/// <summary> Indicates that Libation is currently scanning account(s) </summary>
/// <summary> Indicates if Libation is currently scanning account(s) </summary>
public bool ActivelyScanning => _numAccountsScanning > 0;
/// <summary> Indicates if the "Remove Books" menu items are enabled</summary>
public bool RemoveMenuItemsEnabled => !RemoveButtonsVisible && !ActivelyScanning;
@ -183,16 +189,12 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
? $"Begin _PDF Only Backups: {LibraryStats.pdfsNotDownloaded} remaining"
: "All PDFs have been downloaded";
this.RaisePropertyChanged(nameof(HasBookResults));
this.RaisePropertyChanged(nameof(StatusCountText));
this.RaisePropertyChanged(nameof(BookBackupsToolStripText));
this.RaisePropertyChanged(nameof(PdfBackupsToolStripText));
}
}
/// <summary> Indicates whether the library contains any books </summary>
public bool HasBookResults => LibraryStats?.HasBookResults ?? false;
/// <summary> Bottom-left library statistics display text </summary>
public string StatusCountText { get; private set; } = "[Calculating backed up book quantities] | [Calculating backed up PDFs]";
/// <summary> The "Begin Book and PDF Backup" menu item header text </summary>

View File

@ -61,6 +61,7 @@ namespace LibationWinForms.AvaloniaUI.Views
productsDisplay.Filter(null);
_viewModel.RemoveBooksButtonEnabled = true;
_viewModel.RemoveButtonsVisible = true;
await productsDisplay.ScanAndRemoveBooksAsync(accounts);
@ -68,7 +69,9 @@ namespace LibationWinForms.AvaloniaUI.Views
public async void removeBooksBtn_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
{
_viewModel.RemoveBooksButtonEnabled = false;
await productsDisplay.RemoveCheckedBooksAsync();
_viewModel.RemoveBooksButtonEnabled = true;
}
public async void doneRemovingBtn_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)

View File

@ -41,11 +41,13 @@
</MenuItem.Icon>
</MenuItem>
<MenuItem IsVisible="{Binding !AnyAccounts}" Click="noAccountsYetAddAccountToolStripMenuItem_Click" Header="No accounts yet. A_dd Account..." />
<!-- Scan Library -->
<MenuItem IsVisible="{Binding OneAccount}" IsEnabled="{Binding !ActivelyScanning}" Click="scanLibraryToolStripMenuItem_Click" Header="Scan _Library" />
<MenuItem IsVisible="{Binding MultipleAccounts}" IsEnabled="{Binding !ActivelyScanning}" Click="scanLibraryOfAllAccountsToolStripMenuItem_Click" Header="Scan Library of _All Accounts" />
<MenuItem IsVisible="{Binding MultipleAccounts}" IsEnabled="{Binding !ActivelyScanning}" Click="scanLibraryOfSomeAccountsToolStripMenuItem_Click" Header="Scan Library of _Some Accounts" />
<Separator />
<!-- Remove Books -->
<MenuItem IsVisible="{Binding OneAccount}" IsEnabled="{Binding RemoveMenuItemsEnabled}" Click="removeLibraryBooksToolStripMenuItem_Click" Header="_Remove Library Books" />
<MenuItem IsVisible="{Binding MultipleAccounts}" IsEnabled="{Binding RemoveMenuItemsEnabled}" Click="removeAllAccountsToolStripMenuItem_Click" Header="_Remove Books from All Accounts" />
@ -77,7 +79,7 @@
<Setter Property="Height" Value="NaN"/>
</Style>
</MenuItem.Styles>
<MenuItem IsEnabled="{Binding HasBookResults}" Click="exportLibraryToolStripMenuItem_Click" Header="E_xport Library" />
<MenuItem IsEnabled="{Binding LibraryStats.HasBookResults}" Click="exportLibraryToolStripMenuItem_Click" Header="E_xport Library" />
</MenuItem>
<!-- Quick Filters Menu -->
@ -149,7 +151,7 @@
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<Button IsVisible="{Binding RemoveButtonsVisible}" Click="removeBooksBtn_Click" Height="30" Width="220" Content="{Binding RemoveBooksButtonText}"/>
<Button IsVisible="{Binding RemoveButtonsVisible}" IsEnabled="{Binding RemoveBooksButtonEnabled}" Click="removeBooksBtn_Click" Height="30" Width="220" Content="{Binding RemoveBooksButtonText}"/>
<Button IsVisible="{Binding RemoveButtonsVisible}" Click="doneRemovingBtn_Click" Height="30" Width="160" Margin="10,0,0,0" Content="Done Removing Books"/>
</StackPanel>

View File

@ -53,7 +53,7 @@ namespace LibationWinForms.AvaloniaUI.Views.ProductsGrid
string existingFilter = _viewModel?.GridEntries?.Filter;
var newEntries = ProductsDisplayViewModel.CreateGridEntries(dbBooks);
var existingSeriesEntries = bindingList.InternalList.SeriesEntries().ToList();
var existingSeriesEntries = bindingList.AllItems().SeriesEntries().ToList();
await Dispatcher.UIThread.InvokeAsync(() => bindingList.ReplaceList(newEntries));
@ -65,9 +65,11 @@ namespace LibationWinForms.AvaloniaUI.Views.ProductsGrid
if (sEntry is SeriesEntrys2 se && !series.Liberate.Expanded)
await Dispatcher.UIThread.InvokeAsync(() => bindingList.CollapseItem(se));
}
bindingList.Filter = existingFilter;
ReSort();
await Dispatcher.UIThread.InvokeAsync(() =>
{
bindingList.Filter = existingFilter;
ReSort();
});
}
}
catch (Exception ex)

View File

@ -91,6 +91,9 @@ namespace LibationWinForms.AvaloniaUI.Views.ProductsGrid
RemovableCountChanged?.Invoke(this, 0);
removeGVColumn.IsVisible = true;
foreach (var item in bindingList.AllItems())
item.PropertyChanged += Item_PropertyChanged;
try
{
if (accounts is null || accounts.Length == 0)
@ -111,11 +114,6 @@ namespace LibationWinForms.AvaloniaUI.Views.ProductsGrid
foreach (var r in removable)
r.Remove = true;
RemovableCountChanged?.Invoke(this, GetAllBookEntries().Count(lbe => lbe.Remove is true));
foreach (var item in bindingList.AllItems())
item.PropertyChanged += Item_PropertyChanged;
}
catch (Exception ex)
{

View File

@ -17,7 +17,7 @@
<DataGrid.Columns>
<controls:DataGridCheckBoxColumnExt IsVisible="False" Header="Remove" IsThreeState="True" IsReadOnly="False" CanUserSort="True" Binding="{Binding Remove, Mode=TwoWay}" Width="70" SortMemberPath="Remove"/>
<controls:DataGridCheckBoxColumnExt IsVisible="True" Header="Remove" IsThreeState="True" IsReadOnly="False" CanUserSort="True" Binding="{Binding Remove, Mode=TwoWay}" Width="70" SortMemberPath="Remove" />
<DataGridTemplateColumn CanUserSort="True" Width="75" Header="Liberate" SortMemberPath="Liberate">
<DataGridTemplateColumn.CellTemplate>
@ -42,9 +42,11 @@
<DataGridTemplateColumn MinWidth="150" Width="2*" Header="Title" CanUserSort="True" SortMemberPath="Title">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Title}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border Background="{Binding BackgroundBrush}" BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Title}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -52,9 +54,11 @@
<DataGridTemplateColumn MinWidth="80" Width="1*" Header="Authors" CanUserSort="True" SortMemberPath="Authors">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Authors}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Authors}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -62,9 +66,11 @@
<DataGridTemplateColumn MinWidth="80" Width="1*" Header="Narrators" CanUserSort="True" SortMemberPath="Narrators">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Narrators}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Narrators}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -72,9 +78,11 @@
<DataGridTemplateColumn Width="90" Header="Length" CanUserSort="True" SortMemberPath="Length">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Length}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Length}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -82,9 +90,11 @@
<DataGridTemplateColumn MinWidth="80" Width="1*" Header="Series" CanUserSort="True" SortMemberPath="Series">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Series}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Series}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -92,9 +102,11 @@
<DataGridTemplateColumn MinWidth="100" Width="1*" Header="Description" CanUserSort="True" SortMemberPath="Description">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock Tapped="Description_Click" VerticalAlignment="Center" TextWrapping="Wrap" ToolTip.Tip="Click to see full description" Text="{Binding Description}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock Tapped="Description_Click" VerticalAlignment="Center" TextWrapping="Wrap" ToolTip.Tip="Click to see full description" Text="{Binding Description}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -102,9 +114,11 @@
<DataGridTemplateColumn Width="100" Header="Category" CanUserSort="True" SortMemberPath="Category">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Category}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Category}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -112,9 +126,11 @@
<DataGridTemplateColumn Width="120" Header="Product&#xA;Rating" CanUserSort="True" SortMemberPath="ProductRating">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" FontSize="11" Text="{Binding ProductRating}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" FontSize="11" Text="{Binding ProductRating}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -122,9 +138,11 @@
<DataGridTemplateColumn Width="90" Header="Purchase&#xA;Date" CanUserSort="True" SortMemberPath="PurchaseDate">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding PurchaseDate}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding PurchaseDate}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -132,9 +150,11 @@
<DataGridTemplateColumn Width="120" Header="My Rating" CanUserSort="True" SortMemberPath="MyRating">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" FontSize="11" Text="{Binding MyRating}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" FontSize="11" Text="{Binding MyRating}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
@ -142,9 +162,11 @@
<DataGridTemplateColumn Width="135" Header="Misc" CanUserSort="True" SortMemberPath="Misc">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="WrapWithOverflow" FontSize="10" Text="{Binding Misc}" />
</Border>
<Panel Background="{Binding BackgroundBrush}">
<Border BorderThickness="3" Height="80">
<TextBlock VerticalAlignment="Center" TextWrapping="WrapWithOverflow" FontSize="10" Text="{Binding Misc}" />
</Border>
</Panel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

View File

@ -66,31 +66,8 @@ namespace LibationWinForms.AvaloniaUI.Views.ProductsGrid
productsGrid = this.FindControl<DataGrid>(nameof(productsGrid));
productsGrid.Sorting += ProductsGrid_Sorting;
productsGrid.CanUserSortColumns = true;
productsGrid.LoadingRow += ProductsGrid_LoadingRow;
removeGVColumn = productsGrid.Columns[0];
}
private static object tagObj = new();
private void ProductsGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
if (e.Row.Tag == tagObj)
return;
e.Row.Tag = tagObj;
static IBrush GetRowColor(DataGridRow row)
=> row.DataContext is GridEntry2 gEntry
&& gEntry is LibraryBookEntry2 lbEntry
&& lbEntry.Parent is not null
? App.SeriesEntryGridBackgroundBrush
: null;
e.Row.Background = GetRowColor(e.Row);
e.Row.DataContextChanged += (sender, e) =>
{
var row = sender as DataGridRow;
row.Background = GetRowColor(row);
};
}
}
}

View File

@ -53,7 +53,7 @@ namespace LibationWinForms
Min 1492 2316
Q1 1562 2358
Med 1567 2379
Q2 1567 2379
Q2 1600 2418
Max 2837 5835
*/