diff --git a/Source/LibationWinForms/AvaloniaUI/Controls/GroupBox.axaml b/Source/LibationWinForms/AvaloniaUI/Controls/GroupBox.axaml
new file mode 100644
index 00000000..f6395f35
--- /dev/null
+++ b/Source/LibationWinForms/AvaloniaUI/Controls/GroupBox.axaml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/LibationWinForms/AvaloniaUI/Controls/GroupBox.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Controls/GroupBox.axaml.cs
new file mode 100644
index 00000000..094e8a3e
--- /dev/null
+++ b/Source/LibationWinForms/AvaloniaUI/Controls/GroupBox.axaml.cs
@@ -0,0 +1,38 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace LibationWinForms.AvaloniaUI.Controls
+{
+ public partial class GroupBox : ContentControl
+ {
+
+ public static readonly StyledProperty BorderWidthProperty =
+ AvaloniaProperty.Register(nameof(BorderWidth));
+
+ public static readonly StyledProperty LabelProperty =
+ AvaloniaProperty.Register(nameof(Label));
+ public GroupBox()
+ {
+ InitializeComponent();
+ BorderWidth = new Thickness(3);
+ Label = "This is a groupbox label";
+ }
+ public Thickness BorderWidth
+ {
+ get { return GetValue(BorderWidthProperty); }
+ set { SetValue(BorderWidthProperty, value); }
+ }
+
+ public string Label
+ {
+ get { return GetValue(LabelProperty); }
+ set { SetValue(LabelProperty, value); }
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+ }
+}
diff --git a/Source/LibationWinForms/AvaloniaUI/FormSaveExtension2.cs b/Source/LibationWinForms/AvaloniaUI/FormSaveExtension2.cs
index 0f3bfd8d..d595f2b3 100644
--- a/Source/LibationWinForms/AvaloniaUI/FormSaveExtension2.cs
+++ b/Source/LibationWinForms/AvaloniaUI/FormSaveExtension2.cs
@@ -24,7 +24,7 @@ namespace LibationWinForms.AvaloniaUI
public static void RestoreSizeAndLocation(this Window form, Configuration config)
{
- FormSizeAndPosition savedState = config.GetNonString(form.Name);
+ FormSizeAndPosition savedState = config.GetNonString(form.GetType().Name);
if (savedState is null)
return;
@@ -79,7 +79,7 @@ namespace LibationWinForms.AvaloniaUI
saveState.Width = (int)form.Bounds.Size.Width;
saveState.Height = (int)form.Bounds.Size.Height;
- config.SetObject(form.Name, saveState);
+ config.SetObject(form.GetType().Name, saveState);
}
class FormSizeAndPosition
diff --git a/Source/LibationWinForms/AvaloniaUI/MessageBox.cs b/Source/LibationWinForms/AvaloniaUI/MessageBox.cs
index 52b50202..9583bcee 100644
--- a/Source/LibationWinForms/AvaloniaUI/MessageBox.cs
+++ b/Source/LibationWinForms/AvaloniaUI/MessageBox.cs
@@ -201,7 +201,7 @@ namespace LibationWinForms.AvaloniaUI
return await ShowCore(owner, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
}
- public static async Task ShowConfirmationDialog(Window owner, IEnumerable libraryBooks, string format, string title)
+ public static async Task ShowConfirmationDialog(Window owner, IEnumerable libraryBooks, string format, string title, MessageBoxDefaultButton defaultButton = MessageBoxDefaultButton.Button1)
{
if (libraryBooks is null || !libraryBooks.Any())
return DialogResult.Cancel;
@@ -221,7 +221,7 @@ namespace LibationWinForms.AvaloniaUI
title,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
- MessageBoxDefaultButton.Button1);
+ defaultButton);
}
private static async Task ShowCore(Window owner, string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
diff --git a/Source/LibationWinForms/AvaloniaUI/ViewModels/ProcessQueueViewModel.cs b/Source/LibationWinForms/AvaloniaUI/ViewModels/ProcessQueueViewModel.cs
index 80b0eee7..6351c46c 100644
--- a/Source/LibationWinForms/AvaloniaUI/ViewModels/ProcessQueueViewModel.cs
+++ b/Source/LibationWinForms/AvaloniaUI/ViewModels/ProcessQueueViewModel.cs
@@ -28,60 +28,6 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
Queue.QueuededCountChanged += Queue_QueuededCountChanged;
Queue.CompletedCountChanged += Queue_CompletedCountChanged;
Logger = ProcessQueue.LogMe.RegisterForm(this);
-
- #region Design Mode Testing
- if (Design.IsDesignMode)
- {
- using var context = DbContexts.GetContext();
- var book = context.GetLibraryBook_Flat_NoTracking("B017V4IM1G");
- List testList = new()
- {
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.FailedAbort,
- Status = ProcessBookStatus.Failed,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.FailedSkip,
- Status = ProcessBookStatus.Failed,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.FailedRetry,
- Status = ProcessBookStatus.Failed,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.ValidationFail,
- Status = ProcessBookStatus.Failed,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.Cancelled,
- Status = ProcessBookStatus.Cancelled,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.Success,
- Status = ProcessBookStatus.Completed,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.None,
- Status = ProcessBookStatus.Working,
- },
- new ProcessBook2(book, Logger)
- {
- Result = ProcessBookResult.None,
- Status = ProcessBookStatus.Queued,
- },
- };
-
- Items.Enqueue(testList);
- return;
- }
- #endregion
}
private int _completedCount;
diff --git a/Source/LibationWinForms/AvaloniaUI/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationWinForms/AvaloniaUI/ViewModels/ProductsDisplayViewModel.cs
index 9698c3d1..3604bd1c 100644
--- a/Source/LibationWinForms/AvaloniaUI/ViewModels/ProductsDisplayViewModel.cs
+++ b/Source/LibationWinForms/AvaloniaUI/ViewModels/ProductsDisplayViewModel.cs
@@ -39,25 +39,10 @@ namespace LibationWinForms.AvaloniaUI.ViewModels
=> GridEntries
.AllItems()
.BookEntries();
-
- public ProductsDisplayViewModel()
+ public ProductsDisplayViewModel() { }
+ public ProductsDisplayViewModel(List items)
{
- if (Design.IsDesignMode)
- {
- using var context = DbContexts.GetContext();
- List sampleEntries = new()
- {
- context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"),
- context.GetLibraryBook_Flat_NoTracking("B017V4IWVG"),
- context.GetLibraryBook_Flat_NoTracking("B017V4JA2Q"),
- context.GetLibraryBook_Flat_NoTracking("B017V4NUPO"),
- context.GetLibraryBook_Flat_NoTracking("B017V4NMX4"),
- context.GetLibraryBook_Flat_NoTracking("B017V4NOZ0"),
- context.GetLibraryBook_Flat_NoTracking("B017WJ5ZK6"),
- };
- GridEntries = new GridEntryBindingList2(CreateGridEntries(sampleEntries));
- return;
- }
+ GridEntries = new GridEntryBindingList2(items);
}
#region Display Functions
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/Dialogs/BookDetailsDialog2.axaml b/Source/LibationWinForms/AvaloniaUI/Views/Dialogs/BookDetailsDialog2.axaml
new file mode 100644
index 00000000..5ecdd665
--- /dev/null
+++ b/Source/LibationWinForms/AvaloniaUI/Views/Dialogs/BookDetailsDialog2.axaml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tags are separated by a space. Each tag can contain letters, numbers, and underscores
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/Dialogs/BookDetailsDialog2.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Views/Dialogs/BookDetailsDialog2.axaml.cs
new file mode 100644
index 00000000..a3d67ee4
--- /dev/null
+++ b/Source/LibationWinForms/AvaloniaUI/Views/Dialogs/BookDetailsDialog2.axaml.cs
@@ -0,0 +1,157 @@
+using ApplicationServices;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.Media.Imaging;
+using DataLayer;
+using LibationFileManager;
+using LibationWinForms.AvaloniaUI.ViewModels;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+namespace LibationWinForms.AvaloniaUI.Views.Dialogs
+{
+ public partial class BookDetailsDialog2 : Window
+ {
+ private LibraryBook _libraryBook;
+ private BookDetailsDialogViewModel _viewModel;
+ public LibraryBook LibraryBook
+ {
+ get => _libraryBook;
+ set
+ {
+ _libraryBook = value;
+ Title = _libraryBook.Book.Title;
+ DataContext = _viewModel = new BookDetailsDialogViewModel(_libraryBook);
+ }
+ }
+
+ public string NewTags => _viewModel.Tags;
+ public LiberatedStatus BookLiberatedStatus => _viewModel.BookLiberatedSelectedItem.Status;
+ public LiberatedStatus? PdfLiberatedStatus => _viewModel.PdfLiberatedSelectedItem?.Status;
+
+ public BookDetailsDialog2()
+ {
+ InitializeComponent();
+#if DEBUG
+ this.AttachDevTools();
+#endif
+ if (Design.IsDesignMode)
+ {
+ using var context = DbContexts.GetContext();
+ LibraryBook = context.GetLibraryBook_Flat_NoTracking("B017V4IM1G");
+ }
+ }
+ public BookDetailsDialog2(LibraryBook libraryBook) :this()
+ {
+ LibraryBook = libraryBook;
+ }
+
+ public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e)
+ {
+ LibraryBook.Book.UpdateBook(NewTags, bookStatus: BookLiberatedStatus, pdfStatus: PdfLiberatedStatus);
+ }
+
+ private void InitializeComponent()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ private class BookDetailsDialogViewModel : ViewModelBase
+ {
+ public class liberatedComboBoxItem
+ {
+ public LiberatedStatus Status { get; set; }
+ public string Text { get; set; }
+ public override string ToString() => Text;
+ }
+
+ public Bitmap Cover { get; set; }
+ public string DetailsText { get; set; }
+ public string Tags { get; set; }
+
+ public bool HasPDF => PdfLiberatedItems?.Count > 0;
+
+ private liberatedComboBoxItem _bookLiberatedSelectedItem;
+ public ObservableCollection BookLiberatedItems { get; } = new();
+ public List PdfLiberatedItems { get; } = new();
+ public liberatedComboBoxItem PdfLiberatedSelectedItem { get; set; }
+
+ public liberatedComboBoxItem BookLiberatedSelectedItem
+ {
+ get => _bookLiberatedSelectedItem;
+ set
+ {
+ _bookLiberatedSelectedItem = value;
+ if (value?.Status is not LiberatedStatus.Error)
+ {
+ BookLiberatedItems.Remove(BookLiberatedItems.SingleOrDefault(s => s.Status == LiberatedStatus.Error));
+ }
+ }
+ }
+
+ public BookDetailsDialogViewModel(LibraryBook libraryBook)
+ {
+ //init tags
+ Tags = libraryBook.Book.UserDefinedItem.Tags;
+
+ //init cover image
+ var picture = PictureStorage.GetPictureSynchronously(new PictureDefinition(libraryBook.Book.PictureId, PictureSize._80x80));
+ using var ms = new System.IO.MemoryStream(picture);
+ Cover = new Bitmap(ms);
+
+ //init book details
+ DetailsText = @$"
+Title: {libraryBook.Book.Title}
+Author(s): {libraryBook.Book.AuthorNames()}
+Narrator(s): {libraryBook.Book.NarratorNames()}
+Length: {(libraryBook.Book.LengthInMinutes == 0 ? "" : $"{libraryBook.Book.LengthInMinutes / 60} hr {libraryBook.Book.LengthInMinutes % 60} min")}
+Audio Bitrate: {libraryBook.Book.AudioFormat}
+Category: {string.Join(" > ", libraryBook.Book.CategoriesNames())}
+Purchase Date: {libraryBook.DateAdded.ToString("d")}
+Audible ID: {libraryBook.Book.AudibleProductId}
+".Trim();
+
+ var seriesNames = libraryBook.Book.SeriesNames();
+ if (!string.IsNullOrWhiteSpace(seriesNames))
+ DetailsText += $"\r\nSeries: {seriesNames}";
+
+ var bookRating = libraryBook.Book.Rating?.ToStarString();
+ if (!string.IsNullOrWhiteSpace(bookRating))
+ DetailsText += $"\r\nBook Rating:\r\n{bookRating}";
+
+ var myRating = libraryBook.Book.UserDefinedItem.Rating?.ToStarString();
+ if (!string.IsNullOrWhiteSpace(myRating))
+ DetailsText += $"\r\nMy Rating:\r\n{myRating}";
+
+
+ //init book status
+ {
+ var status = libraryBook.Book.UserDefinedItem.BookStatus;
+
+ BookLiberatedItems.Add(new() { Status = LiberatedStatus.Liberated, Text = "Downloaded" });
+ BookLiberatedItems.Add(new() { Status = LiberatedStatus.NotLiberated, Text = "Not Downloaded" });
+
+ if (status == LiberatedStatus.Error)
+ BookLiberatedItems.Add(new() { Status = LiberatedStatus.Error, Text = "Error" });
+
+ BookLiberatedSelectedItem = BookLiberatedItems.SingleOrDefault(s => s.Status == status);
+ }
+
+ //init pdf status
+ {
+ var status = libraryBook.Book.UserDefinedItem.PdfStatus;
+
+ if (status is not null)
+ {
+ PdfLiberatedItems.Add(new() { Status = LiberatedStatus.Liberated, Text = "Downloaded" });
+ PdfLiberatedItems.Add(new() { Status = LiberatedStatus.NotLiberated, Text = "Not Downloaded" });
+
+ PdfLiberatedSelectedItem = PdfLiberatedItems.SingleOrDefault(s => s.Status == status);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.VisibleBooks.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.VisibleBooks.axaml.cs
index cafcbc39..94c63cb7 100644
--- a/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.VisibleBooks.axaml.cs
+++ b/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.VisibleBooks.axaml.cs
@@ -93,7 +93,8 @@ namespace LibationWinForms.AvaloniaUI.Views
this,
visibleLibraryBooks,
"Are you sure you want to remove {0} from Libation's library?",
- "Remove books from Libation?");
+ "Remove books from Libation?",
+ MessageBoxDefaultButton.Button2);
if (confirmationResult != DialogResult.Yes)
return;
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.axaml.cs
index ec7d15e4..05ad6ef4 100644
--- a/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.axaml.cs
+++ b/Source/LibationWinForms/AvaloniaUI/Views/MainWindow/MainWindow.axaml.cs
@@ -9,6 +9,7 @@ using LibationFileManager;
using DataLayer;
using System.Collections.Generic;
using System.Linq;
+using LibationWinForms.AvaloniaUI.Views.Dialogs;
namespace LibationWinForms.AvaloniaUI.Views
{
@@ -55,6 +56,12 @@ namespace LibationWinForms.AvaloniaUI.Views
LibraryCommands.LibrarySizeChanged += async (_, _) => await _viewModel.ProductsDisplay.DisplayBooks(DbContexts.GetLibrary_Flat_NoTracking(includeParents: true));
Closing += (_,_) => this.SaveSizeAndLocation(Configuration.Instance);
}
+ Opened += MainWindow_Opened;
+ }
+
+ private async void MainWindow_Opened(object sender, EventArgs e)
+ {
+
}
public void ProductsDisplay_Initialized1(object sender, EventArgs e)
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/ProcessBookControl2.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Views/ProcessBookControl2.axaml.cs
index 5b0869d8..412f794a 100644
--- a/Source/LibationWinForms/AvaloniaUI/Views/ProcessBookControl2.axaml.cs
+++ b/Source/LibationWinForms/AvaloniaUI/Views/ProcessBookControl2.axaml.cs
@@ -3,6 +3,8 @@ using System;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using LibationWinForms.AvaloniaUI.ViewModels;
+using ApplicationServices;
+using DataLayer;
namespace LibationWinForms.AvaloniaUI.Views
{
@@ -15,6 +17,16 @@ namespace LibationWinForms.AvaloniaUI.Views
public ProcessBookControl2()
{
InitializeComponent();
+
+ if (Design.IsDesignMode)
+ {
+ using var context = DbContexts.GetContext();
+ DataContext = new ProcessBook2(
+ context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"),
+ ProcessQueue.LogMe.RegisterForm(default(ProcessQueue.ILogForm))
+ );
+ return;
+ }
}
private ProcessBook2 DataItem => DataContext is null ? null : DataContext as ProcessBook2;
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/ProcessQueueControl2.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Views/ProcessQueueControl2.axaml.cs
index 6ba74cc1..85dad037 100644
--- a/Source/LibationWinForms/AvaloniaUI/Views/ProcessQueueControl2.axaml.cs
+++ b/Source/LibationWinForms/AvaloniaUI/Views/ProcessQueueControl2.axaml.cs
@@ -2,6 +2,7 @@ using ApplicationServices;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
+using DataLayer;
using LibationWinForms.AvaloniaUI.ViewModels;
using System;
using System.Collections.Generic;
@@ -19,7 +20,70 @@ namespace LibationWinForms.AvaloniaUI.Views
InitializeComponent();
ProcessBookControl2.PositionButtonClicked += ProcessBookControl2_ButtonClicked;
- ProcessBookControl2.CancelButtonClicked += ProcessBookControl2_CancelButtonClicked;
+ ProcessBookControl2.CancelButtonClicked += ProcessBookControl2_CancelButtonClicked;
+
+ #region Design Mode Testing
+ if (Design.IsDesignMode)
+ {
+ var vm = new ProcessQueueViewModel();
+ var Logger = ProcessQueue.LogMe.RegisterForm(vm);
+ DataContext = vm;
+ using var context = DbContexts.GetContext();
+ List testList = new()
+ {
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"), Logger)
+ {
+ Result = ProcessBookResult.FailedAbort,
+ Status = ProcessBookStatus.Failed,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4IWVG"), Logger)
+ {
+ Result = ProcessBookResult.FailedSkip,
+ Status = ProcessBookStatus.Failed,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4JA2Q"), Logger)
+ {
+ Result = ProcessBookResult.FailedRetry,
+ Status = ProcessBookStatus.Failed,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4NUPO"), Logger)
+ {
+ Result = ProcessBookResult.ValidationFail,
+ Status = ProcessBookStatus.Failed,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4NMX4"), Logger)
+ {
+ Result = ProcessBookResult.Cancelled,
+ Status = ProcessBookStatus.Cancelled,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4NOZ0"), Logger)
+ {
+ Result = ProcessBookResult.Success,
+ Status = ProcessBookStatus.Completed,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017WJ5ZK6"), Logger)
+ {
+ Result = ProcessBookResult.None,
+ Status = ProcessBookStatus.Working,
+ },
+ new ProcessBook2(context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"), Logger)
+ {
+ Result = ProcessBookResult.None,
+ Status = ProcessBookStatus.Queued,
+ },
+ };
+
+ vm.Items.Enqueue(testList);
+ vm.Items.MoveNext();
+ vm.Items.MoveNext();
+ vm.Items.MoveNext();
+ vm.Items.MoveNext();
+ vm.Items.MoveNext();
+ vm.Items.MoveNext();
+ vm.Items.MoveNext();
+ return;
+ }
+ #endregion
}
private void InitializeComponent()
diff --git a/Source/LibationWinForms/AvaloniaUI/Views/ProductsDisplay2.axaml.cs b/Source/LibationWinForms/AvaloniaUI/Views/ProductsDisplay2.axaml.cs
index 0af50fcf..deb89d86 100644
--- a/Source/LibationWinForms/AvaloniaUI/Views/ProductsDisplay2.axaml.cs
+++ b/Source/LibationWinForms/AvaloniaUI/Views/ProductsDisplay2.axaml.cs
@@ -1,3 +1,4 @@
+using ApplicationServices;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
@@ -5,6 +6,7 @@ using DataLayer;
using FileLiberator;
using LibationFileManager;
using LibationWinForms.AvaloniaUI.ViewModels;
+using LibationWinForms.AvaloniaUI.Views.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -21,8 +23,25 @@ namespace LibationWinForms.AvaloniaUI.Views
public ProductsDisplay2()
{
InitializeComponent();
- Configure_ColumnCustomization();
+ if (Design.IsDesignMode)
+ {
+ using var context = DbContexts.GetContext();
+ List 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")),
+ };
+ DataContext = new ProductsDisplayViewModel(sampleEntries);
+ return;
+ }
+
+ Configure_ColumnCustomization();
foreach (var column in productsGrid.Columns)
{
column.CustomSortComparer = new RowComparer(column);
@@ -251,15 +270,23 @@ namespace LibationWinForms.AvaloniaUI.Views
}
}
+ BookDetailsDialog2 bookDetailsForm;
+
public void OnTagsButtonClick(object sender, Avalonia.Interactivity.RoutedEventArgs args)
{
var button = args.Source as Button;
- if (button.DataContext is LibraryBookEntry2 lbEntry)
+ if (button.DataContext is LibraryBookEntry2 lbEntry && VisualRoot is Window window)
{
- var bookDetailsForm = new LibationWinForms.Dialogs.BookDetailsDialog(lbEntry.LibraryBook);
- if (bookDetailsForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
- lbEntry.Commit(bookDetailsForm.NewTags, bookDetailsForm.BookLiberatedStatus, bookDetailsForm.PdfLiberatedStatus);
+ if (bookDetailsForm is null || !bookDetailsForm.IsVisible)
+ {
+ bookDetailsForm = new BookDetailsDialog2(lbEntry.LibraryBook);
+ bookDetailsForm.RestoreSizeAndLocation(Configuration.Instance);
+ bookDetailsForm.Closing += (_,_) => bookDetailsForm.SaveSizeAndLocation(Configuration.Instance);
+ bookDetailsForm.Show(window);
+ }
+ else
+ bookDetailsForm.LibraryBook = lbEntry.LibraryBook;
}
}
diff --git a/Source/LibationWinForms/LibationWinForms.csproj b/Source/LibationWinForms/LibationWinForms.csproj
index 4db4c4cd..4deccf84 100644
--- a/Source/LibationWinForms/LibationWinForms.csproj
+++ b/Source/LibationWinForms/LibationWinForms.csproj
@@ -109,6 +109,9 @@
+
+ BookDetailsDialog2.axaml
+
True
True
@@ -123,4 +126,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/Source/LibationWinForms/Program.cs b/Source/LibationWinForms/Program.cs
index 9201369a..c879f7e4 100644
--- a/Source/LibationWinForms/Program.cs
+++ b/Source/LibationWinForms/Program.cs
@@ -29,7 +29,7 @@ namespace LibationWinForms
/*
Results below compare startup times when parallelizing startup tasks vs when
running everything sequentially, from the entry point until after the call to
- OnLoadedLibrary() returns. Tests were run on a ReadyToRun enables release build.
+ OnLoadedLibrary() returns. Tests were run on a ReadyToRun enabled release build.
The first run is substantially slower than all subsequent runs for both serial
and parallel. This is most likely due to file system caching speeding up
@@ -54,7 +54,7 @@ namespace LibationWinForms
Min 1492 2316
Q1 1562 2358
Med 1567 2379
- Q2 1600 2418
+ Q3 1600 2418
Max 2837 5835
*/
@@ -65,7 +65,7 @@ namespace LibationWinForms
}
//For debug purposes, always run AvaloniaUI.
- if (true) //(config.GetNonString("BetaOptIn"))
+ if (config.GetNonString("BetaOptIn"))
{
//Start as much work in parallel as possible.
var runDbMigrationsTask = Task.Run(() => RunDbMigrations(config));
diff --git a/Source/LibationWinForms/Properties/PublishProfiles/FolderProfile.pubxml b/Source/LibationWinForms/Properties/PublishProfiles/FolderProfile.pubxml
index 1ba3b7df..3ed14ad3 100644
--- a/Source/LibationWinForms/Properties/PublishProfiles/FolderProfile.pubxml
+++ b/Source/LibationWinForms/Properties/PublishProfiles/FolderProfile.pubxml
@@ -5,13 +5,12 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
Release
- x64
+ Any CPU
..\bin\publish\
FileSystem
net6.0-windows
win-x64
false
false
- true
\ No newline at end of file