Remain classes and fix adding row to EditTagsDialog

This commit is contained in:
Michael Bucari-Tovo 2022-07-17 00:59:26 -06:00
parent 4cfe72a63b
commit 51fee4ae24
22 changed files with 140 additions and 129 deletions

View File

@ -10,7 +10,7 @@ namespace LibationWinForms.AvaloniaUI.Controls
{
//Only SeriesEntry types have three-state checks, individual LibraryEntry books are binary.
var ele = base.GenerateEditingElementDirect(cell, dataItem) as CheckBox;
ele.IsThreeState = dataItem is SeriesEntrys2;
ele.IsThreeState = dataItem is SeriesEntry;
return ele;
}
}

View File

@ -22,7 +22,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
SomeRemoved
}
/// <summary>The View Model base for the DataGridView</summary>
public abstract class GridEntry2 : ViewModelBase
public abstract class GridEntry : ViewModelBase
{
[Browsable(false)] public string AudibleProductId => Book.AudibleProductId;
[Browsable(false)] public LibraryBook LibraryBook { get; protected set; }
@ -50,7 +50,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
protected bool? _remove = false;
public abstract bool? Remove { get; set; }
public abstract LiberateButtonStatus2 Liberate { get; }
public abstract LiberateButtonStatus Liberate { get; }
public abstract BookTags BookTags { get; }
public abstract bool IsSeries { get; }
public abstract bool IsEpisode { get; }
@ -61,7 +61,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#region Sorting
public GridEntry2() => _memberValues = CreateMemberValueDictionary();
public GridEntry() => _memberValues = CreateMemberValueDictionary();
// These methods are implementation of Dinah.Core.DataBinding.IMemberComparable
// Used by GridEntryBindingList for all sorting
@ -79,7 +79,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
{ typeof(float), new ObjectComparer<float>() },
{ typeof(bool), new ObjectComparer<bool>() },
{ typeof(DateTime), new ObjectComparer<DateTime>() },
{ typeof(LiberateButtonStatus2), new ObjectComparer<LiberateButtonStatus2>() },
{ typeof(LiberateButtonStatus), new ObjectComparer<LiberateButtonStatus>() },
};
#endregion
@ -113,7 +113,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#region Static library display functions
/// <summary>This information should not change during <see cref="GridEntry2"/> lifetime, so call only once.</summary>
/// <summary>This information should not change during <see cref="GridEntry"/> lifetime, so call only once.</summary>
protected static string GetDescriptionDisplay(Book book)
{
var doc = new HtmlAgilityPack.HtmlDocument();
@ -131,7 +131,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
/// <summary>
/// This information should not change during <see cref="GridEntry2"/> lifetime, so call only once.
/// This information should not change during <see cref="GridEntry"/> lifetime, so call only once.
/// Maximum of 5 text rows will fit in 80-pixel row height.
/// </summary>
protected static string GetMiscDisplay(LibraryBook libraryBook)
@ -161,7 +161,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#endregion
~GridEntry2()
~GridEntry()
{
PictureStorage.PictureCached -= PictureStorage_PictureCached;
}

View File

@ -23,32 +23,32 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
* but requires ResetCollection() to be called after all changes
* have been made.
*/
public class GridEntryBindingList2 : ObservableCollection<GridEntry2>
public class GridEntryCollection : ObservableCollection<GridEntry>
{
public GridEntryBindingList2(IEnumerable<GridEntry2> enumeration)
: base(new List<GridEntry2>(enumeration)) { }
public GridEntryBindingList2(List<GridEntry2> list)
public GridEntryCollection(IEnumerable<GridEntry> enumeration)
: base(new List<GridEntry>(enumeration)) { }
public GridEntryCollection(List<GridEntry> list)
: base(list) { }
public List<GridEntry2> InternalList => Items as List<GridEntry2>;
public List<GridEntry> InternalList => Items as List<GridEntry>;
/// <returns>All items in the list, including those filtered out.</returns>
public List<GridEntry2> AllItems() => Items.Concat(FilterRemoved).ToList();
public List<GridEntry> AllItems() => Items.Concat(FilterRemoved).ToList();
/// <summary>When true, itms will not be checked filtered by search criteria on item changed<summary>
public bool SuspendFilteringOnUpdate { get; set; }
public string Filter { get => FilterString; set => ApplyFilter(value); }
/// <summary> Items that were removed from the base list due to filtering </summary>
private readonly List<GridEntry2> FilterRemoved = new();
private readonly List<GridEntry> FilterRemoved = new();
private string FilterString;
private SearchResultSet SearchResults;
#region Items Management
public void ReplaceList(IEnumerable<GridEntry2> newItems)
public void ReplaceList(IEnumerable<GridEntry> newItems)
{
Items.Clear();
((List<GridEntry2>)Items).AddRange(newItems);
((List<GridEntry>)Items).AddRange(newItems);
ResetCollection();
}
public void ResetCollection()
@ -67,7 +67,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
FilterString = filterString;
SearchResults = SearchEngineCommands.Search(filterString);
var booksFilteredIn = Items.BookEntries().Join(SearchResults.Docs, lbe => lbe.AudibleProductId, d => d.ProductId, (lbe, d) => (GridEntry2)lbe);
var booksFilteredIn = Items.BookEntries().Join(SearchResults.Docs, lbe => lbe.AudibleProductId, d => d.ProductId, (lbe, d) => (GridEntry)lbe);
//Find all series containing children that match the search criteria
var seriesFilteredIn = Items.SeriesEntries().Where(s => s.Children.Join(SearchResults.Docs, lbe => lbe.AudibleProductId, d => d.ProductId, (lbe, d) => lbe).Any());
@ -90,7 +90,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
foreach (var item in FilterRemoved.ToList())
{
if (item is SeriesEntrys2 || item is LibraryBookEntry2 lbe && (lbe.Parent is null || lbe.Parent.Liberate.Expanded))
if (item is SeriesEntry || item is LibraryBookEntry lbe && (lbe.Parent is null || lbe.Parent.Liberate.Expanded))
{
FilterRemoved.Remove(item);
@ -119,7 +119,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
ExpandItem(series);
}
public void CollapseItem(SeriesEntrys2 sEntry)
public void CollapseItem(SeriesEntry sEntry)
{
foreach (var episode in Items.BookEntries().Where(b => b.Parent == sEntry).OrderByDescending(lbe => lbe.SeriesIndex).ToList())
{
@ -141,7 +141,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
ResetCollection();
}
public void ExpandItem(SeriesEntrys2 sEntry)
public void ExpandItem(SeriesEntry sEntry)
{
var sindex = Items.IndexOf(sEntry);

View File

@ -6,9 +6,9 @@ using System.Collections.Generic;
namespace LibationWinForms.AvaloniaUI.ViewModels
{
public class LiberateButtonStatus2 : ViewModelBase, IComparable
public class LiberateButtonStatus : ViewModelBase, IComparable
{
public LiberateButtonStatus2(bool isSeries)
public LiberateButtonStatus(bool isSeries)
{
IsSeries = isSeries;
}
@ -35,7 +35,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
/// <summary> Defines the Liberate column's sorting behavior </summary>
public int CompareTo(object obj)
{
if (obj is not LiberateButtonStatus2 second) return -1;
if (obj is not LiberateButtonStatus second) return -1;
if (IsSeries && !second.IsSeries) return -1;
else if (!IsSeries && second.IsSeries) return 1;

View File

@ -10,10 +10,10 @@ using System.Linq;
namespace LibationWinForms.AvaloniaUI.ViewModels
{
/// <summary>The View Model for a LibraryBook that is ContentType.Product or ContentType.Episode</summary>
public class LibraryBookEntry2 : GridEntry2
public class LibraryBookEntry : GridEntry
{
[Browsable(false)] public override DateTime DateAdded => LibraryBook.DateAdded;
[Browsable(false)] public SeriesEntrys2 Parent { get; init; }
[Browsable(false)] public SeriesEntry Parent { get; init; }
#region Model properties exposed to the view
@ -33,7 +33,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
}
}
public override LiberateButtonStatus2 Liberate
public override LiberateButtonStatus Liberate
{
get
{
@ -44,7 +44,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
_pdfStatus = LibraryCommands.Pdf_Status(LibraryBook.Book);
lastStatusUpdate = DateTime.Now;
}
return new LiberateButtonStatus2(IsSeries) { BookStatus = _bookStatus, PdfStatus = _pdfStatus };
return new LiberateButtonStatus(IsSeries) { BookStatus = _bookStatus, PdfStatus = _pdfStatus };
}
}
@ -56,7 +56,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#endregion
public LibraryBookEntry2(LibraryBook libraryBook)
public LibraryBookEntry(LibraryBook libraryBook)
{
LibraryBook = libraryBook;
LoadCover();
@ -144,7 +144,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#endregion
~LibraryBookEntry2()
~LibraryBookEntry()
{
UserDefinedItem.ItemChanged -= UserDefinedItem_ItemChanged;
}

View File

@ -36,7 +36,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
/// <summary>
/// This is the viewmodel for queued processables
/// </summary>
public class ProcessBook2 : ViewModelBase
public class ProcessBookViewModel : ViewModelBase
{
public event EventHandler Completed;
@ -91,7 +91,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
private readonly Queue<Func<Processable>> Processes = new();
private readonly ProcessQueue.LogMe Logger;
public ProcessBook2(LibraryBook libraryBook, ProcessQueue.LogMe logme)
public ProcessBookViewModel(LibraryBook libraryBook, ProcessQueue.LogMe logme)
{
LibraryBook = libraryBook;
Logger = logme;

View File

@ -14,10 +14,10 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
public class ProcessQueueViewModel : ViewModelBase, ProcessQueue.ILogForm
{
public ObservableCollection<LogEntry> LogEntries { get; } = new();
public TrackedQueue2<ProcessBook2> Items { get; } = new();
public TrackedQueue<ProcessBookViewModel> Items { get; } = new();
private TrackedQueue2<ProcessBook2> Queue => Items;
public ProcessBook2 SelectedItem { get; set; }
private TrackedQueue<ProcessBookViewModel> Queue => Items;
public ProcessBookViewModel SelectedItem { get; set; }
public Task QueueRunner { get; private set; }
public bool Running => !QueueRunner?.IsCompleted ?? false;
@ -88,13 +88,13 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
public void AddDownloadPdf(IEnumerable<LibraryBook> entries)
{
List<ProcessBook2> procs = new();
List<ProcessBookViewModel> procs = new();
foreach (var entry in entries)
{
if (isBookInQueue(entry))
continue;
ProcessBook2 pbook = new(entry, Logger);
ProcessBookViewModel pbook = new(entry, Logger);
pbook.AddDownloadPdf();
procs.Add(pbook);
}
@ -105,13 +105,13 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
public void AddDownloadDecrypt(IEnumerable<LibraryBook> entries)
{
List<ProcessBook2> procs = new();
List<ProcessBookViewModel> procs = new();
foreach (var entry in entries)
{
if (isBookInQueue(entry))
continue;
ProcessBook2 pbook = new(entry, Logger);
ProcessBookViewModel pbook = new(entry, Logger);
pbook.AddDownloadDecryptBook();
pbook.AddDownloadPdf();
procs.Add(pbook);
@ -123,13 +123,13 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
public void AddConvertMp3(IEnumerable<LibraryBook> entries)
{
List<ProcessBook2> procs = new();
List<ProcessBookViewModel> procs = new();
foreach (var entry in entries)
{
if (isBookInQueue(entry))
continue;
ProcessBook2 pbook = new(entry, Logger);
ProcessBookViewModel pbook = new(entry, Logger);
pbook.AddConvertToMp3();
procs.Add(pbook);
}
@ -138,7 +138,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
AddToQueue(procs);
}
public void AddToQueue(IEnumerable<ProcessBook2> pbook)
public void AddToQueue(IEnumerable<ProcessBookViewModel> pbook)
{
Dispatcher.UIThread.Post(() =>
{

View File

@ -25,9 +25,9 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
private DataGridColumn _currentSortColumn;
private DataGrid productsDataGrid;
private GridEntryBindingList2 _gridEntries;
private GridEntryCollection _gridEntries;
private bool _removeColumnVisivle;
public GridEntryBindingList2 GridEntries { get => _gridEntries; private set => this.RaiseAndSetIfChanged(ref _gridEntries, value); }
public GridEntryCollection GridEntries { get => _gridEntries; private set => this.RaiseAndSetIfChanged(ref _gridEntries, value); }
public bool RemoveColumnVisivle { get => _removeColumnVisivle; private set => this.RaiseAndSetIfChanged(ref _removeColumnVisivle, value); }
public List<LibraryBook> GetVisibleBookEntries()
@ -35,14 +35,14 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
.BookEntries()
.Select(lbe => lbe.LibraryBook)
.ToList();
public IEnumerable<LibraryBookEntry2> GetAllBookEntries()
public IEnumerable<LibraryBookEntry> GetAllBookEntries()
=> GridEntries
.AllItems()
.BookEntries();
public ProductsDisplayViewModel() { }
public ProductsDisplayViewModel(List<GridEntry2> items)
public ProductsDisplayViewModel(List<GridEntry> items)
{
GridEntries = new GridEntryBindingList2(items);
GridEntries = new GridEntryCollection(items);
}
#region Display Functions
@ -50,7 +50,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
/// <summary>
/// Call once on load so we can modify access a private member with reflection
/// </summary>
public void RegisterCollectionChanged(ProductsDisplay2 productsDisplay = null)
public void RegisterCollectionChanged(ProductsDisplay productsDisplay = null)
{
productsDataGrid ??= productsDisplay?.productsGrid;
@ -67,7 +67,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
{
if (s != GridEntries) return;
var displayListGE = ((IEnumerable)DataSource_PI.GetValue(DataConnection_PI.GetValue(productsDataGrid))).Cast<GridEntry2>();
var displayListGE = ((IEnumerable)DataSource_PI.GetValue(DataConnection_PI.GetValue(productsDataGrid))).Cast<GridEntry>();
int index = 0;
foreach (var di in displayListGE)
{
@ -83,7 +83,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
{
try
{
GridEntries = new GridEntryBindingList2(CreateGridEntries(dbBooks));
GridEntries = new GridEntryCollection(CreateGridEntries(dbBooks));
GridEntries.CollapseAll();
int bookEntryCount = GridEntries.BookEntries().Count();
@ -119,7 +119,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
foreach (var series in existingSeriesEntries)
{
var sEntry = GridEntries.InternalList.FirstOrDefault(ge => ge.AudibleProductId == series.AudibleProductId);
if (sEntry is SeriesEntrys2 se && !series.Liberate.Expanded)
if (sEntry is SeriesEntry se && !series.Liberate.Expanded)
await Dispatcher.UIThread.InvokeAsync(() => GridEntries.CollapseItem(se));
}
await Dispatcher.UIThread.InvokeAsync(() =>
@ -134,12 +134,12 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
}
}
private static IEnumerable<GridEntry2> CreateGridEntries(IEnumerable<LibraryBook> dbBooks)
private static IEnumerable<GridEntry> CreateGridEntries(IEnumerable<LibraryBook> dbBooks)
{
var geList = dbBooks
.Where(lb => lb.Book.IsProduct())
.Select(b => new LibraryBookEntry2(b))
.Cast<GridEntry2>()
.Select(b => new LibraryBookEntry(b))
.Cast<GridEntry>()
.ToList();
var episodes = dbBooks.Where(lb => lb.Book.IsEpisodeChild());
@ -152,7 +152,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
if (!seriesEpisodes.Any()) continue;
var seriesEntry = new SeriesEntrys2(parent, seriesEpisodes);
var seriesEntry = new SeriesEntry(parent, seriesEpisodes);
geList.Add(seriesEntry);
geList.AddRange(seriesEntry.Children);
@ -160,7 +160,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
return geList.OrderByDescending(e => e.DateAdded);
}
public void ToggleSeriesExpanded(SeriesEntrys2 seriesEntry)
public void ToggleSeriesExpanded(SeriesEntry seriesEntry)
{
if (seriesEntry.Liberate.Expanded)
GridEntries.CollapseItem(seriesEntry);
@ -213,7 +213,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
if (_currentSortColumn is null)
{
//Sort ascending and reverse. That's how the comparer is designed to work to be compatible with Avalonia.
var defaultComparer = new RowComparer(ListSortDirection.Descending, nameof(GridEntry2.DateAdded));
var defaultComparer = new RowComparer(ListSortDirection.Descending, nameof(GridEntry.DateAdded));
GridEntries.InternalList.Sort(defaultComparer);
GridEntries.InternalList.Reverse();
GridEntries.ResetCollection();
@ -326,7 +326,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(GridEntry2.Remove) && sender is LibraryBookEntry2 lbEntry)
if (e.PropertyName == nameof(GridEntry.Remove) && sender is LibraryBookEntry lbEntry)
{
int removeCount = GetAllBookEntries().Count(lbe => lbe.Remove is true);
RemovableCountChanged?.Invoke(this, removeCount);

View File

@ -8,19 +8,19 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#nullable enable
internal static class QueryExtensions
{
public static IEnumerable<LibraryBookEntry2> BookEntries(this IEnumerable<GridEntry2> gridEntries)
=> gridEntries.OfType<LibraryBookEntry2>();
public static IEnumerable<LibraryBookEntry> BookEntries(this IEnumerable<GridEntry> gridEntries)
=> gridEntries.OfType<LibraryBookEntry>();
public static IEnumerable<SeriesEntrys2> SeriesEntries(this IEnumerable<GridEntry2> gridEntries)
=> gridEntries.OfType<SeriesEntrys2>();
public static IEnumerable<SeriesEntry> SeriesEntries(this IEnumerable<GridEntry> gridEntries)
=> gridEntries.OfType<SeriesEntry>();
public static T? FindByAsin<T>(this IEnumerable<T> gridEntries, string audibleProductID) where T : GridEntry2
public static T? FindByAsin<T>(this IEnumerable<T> gridEntries, string audibleProductID) where T : GridEntry
=> gridEntries.FirstOrDefault(i => i.AudibleProductId == audibleProductID);
public static IEnumerable<SeriesEntrys2> EmptySeries(this IEnumerable<GridEntry2> gridEntries)
public static IEnumerable<SeriesEntry> EmptySeries(this IEnumerable<GridEntry> gridEntries)
=> gridEntries.SeriesEntries().Where(i => i.Children.Count == 0);
public static SeriesEntrys2? FindSeriesParent(this IEnumerable<GridEntry2> gridEntries, LibraryBook seriesEpisode)
public static SeriesEntry? FindSeriesParent(this IEnumerable<GridEntry> gridEntries, LibraryBook seriesEpisode)
{
if (seriesEpisode.Book.SeriesLink is null) return null;

View File

@ -13,7 +13,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
/// sorted by series index, ascending. Stable sorting is achieved by comparing the GridEntry.ListIndex
/// properties when 2 items compare equal.
/// </summary>
internal class RowComparer : IComparer, IComparer<GridEntry2>
internal class RowComparer : IComparer, IComparer<GridEntry>
{
private static readonly PropertyInfo HeaderCellPi = typeof(DataGridColumn).GetProperty("HeaderCell", BindingFlags.NonPublic | BindingFlags.Instance);
private static readonly PropertyInfo CurrentSortingStatePi = typeof(DataGridColumnHeader).GetProperty("CurrentSortingState", BindingFlags.NonPublic | BindingFlags.Instance);
@ -39,17 +39,17 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
if (x is not null && y is null) return 1;
if (x is null && y is null) return 0;
var geA = (GridEntry2)x;
var geB = (GridEntry2)y;
var geA = (GridEntry)x;
var geB = (GridEntry)y;
SortDirection ??= GetSortOrder();
SeriesEntrys2 parentA = null;
SeriesEntrys2 parentB = null;
SeriesEntry parentA = null;
SeriesEntry parentB = null;
if (geA is LibraryBookEntry2 lbA && lbA.Parent is SeriesEntrys2 seA)
if (geA is LibraryBookEntry lbA && lbA.Parent is SeriesEntry seA)
parentA = seA;
if (geB is LibraryBookEntry2 lbB && lbB.Parent is SeriesEntrys2 seB)
if (geB is LibraryBookEntry lbB && lbB.Parent is SeriesEntry seB)
parentB = seB;
//both a and b are top-level grid entries
@ -88,7 +88,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
private ListSortDirection? GetSortOrder()
=> CurrentSortingStatePi.GetValue(HeaderCellPi.GetValue(Column)) as ListSortDirection?;
private int InternalCompare(GridEntry2 x, GridEntry2 y)
private int InternalCompare(GridEntry x, GridEntry y)
{
var val1 = x.GetMemberValue(PropertyName);
var val2 = y.GetMemberValue(PropertyName);
@ -103,7 +103,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
return compareResult;
}
public int Compare(GridEntry2 x, GridEntry2 y)
public int Compare(GridEntry x, GridEntry y)
{
return Compare((object)x, y);
}

View File

@ -10,9 +10,9 @@ using System.Linq;
namespace LibationWinForms.AvaloniaUI.ViewModels
{
/// <summary>The View Model for a LibraryBook that is ContentType.Parent</summary>
public class SeriesEntrys2 : GridEntry2
public class SeriesEntry : GridEntry
{
[Browsable(false)] public List<LibraryBookEntry2> Children { get; }
[Browsable(false)] public List<LibraryBookEntry> Children { get; }
[Browsable(false)] public override DateTime DateAdded => Children.Max(c => c.DateAdded);
private bool suspendCounting = false;
@ -44,7 +44,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
}
}
public override LiberateButtonStatus2 Liberate { get; }
public override LiberateButtonStatus Liberate { get; }
public override BookTags BookTags { get; } = new();
public override bool IsSeries => true;
@ -53,16 +53,16 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
#endregion
public SeriesEntrys2(LibraryBook parent, IEnumerable<LibraryBook> children)
public SeriesEntry(LibraryBook parent, IEnumerable<LibraryBook> children)
{
Liberate = new LiberateButtonStatus2(IsSeries) { Expanded = true };
Liberate = new LiberateButtonStatus(IsSeries) { Expanded = true };
SeriesIndex = -1;
LibraryBook = parent;
LoadCover();
Children = children
.Select(c => new LibraryBookEntry2(c) { Parent = this })
.Select(c => new LibraryBookEntry(c) { Parent = this })
.OrderBy(c => c.SeriesIndex)
.ToList();

View File

@ -33,7 +33,7 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
* and is stored in ObservableCollection.Items. When the primary list changes, the
* secondary list is cleared and reset to match the primary.
*/
public class TrackedQueue2<T> : ObservableCollection<T> where T : class
public class TrackedQueue<T> : ObservableCollection<T> where T : class
{
public event EventHandler<int> CompletedCountChanged;
public event EventHandler<int> QueuededCountChanged;

View File

@ -19,8 +19,8 @@ namespace LibationWinForms.AvaloniaUI.Views.Dialogs
get => _filterString;
set
{
IsDefault = string.IsNullOrEmpty(value);
this.RaiseAndSetIfChanged(ref _filterString, value);
IsDefault = string.IsNullOrEmpty(_filterString);
this.RaisePropertyChanged(nameof(IsDefault));
}
}
@ -54,7 +54,9 @@ namespace LibationWinForms.AvaloniaUI.Views.Dialogs
{
if (Filters.Any(f => f.IsDefault))
return;
Filters.Insert(Filters.Count, new Filter());
var newBlank = new Filter();
newBlank.PropertyChanged += Filter_PropertyChanged;
Filters.Insert(Filters.Count, newBlank);
}
protected override void SaveAndClose()

View File

@ -167,11 +167,11 @@
<!-- Process Queue -->
<SplitView.Pane>
<views:ProcessQueueControl2 DataContext="{Binding ProcessQueue}"/>
<views:ProcessQueueControl DataContext="{Binding ProcessQueue}"/>
</SplitView.Pane>
<!-- Product Display Grid -->
<views:ProductsDisplay2
<views:ProductsDisplay
Name="productsDisplay"
Initialized="ProductsDisplay_Initialized1"
DataContext="{Binding ProductsDisplay}"

View File

@ -72,7 +72,7 @@ namespace LibationWinForms.AvaloniaUI.Views
public void ProductsDisplay_Initialized1(object sender, EventArgs e)
{
if (sender is ProductsDisplay2 products)
if (sender is ProductsDisplay products)
_viewModel.ProductsDisplay.RegisterCollectionChanged(products);
}
@ -92,7 +92,7 @@ namespace LibationWinForms.AvaloniaUI.Views
private void FindAllControls()
{
quickFiltersToolStripMenuItem = this.FindControl<MenuItem>(nameof(quickFiltersToolStripMenuItem));
productsDisplay = this.FindControl<ProductsDisplay2>(nameof(productsDisplay));
productsDisplay = this.FindControl<ProductsDisplay>(nameof(productsDisplay));
}
protected override void OnDataContextChanged(EventArgs e)

View File

@ -3,7 +3,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="90" MaxHeight="90" MinHeight="90" MinWidth="300"
x:Class="LibationWinForms.AvaloniaUI.Views.ProcessBookControl2" Background="{Binding BackgroundColor}">
x:Class="LibationWinForms.AvaloniaUI.Views.ProcessBookControl" Background="{Binding BackgroundColor}">
<Border BorderBrush="{DynamicResource ProcessQueueBookBorderBrush}" BorderThickness="2">
<Grid ColumnDefinitions="Auto,*,Auto">

View File

@ -8,20 +8,20 @@ using DataLayer;
namespace LibationWinForms.AvaloniaUI.Views
{
public delegate void QueueItemPositionButtonClicked(ProcessBook2 item, QueuePosition queueButton);
public delegate void QueueItemCancelButtonClicked(ProcessBook2 item);
public partial class ProcessBookControl2 : UserControl
public delegate void QueueItemPositionButtonClicked(ProcessBookViewModel item, QueuePosition queueButton);
public delegate void QueueItemCancelButtonClicked(ProcessBookViewModel item);
public partial class ProcessBookControl : UserControl
{
public static event QueueItemPositionButtonClicked PositionButtonClicked;
public static event QueueItemCancelButtonClicked CancelButtonClicked;
public ProcessBookControl2()
public ProcessBookControl()
{
InitializeComponent();
if (Design.IsDesignMode)
{
using var context = DbContexts.GetContext();
DataContext = new ProcessBook2(
DataContext = new ProcessBookViewModel(
context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"),
ProcessQueue.LogMe.RegisterForm(default(ProcessQueue.ILogForm))
);
@ -29,7 +29,7 @@ namespace LibationWinForms.AvaloniaUI.Views
}
}
private ProcessBook2 DataItem => DataContext is null ? null : DataContext as ProcessBook2;
private ProcessBookViewModel DataItem => DataContext is null ? null : DataContext as ProcessBookViewModel;
public void Cancel_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
=> CancelButtonClicked?.Invoke(DataItem);

View File

@ -6,12 +6,12 @@
xmlns:views="clr-namespace:LibationWinForms.AvaloniaUI.Views"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
mc:Ignorable="d" d:DesignWidth="450" d:DesignHeight="850"
x:Class="LibationWinForms.AvaloniaUI.Views.ProcessQueueControl2">
x:Class="LibationWinForms.AvaloniaUI.Views.ProcessQueueControl">
<UserControl.Resources>
<RecyclePool x:Key="RecyclePool" />
<DataTemplate x:Key="queuedBook">
<views:ProcessBookControl2 />
<views:ProcessBookControl />
</DataTemplate>
<RecyclingElementFactory x:Key="elementFactory" RecyclePool="{StaticResource RecyclePool}">
<RecyclingElementFactory.Templates>

View File

@ -10,17 +10,17 @@ using System.Linq;
namespace LibationWinForms.AvaloniaUI.Views
{
public partial class ProcessQueueControl2 : UserControl
public partial class ProcessQueueControl : UserControl
{
private TrackedQueue2<ProcessBook2> Queue => _viewModel.Items;
private TrackedQueue<ProcessBookViewModel> Queue => _viewModel.Items;
private ProcessQueueViewModel _viewModel => DataContext as ProcessQueueViewModel;
public ProcessQueueControl2()
public ProcessQueueControl()
{
InitializeComponent();
ProcessBookControl2.PositionButtonClicked += ProcessBookControl2_ButtonClicked;
ProcessBookControl2.CancelButtonClicked += ProcessBookControl2_CancelButtonClicked;
ProcessBookControl.PositionButtonClicked += ProcessBookControl2_ButtonClicked;
ProcessBookControl.CancelButtonClicked += ProcessBookControl2_CancelButtonClicked;
#region Design Mode Testing
if (Design.IsDesignMode)
@ -29,44 +29,44 @@ namespace LibationWinForms.AvaloniaUI.Views
var Logger = ProcessQueue.LogMe.RegisterForm(vm);
DataContext = vm;
using var context = DbContexts.GetContext();
List<ProcessBook2> testList = new()
List<ProcessBookViewModel> testList = new()
{
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"), Logger)
{
Result = ProcessBookResult.FailedAbort,
Status = ProcessBookStatus.Failed,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4IWVG"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4IWVG"), Logger)
{
Result = ProcessBookResult.FailedSkip,
Status = ProcessBookStatus.Failed,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4JA2Q"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4JA2Q"), Logger)
{
Result = ProcessBookResult.FailedRetry,
Status = ProcessBookStatus.Failed,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4NUPO"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4NUPO"), Logger)
{
Result = ProcessBookResult.ValidationFail,
Status = ProcessBookStatus.Failed,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4NMX4"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4NMX4"), Logger)
{
Result = ProcessBookResult.Cancelled,
Status = ProcessBookStatus.Cancelled,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4NOZ0"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4NOZ0"), Logger)
{
Result = ProcessBookResult.Success,
Status = ProcessBookStatus.Completed,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017WJ5ZK6"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017WJ5ZK6"), Logger)
{
Result = ProcessBookResult.None,
Status = ProcessBookStatus.Working,
},
new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"), Logger)
new ProcessBookViewModel(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"), Logger)
{
Result = ProcessBookResult.None,
Status = ProcessBookStatus.Queued,
@ -93,14 +93,14 @@ namespace LibationWinForms.AvaloniaUI.Views
#region Control event handlers
private async void ProcessBookControl2_CancelButtonClicked(ProcessBook2 item)
private async void ProcessBookControl2_CancelButtonClicked(ProcessBookViewModel item)
{
if (item is not null)
await item.CancelAsync();
Queue.RemoveQueued(item);
}
private void ProcessBookControl2_ButtonClicked(ProcessBook2 item, QueuePosition queueButton)
private void ProcessBookControl2_ButtonClicked(ProcessBookViewModel item, QueuePosition queueButton)
{
Queue.MoveQueuePosition(item, queueButton);
}

View File

@ -5,7 +5,7 @@
xmlns:views="clr-namespace:LibationWinForms.AvaloniaUI.Views"
xmlns:controls="clr-namespace:LibationWinForms.AvaloniaUI.Controls"
mc:Ignorable="d" d:DesignWidth="1560" d:DesignHeight="400"
x:Class="LibationWinForms.AvaloniaUI.Views.ProductsDisplay2">
x:Class="LibationWinForms.AvaloniaUI.Views.ProductsDisplay">
<Grid>

View File

@ -13,29 +13,29 @@ using System.Linq;
namespace LibationWinForms.AvaloniaUI.Views
{
public partial class ProductsDisplay2 : UserControl
public partial class ProductsDisplay : UserControl
{
public event EventHandler<LibraryBook> LiberateClicked;
private ProductsDisplayViewModel _viewModel => DataContext as ProductsDisplayViewModel;
ImageDisplayDialog imageDisplayDialog;
public ProductsDisplay2()
public ProductsDisplay()
{
InitializeComponent();
if (Design.IsDesignMode)
{
using var context = DbContexts.GetContext();
List<GridEntry2> sampleEntries = new()
List<GridEntry> sampleEntries = new()
{
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G")),
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017V4IWVG")),
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017V4JA2Q")),
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017V4NUPO")),
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017V4NMX4")),
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017V4NOZ0")),
new LibraryBookEntry2(context.GetLibraryBook_Flat_NoTracking("B017WJ5ZK6")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017V4IWVG")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017V4JA2Q")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017V4NUPO")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017V4NMX4")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017V4NOZ0")),
new LibraryBookEntry(context.GetLibraryBook_Flat_NoTracking("B017WJ5ZK6")),
};
DataContext = new ProductsDisplayViewModel(sampleEntries);
return;
@ -101,7 +101,7 @@ namespace LibationWinForms.AvaloniaUI.Views
{
var itemName = column.SortMemberPath;
if (itemName == nameof(GridEntry2.Remove))
if (itemName == nameof(GridEntry.Remove))
continue;
menuItems.Add
@ -192,7 +192,7 @@ namespace LibationWinForms.AvaloniaUI.Views
{
var button = args.Source as Button;
if (button.DataContext is SeriesEntrys2 sEntry)
if (button.DataContext is SeriesEntry sEntry)
{
_viewModel.ToggleSeriesExpanded(sEntry);
@ -200,7 +200,7 @@ namespace LibationWinForms.AvaloniaUI.Views
//to the topright cell. Reset focus onto the clicked button's cell.
((sender as Control).Parent.Parent as DataGridCell)?.Focus();
}
else if (button.DataContext is LibraryBookEntry2 lbEntry)
else if (button.DataContext is LibraryBookEntry lbEntry)
{
LiberateClicked?.Invoke(this, lbEntry.LibraryBook);
}
@ -214,7 +214,7 @@ namespace LibationWinForms.AvaloniaUI.Views
public void Cover_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args)
{
if (sender is not Image tblock || tblock.DataContext is not GridEntry2 gEntry)
if (sender is not Image tblock || tblock.DataContext is not GridEntry gEntry)
return;
@ -254,7 +254,7 @@ namespace LibationWinForms.AvaloniaUI.Views
public void Description_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args)
{
if (sender is TextBlock tblock && tblock.DataContext is GridEntry2 gEntry)
if (sender is TextBlock tblock && tblock.DataContext is GridEntry gEntry)
{
var pt = tblock.Parent.PointToScreen(tblock.Parent.Bounds.TopRight);
var displayWindow = new DescriptionDisplayDialog
@ -283,7 +283,7 @@ namespace LibationWinForms.AvaloniaUI.Views
{
var button = args.Source as Button;
if (button.DataContext is LibraryBookEntry2 lbEntry && VisualRoot is Window window)
if (button.DataContext is LibraryBookEntry lbEntry && VisualRoot is Window window)
{
if (bookDetailsForm is null || !bookDetailsForm.IsVisible)
{

View File

@ -124,6 +124,15 @@
<Compile Update="AvaloniaUI\Views\Dialogs\ImageDisplayDialog.axaml.cs">
<DependentUpon>ImageDisplayDialog.axaml</DependentUpon>
</Compile>
<Compile Update="AvaloniaUI\Views\ProcessBookControl.axaml.cs">
<DependentUpon>ProcessBookControl.axaml</DependentUpon>
</Compile>
<Compile Update="AvaloniaUI\Views\ProcessQueueControl.axaml.cs">
<DependentUpon>ProcessQueueControl.axaml</DependentUpon>
</Compile>
<Compile Update="AvaloniaUI\Views\ProductsDisplay.axaml.cs">
<DependentUpon>ProductsDisplay.axaml</DependentUpon>
</Compile>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>