diff --git a/Source/AppScaffolding/UpgradeProperties.cs b/Source/AppScaffolding/UpgradeProperties.cs index aa042b52..4db8765c 100644 --- a/Source/AppScaffolding/UpgradeProperties.cs +++ b/Source/AppScaffolding/UpgradeProperties.cs @@ -1,5 +1,4 @@ -using NPOI.XWPF.UserModel; -using System; +using System; using System.Text.RegularExpressions; namespace AppScaffolding diff --git a/Source/ApplicationServices/LibraryCommands.cs b/Source/ApplicationServices/LibraryCommands.cs index b18e05c9..f804f994 100644 --- a/Source/ApplicationServices/LibraryCommands.cs +++ b/Source/ApplicationServices/LibraryCommands.cs @@ -12,7 +12,6 @@ using DtoImporterService; using FileManager; using LibationFileManager; using Newtonsoft.Json.Linq; -using NPOI.OpenXmlFormats.Spreadsheet; using Serilog; using static DtoImporterService.PerfLogger; diff --git a/Source/LibationAvalonia/App.axaml.cs b/Source/LibationAvalonia/App.axaml.cs index 13fa7356..1c8b2187 100644 --- a/Source/LibationAvalonia/App.axaml.cs +++ b/Source/LibationAvalonia/App.axaml.cs @@ -1,24 +1,24 @@ -using Avalonia; +using ApplicationServices; +using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Media; -using LibationFileManager; -using LibationAvalonia.Views; -using System; using Avalonia.Platform; +using Avalonia.Styling; using LibationAvalonia.Dialogs; -using System.Threading.Tasks; +using LibationAvalonia.Views; +using LibationFileManager; +using System; using System.Collections.Generic; using System.IO; -using ApplicationServices; -using Avalonia.Controls; -using Avalonia.Styling; +using System.Threading.Tasks; namespace LibationAvalonia { public class App : Application { - public static Window MainWindow { get;private set; } + public static Window 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; } @@ -60,7 +60,7 @@ namespace LibationAvalonia if (config.LibationSettingsAreValid) { - LibraryTask = Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true)); + LibraryTask = Task.Run(() => DbContexts.GetLibrary_Flat_NoTracking(includeParents: true)); ShowMainWindow(desktop); } else diff --git a/Source/LibationAvalonia/AvaloniaUtils.cs b/Source/LibationAvalonia/AvaloniaUtils.cs index f92e1c4d..a825eace 100644 --- a/Source/LibationAvalonia/AvaloniaUtils.cs +++ b/Source/LibationAvalonia/AvaloniaUtils.cs @@ -13,7 +13,7 @@ namespace LibationAvalonia public static IBrush GetBrushFromResources(string name) => GetBrushFromResources(name, Brushes.Transparent); public static IBrush GetBrushFromResources(string name, IBrush defaultBrush) - { + { if (App.Current.TryGetResource(name, App.Current.ActualThemeVariant, out var value) && value is IBrush brush) return brush; return defaultBrush; diff --git a/Source/LibationAvalonia/Controls/CheckedListBox.axaml.cs b/Source/LibationAvalonia/Controls/CheckedListBox.axaml.cs index f0ab1e61..7f3d07a5 100644 --- a/Source/LibationAvalonia/Controls/CheckedListBox.axaml.cs +++ b/Source/LibationAvalonia/Controls/CheckedListBox.axaml.cs @@ -3,9 +3,6 @@ using Avalonia.Collections; using Avalonia.Controls; using LibationAvalonia.ViewModels; using ReactiveUI; -using System; -using System.Collections.Generic; -using System.Linq; namespace LibationAvalonia.Controls { @@ -15,7 +12,7 @@ namespace LibationAvalonia.Controls AvaloniaProperty.Register>(nameof(Items)); public AvaloniaList Items { get => GetValue(ItemsProperty); set => SetValue(ItemsProperty, value); } - private CheckedListBoxViewModel _viewModel = new(); + private CheckedListBoxViewModel _viewModel = new(); public CheckedListBox() { diff --git a/Source/LibationAvalonia/Controls/DataGridCheckBoxColumnExt.cs b/Source/LibationAvalonia/Controls/DataGridCheckBoxColumnExt.cs index eca89804..f99d9bda 100644 --- a/Source/LibationAvalonia/Controls/DataGridCheckBoxColumnExt.cs +++ b/Source/LibationAvalonia/Controls/DataGridCheckBoxColumnExt.cs @@ -3,7 +3,7 @@ using LibationUiBase.GridView; namespace LibationAvalonia.Controls { - public class DataGridCheckBoxColumnExt : DataGridCheckBoxColumn + public class DataGridCheckBoxColumnExt : DataGridCheckBoxColumn { protected override Control GenerateEditingElementDirect(DataGridCell cell, object dataItem) { diff --git a/Source/LibationAvalonia/Controls/DataGridContextMenus.cs b/Source/LibationAvalonia/Controls/DataGridContextMenus.cs index 277e68ee..d7916b76 100644 --- a/Source/LibationAvalonia/Controls/DataGridContextMenus.cs +++ b/Source/LibationAvalonia/Controls/DataGridContextMenus.cs @@ -15,7 +15,7 @@ namespace LibationAvalonia.Controls static DataGridContextMenus() { - ContextMenu.Items = MenuItems; + ContextMenu.ItemsSource = MenuItems; OwningColumnProperty = typeof(DataGridCell).GetProperty("OwningColumn", BindingFlags.Instance | BindingFlags.NonPublic); } diff --git a/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs b/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs index 41b2be6f..871d7330 100644 --- a/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs +++ b/Source/LibationAvalonia/Controls/DataGridMyRatingColumn.cs @@ -4,7 +4,6 @@ using Avalonia.Data; using Avalonia.Interactivity; using DataLayer; using ReactiveUI; -using System; namespace LibationAvalonia.Controls { diff --git a/Source/LibationAvalonia/Controls/DataGridTemplateColumnExt.cs b/Source/LibationAvalonia/Controls/DataGridTemplateColumnExt.cs index b1ed35c7..c65358aa 100644 --- a/Source/LibationAvalonia/Controls/DataGridTemplateColumnExt.cs +++ b/Source/LibationAvalonia/Controls/DataGridTemplateColumnExt.cs @@ -1,6 +1,4 @@ using Avalonia.Controls; -using System; -using System.Linq; namespace LibationAvalonia.Controls { diff --git a/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs b/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs index 338e48e7..a62280a0 100644 --- a/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs +++ b/Source/LibationAvalonia/Controls/DirectoryOrCustomSelectControl.axaml.cs @@ -1,10 +1,9 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Dinah.Core; using LibationFileManager; -using System.Collections.Generic; using ReactiveUI; +using System.Collections.Generic; using System.Linq; namespace LibationAvalonia.Controls @@ -56,12 +55,12 @@ namespace LibationAvalonia.Controls directorySelectControl.PropertyChanged += DirectorySelectControl_PropertyChanged; } - private class CustomState: ViewModels.ViewModelBase + private class CustomState : ViewModels.ViewModelBase { private string _customDir; private bool _knownChecked; private bool _customChecked; - public string CustomDir { get=> _customDir; set => this.RaiseAndSetIfChanged(ref _customDir, value); } + public string CustomDir { get => _customDir; set => this.RaiseAndSetIfChanged(ref _customDir, value); } public bool KnownChecked { get => _knownChecked; @@ -141,7 +140,7 @@ namespace LibationAvalonia.Controls var known = Configuration.GetKnownDirectory(noSubDir); if (known == Configuration.KnownDirectories.None && noSubDir == Configuration.AppDir_Absolute) - known = Configuration.KnownDirectories.AppDir; + known = Configuration.KnownDirectories.AppDir; if (known is Configuration.KnownDirectories.None) { diff --git a/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs b/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs index 5cb84725..ebd4717d 100644 --- a/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs +++ b/Source/LibationAvalonia/Controls/DirectorySelectControl.axaml.cs @@ -1,13 +1,12 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Data; +using Avalonia.Data.Converters; using Dinah.Core; using LibationFileManager; -using System.Collections.Generic; -using Avalonia.Data.Converters; using System; +using System.Collections.Generic; using System.Globalization; -using Avalonia.Data; using System.IO; using System.Reactive.Subjects; diff --git a/Source/LibationAvalonia/Controls/GroupBox.axaml.cs b/Source/LibationAvalonia/Controls/GroupBox.axaml.cs index bf9a72b8..dd9a148f 100644 --- a/Source/LibationAvalonia/Controls/GroupBox.axaml.cs +++ b/Source/LibationAvalonia/Controls/GroupBox.axaml.cs @@ -1,6 +1,5 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; namespace LibationAvalonia.Controls { diff --git a/Source/LibationAvalonia/Controls/LinkLabel.axaml.cs b/Source/LibationAvalonia/Controls/LinkLabel.axaml.cs index 4d7ee7ac..978a1e7a 100644 --- a/Source/LibationAvalonia/Controls/LinkLabel.axaml.cs +++ b/Source/LibationAvalonia/Controls/LinkLabel.axaml.cs @@ -1,8 +1,5 @@ -using Avalonia; using Avalonia.Controls; using Avalonia.Input; -using Avalonia.Markup.Xaml; -using Avalonia.Media; using Avalonia.Styling; using System; diff --git a/Source/LibationAvalonia/Controls/MyRatingCellEditor.axaml.cs b/Source/LibationAvalonia/Controls/MyRatingCellEditor.axaml.cs index c5100f14..a23b960f 100644 --- a/Source/LibationAvalonia/Controls/MyRatingCellEditor.axaml.cs +++ b/Source/LibationAvalonia/Controls/MyRatingCellEditor.axaml.cs @@ -18,7 +18,7 @@ namespace LibationAvalonia.Controls public bool IsEditingMode { get; set; } public Rating Rating { get => GetValue(RatingProperty); set => SetValue(RatingProperty, value); } - + public MyRatingCellEditor() { InitializeComponent(); diff --git a/Source/LibationAvalonia/Controls/WheelComboBox.axaml.cs b/Source/LibationAvalonia/Controls/WheelComboBox.axaml.cs index 9658ec3e..cf6a150f 100644 --- a/Source/LibationAvalonia/Controls/WheelComboBox.axaml.cs +++ b/Source/LibationAvalonia/Controls/WheelComboBox.axaml.cs @@ -1,11 +1,7 @@ -using Avalonia; using Avalonia.Controls; using Avalonia.Input; -using Avalonia.Markup.Xaml; using Avalonia.Styling; using System; -using System.Collections; -using System.Linq; namespace LibationAvalonia.Controls { diff --git a/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs index e2da5d21..946b62e0 100644 --- a/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/AccountsDialog.axaml.cs @@ -1,17 +1,14 @@ +using AudibleApi; using AudibleUtilities; using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Platform.Storage; +using ReactiveUI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Threading.Tasks; -using ReactiveUI; -using AudibleApi; -using Avalonia.Platform.Storage; -using LibationFileManager; -using Avalonia.Platform.Storage.FileIO; namespace LibationAvalonia.Dialogs { @@ -31,7 +28,7 @@ namespace LibationAvalonia.Dialogs { this.RaiseAndSetIfChanged(ref _accountId, value); this.RaisePropertyChanged(nameof(IsDefault)); - } + } } public Locale SelectedLocale { diff --git a/Source/LibationAvalonia/Dialogs/BookDetailsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/BookDetailsDialog.axaml.cs index 5f825f44..2cb4218b 100644 --- a/Source/LibationAvalonia/Dialogs/BookDetailsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/BookDetailsDialog.axaml.cs @@ -1,11 +1,10 @@ using ApplicationServices; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Avalonia.Media.Imaging; using DataLayer; using Dinah.Core; -using LibationFileManager; using LibationAvalonia.ViewModels; +using LibationFileManager; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -42,14 +41,14 @@ namespace LibationAvalonia.Dialogs LibraryBook = context.GetLibraryBook_Flat_NoTracking("B017V4IM1G"); } } - public BookDetailsDialog(LibraryBook libraryBook) :this() + public BookDetailsDialog(LibraryBook libraryBook) : this() { LibraryBook = libraryBook; } protected override void SaveAndClose() - { - LibraryBook.Book.UpdateUserDefinedItem(NewTags, bookStatus: BookLiberatedStatus, pdfStatus: PdfLiberatedStatus); + { + LibraryBook.Book.UpdateUserDefinedItem(NewTags, bookStatus: BookLiberatedStatus, pdfStatus: PdfLiberatedStatus); base.SaveAndClose(); } @@ -61,7 +60,7 @@ namespace LibationAvalonia.Dialogs } public void SaveButton_Clicked(object sender, Avalonia.Interactivity.RoutedEventArgs e) - => SaveAndClose(); + => SaveAndClose(); private class BookDetailsDialogViewModel : ViewModelBase { diff --git a/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs index 1389e0d7..9261394c 100644 --- a/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/BookRecordsDialog.axaml.cs @@ -79,7 +79,7 @@ namespace LibationAvalonia.Dialogs public void CheckAll_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) { - foreach (var record in bookRecordEntries) + foreach (var record in bookRecordEntries) record.IsChecked = true; } public void UncheckAll_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) diff --git a/Source/LibationAvalonia/Dialogs/DescriptionDisplayDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/DescriptionDisplayDialog.axaml.cs index 1a934173..8a33783b 100644 --- a/Source/LibationAvalonia/Dialogs/DescriptionDisplayDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/DescriptionDisplayDialog.axaml.cs @@ -1,6 +1,5 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using System; namespace LibationAvalonia.Dialogs @@ -12,9 +11,7 @@ namespace LibationAvalonia.Dialogs public DescriptionDisplayDialog() { InitializeComponent(); -#if DEBUG - this.AttachDevTools(); -#endif + DescriptionTextBox = this.FindControl(nameof(DescriptionTextBox)); this.Activated += DescriptionDisplay_Activated; Opened += DescriptionDisplay_Opened; diff --git a/Source/LibationAvalonia/Dialogs/DialogWindow.cs b/Source/LibationAvalonia/Dialogs/DialogWindow.cs index f30e9c47..a46aea77 100644 --- a/Source/LibationAvalonia/Dialogs/DialogWindow.cs +++ b/Source/LibationAvalonia/Dialogs/DialogWindow.cs @@ -1,5 +1,4 @@ -using Avalonia; -using Avalonia.Controls; +using Avalonia.Controls; using LibationFileManager; using System; using System.Threading.Tasks; @@ -17,10 +16,6 @@ namespace LibationAvalonia.Dialogs this.Initialized += DialogWindow_Initialized; this.Opened += DialogWindow_Opened; this.Closing += DialogWindow_Closing; - -#if DEBUG - this.AttachDevTools(); -#endif } public DialogWindow(bool saveAndRestorePosition) : this() { diff --git a/Source/LibationAvalonia/Dialogs/EditQuickFilters.axaml.cs b/Source/LibationAvalonia/Dialogs/EditQuickFilters.axaml.cs index 52b65df1..70d99c48 100644 --- a/Source/LibationAvalonia/Dialogs/EditQuickFilters.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/EditQuickFilters.axaml.cs @@ -1,9 +1,9 @@ using AudibleUtilities; using Avalonia.Controls; using LibationFileManager; +using ReactiveUI; using System.Collections.ObjectModel; using System.Linq; -using ReactiveUI; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/EditReplacementChars.axaml.cs b/Source/LibationAvalonia/Dialogs/EditReplacementChars.axaml.cs index 91b8f039..813b4e80 100644 --- a/Source/LibationAvalonia/Dialogs/EditReplacementChars.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/EditReplacementChars.axaml.cs @@ -1,12 +1,11 @@ +using Avalonia.Collections; using Avalonia.Controls; -using Avalonia.Markup.Xaml; +using Avalonia.Data; using FileManager; using LibationFileManager; -using System.Collections.Generic; using ReactiveUI; +using System.Collections.Generic; using System.Linq; -using Avalonia.Collections; -using Avalonia.Data; namespace LibationAvalonia.Dialogs { @@ -37,7 +36,7 @@ namespace LibationAvalonia.Dialogs } public void Defaults_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) - => LoadTable(ReplacementCharacters.Default.Replacements); + => LoadTable(ReplacementCharacters.Default.Replacements); public void LoFiDefaults_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) => LoadTable(ReplacementCharacters.LoFiDefault.Replacements); public void Barebones_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) @@ -50,7 +49,7 @@ namespace LibationAvalonia.Dialogs protected override void SaveAndClose() { var replacements = SOURCE - .Where(r=> !r.IsDefault) + .Where(r => !r.IsDefault) .Select(r => new Replacement(r.Character, r.ReplacementText, r.Description) { Mandatory = r.Mandatory }) .ToList(); diff --git a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs index 32674059..fe03866c 100644 --- a/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/EditTemplateDialog.axaml.cs @@ -1,17 +1,15 @@ -using Avalonia.Markup.Xaml; +using Avalonia.Collections; +using Avalonia.Controls; +using Avalonia.Controls.Documents; +using Avalonia.Markup.Xaml; using Avalonia.Media; using Dinah.Core; using LibationFileManager; +using ReactiveUI; using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; -using ReactiveUI; -using Avalonia.Controls.Documents; -using Avalonia.Collections; -using Avalonia.Controls; -using Avalonia.Markup.Xaml.Templates; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs index d866c247..051d78e1 100644 --- a/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/ImageDisplayDialog.axaml.cs @@ -1,9 +1,8 @@ -using Avalonia.Markup.Xaml; using Avalonia.Media.Imaging; +using Avalonia.Platform.Storage; +using ReactiveUI; using System; using System.ComponentModel; -using ReactiveUI; -using Avalonia.Platform.Storage; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs index e2e0b912..a21e44a3 100644 --- a/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/LibationFilesDialog.axaml.cs @@ -1,10 +1,6 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using LibationFileManager; -using LibationAvalonia.Controls; using System.Collections.Generic; -using System.Threading.Tasks; namespace LibationAvalonia.Dialogs { @@ -18,7 +14,7 @@ namespace LibationAvalonia.Dialogs Configuration.KnownDirectories.AppDir, Configuration.KnownDirectories.MyDocs }; - + public string Directory { get; set; } = Configuration.GetKnownDirectoryPath(Configuration.KnownDirectories.UserProfile); } private DirSelectOptions dirSelectOptions; @@ -28,9 +24,6 @@ namespace LibationAvalonia.Dialogs { InitializeComponent(); -#if DEBUG - this.AttachDevTools(); -#endif DataContext = dirSelectOptions = new(); } diff --git a/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchAutoDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchAutoDialog.axaml.cs index 47c0e7b8..761a1224 100644 --- a/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchAutoDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchAutoDialog.axaml.cs @@ -1,13 +1,11 @@ -using Avalonia.Markup.Xaml; - namespace LibationAvalonia.Dialogs { public partial class LiberatedStatusBatchAutoDialog : DialogWindow - { - public bool SetDownloaded { get; set; } - public bool SetNotDownloaded { get; set; } + { + public bool SetDownloaded { get; set; } + public bool SetNotDownloaded { get; set; } - public LiberatedStatusBatchAutoDialog() + public LiberatedStatusBatchAutoDialog() { InitializeComponent(); DataContext = this; diff --git a/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchManualDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchManualDialog.axaml.cs index 189eb279..acaa90af 100644 --- a/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchManualDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/LiberatedStatusBatchManualDialog.axaml.cs @@ -1,4 +1,3 @@ -using Avalonia.Markup.Xaml; using DataLayer; using System.Collections; using System.Collections.Generic; @@ -34,13 +33,13 @@ namespace LibationAvalonia.Dialogs new liberatedComboBoxItem { Status = LiberatedStatus.NotLiberated, Text = "Not Downloaded" }, }; - public LiberatedStatusBatchManualDialog(bool isPdf) : this() - { - if (isPdf) - this.Title = this.Title.Replace("book", "PDF"); - } + public LiberatedStatusBatchManualDialog(bool isPdf) : this() + { + if (isPdf) + this.Title = this.Title.Replace("book", "PDF"); + } - public LiberatedStatusBatchManualDialog() + public LiberatedStatusBatchManualDialog() { InitializeComponent(); SelectedItem = BookStatuses[0] as liberatedComboBoxItem; diff --git a/Source/LibationAvalonia/Dialogs/LocateAudiobooksDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/LocateAudiobooksDialog.axaml.cs index 7f4752bb..0ebc6166 100644 --- a/Source/LibationAvalonia/Dialogs/LocateAudiobooksDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/LocateAudiobooksDialog.axaml.cs @@ -2,7 +2,6 @@ using ApplicationServices; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Platform.Storage; -using Avalonia.Platform.Storage.FileIO; using DataLayer; using LibationAvalonia.ViewModels; using LibationFileManager; @@ -53,7 +52,7 @@ namespace LibationAvalonia.Dialogs private void LocateAudiobooks_FileFound(object sender, FilePathCache.CacheEntry e) { - var newItem = new Tuple($"[{e.Id}]", Path.GetFileName(e.Path)); + var newItem = new Tuple($"[{e.Id}]", Path.GetFileName(e.Path)); _viewModel.FoundFiles.Add(newItem); foundAudiobooksLB.SelectedItem = newItem; @@ -70,7 +69,7 @@ namespace LibationAvalonia.Dialogs { Title = "Select the folder to search for audiobooks", AllowMultiple = false, - SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(Configuration.Instance.Books.PathWithoutPrefix) + SuggestedStartLocation = await StorageProvider.TryGetFolderFromPathAsync(Configuration.Instance.Books.PathWithoutPrefix) }; var selectedFolder = (await StorageProvider.OpenFolderPickerAsync(folderPicker))?.SingleOrDefault()?.TryGetLocalPath(); diff --git a/Source/LibationAvalonia/Dialogs/Login/ApprovalNeededDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/ApprovalNeededDialog.axaml.cs index 49f1ef4b..c1f3a4b7 100644 --- a/Source/LibationAvalonia/Dialogs/Login/ApprovalNeededDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/ApprovalNeededDialog.axaml.cs @@ -1,6 +1,3 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; using System.Threading.Tasks; namespace LibationAvalonia.Dialogs.Login diff --git a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs index b7c1f682..e5234d7c 100644 --- a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs +++ b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginCallback.cs @@ -1,7 +1,6 @@ -using System; -using System.Threading.Tasks; -using AudibleApi; +using AudibleApi; using AudibleUtilities; +using System.Threading.Tasks; namespace LibationAvalonia.Dialogs.Login { diff --git a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs index 1e0373b1..48bbe611 100644 --- a/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs +++ b/Source/LibationAvalonia/Dialogs/Login/AvaloniaLoginChoiceEager.cs @@ -1,7 +1,7 @@ -using System; -using System.Threading.Tasks; -using AudibleApi; +using AudibleApi; using AudibleUtilities; +using System; +using System.Threading.Tasks; namespace LibationAvalonia.Dialogs.Login { diff --git a/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml.cs index 92b27485..df681ae3 100644 --- a/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/CaptchaDialog.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Avalonia.Media.Imaging; using LibationAvalonia.ViewModels; using ReactiveUI; @@ -21,7 +20,7 @@ namespace LibationAvalonia.Dialogs.Login captchaBox = this.FindControl(nameof(captchaBox)); } - public CaptchaDialog(string password, byte[] captchaImage) :this() + public CaptchaDialog(string password, byte[] captchaImage) : this() { //Avalonia doesn't support animated gifs. //Deconstruct gifs into frames and manually switch them. @@ -34,7 +33,7 @@ namespace LibationAvalonia.Dialogs.Login { var frameMetadata = gif.Frames[i].Metadata.GetFormatMetadata(SixLabors.ImageSharp.Formats.Gif.GifFormat.Instance); - using var clonedFrame = gif.Frames.CloneFrame(i); + using var clonedFrame = gif.Frames.CloneFrame(i); using var framems = new MemoryStream(); clonedFrame.Save(framems, gifEncoder); @@ -66,7 +65,7 @@ namespace LibationAvalonia.Dialogs.Login protected override async Task CancelAndCloseAsync() { await _viewModel.StopAsync(); - await base.CancelAndCloseAsync(); + await base.CancelAndCloseAsync(); } public async void Submit_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) @@ -106,7 +105,7 @@ namespace LibationAvalonia.Dialogs.Login private async Task SwitchFramesAsync(Bitmap[] gifFrames, int[] frameDelayMs) { int index = 0; - while(keepSwitching) + while (keepSwitching) { CaptchaImage = gifFrames[index]; await Task.Delay(frameDelayMs[index++]); diff --git a/Source/LibationAvalonia/Dialogs/Login/LoginCallbackDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/LoginCallbackDialog.axaml.cs index c42526d3..35ed88b5 100644 --- a/Source/LibationAvalonia/Dialogs/Login/LoginCallbackDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/LoginCallbackDialog.axaml.cs @@ -1,7 +1,5 @@ using AudibleUtilities; -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Dinah.Core; using System.Linq; using System.Threading.Tasks; diff --git a/Source/LibationAvalonia/Dialogs/Login/LoginChoiceEagerDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/LoginChoiceEagerDialog.axaml.cs index a2d4311d..ee3008b1 100644 --- a/Source/LibationAvalonia/Dialogs/Login/LoginChoiceEagerDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/LoginChoiceEagerDialog.axaml.cs @@ -1,8 +1,6 @@ using AudibleApi; using AudibleUtilities; -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using System.Linq; using System.Threading.Tasks; @@ -26,7 +24,7 @@ namespace LibationAvalonia.Dialogs.Login DataContext = this; } } - public LoginChoiceEagerDialog(Account account):this() + public LoginChoiceEagerDialog(Account account) : this() { Account = account; DataContext = this; diff --git a/Source/LibationAvalonia/Dialogs/Login/LoginExternalDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/LoginExternalDialog.axaml.cs index 2435f477..82404e09 100644 --- a/Source/LibationAvalonia/Dialogs/Login/LoginExternalDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/LoginExternalDialog.axaml.cs @@ -1,7 +1,6 @@ using AudibleUtilities; using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Dinah.Core; using System; using System.Linq; @@ -28,7 +27,7 @@ namespace LibationAvalonia.Dialogs.Login DataContext = this; } } - public LoginExternalDialog(Account account, string loginUrl):this() + public LoginExternalDialog(Account account, string loginUrl) : this() { Account = account; ExternalLoginUrl = loginUrl; diff --git a/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs index 6b492268..e0c4ad34 100644 --- a/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/MfaDialog.axaml.cs @@ -1,11 +1,10 @@ using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using System.Threading.Tasks; +using Avalonia.Data; using ReactiveUI; using System.Collections.Generic; using System.Linq; -using Avalonia.Data; +using System.Threading.Tasks; namespace LibationAvalonia.Dialogs.Login { diff --git a/Source/LibationAvalonia/Dialogs/Login/_2faCodeDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/Login/_2faCodeDialog.axaml.cs index fd0c3796..d0cf4736 100644 --- a/Source/LibationAvalonia/Dialogs/Login/_2faCodeDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/Login/_2faCodeDialog.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using Avalonia.Markup.Xaml; using System.Threading.Tasks; namespace LibationAvalonia.Dialogs.Login @@ -12,7 +11,7 @@ namespace LibationAvalonia.Dialogs.Login public _2faCodeDialog() { - AvaloniaXamlLoader.Load(this); + InitializeComponent(); _2FABox = this.FindControl(nameof(_2FABox)); } diff --git a/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs index 9837ab00..85d04f5c 100644 --- a/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/MessageBoxAlertAdminDialog.axaml.cs @@ -1,5 +1,4 @@ using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Dinah.Core; using FileManager; using System; diff --git a/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs b/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs index 18c153b7..c1cbb009 100644 --- a/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/MessageBoxWindow.axaml.cs @@ -1,6 +1,3 @@ -using Avalonia; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; using LibationAvalonia.ViewModels.Dialogs; namespace LibationAvalonia.Dialogs @@ -12,7 +9,7 @@ namespace LibationAvalonia.Dialogs { InitializeComponent(); } - public MessageBoxWindow(bool saveAndRestorePosition):base(saveAndRestorePosition) + public MessageBoxWindow(bool saveAndRestorePosition) : base(saveAndRestorePosition) { InitializeComponent(); } diff --git a/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs index 8748fe0b..2e62c3a6 100644 --- a/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/ScanAccountsDialog.axaml.cs @@ -1,12 +1,9 @@ using AudibleUtilities; -using Avalonia; using Avalonia.Controls; using Avalonia.Interactivity; -using Avalonia.Markup.Xaml; using System.Collections; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs index 58f76533..4c3c45f9 100644 --- a/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SearchSyntaxDialog.axaml.cs @@ -1,5 +1,3 @@ -using Avalonia.Markup.Xaml; - namespace LibationAvalonia.Dialogs { public partial class SearchSyntaxDialog : DialogWindow diff --git a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs index 69bb7967..8f253da9 100644 --- a/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SettingsDialog.axaml.cs @@ -1,14 +1,14 @@ +using Avalonia.Collections; using Avalonia.Controls; +using Dinah.Core; +using FileManager; using LibationFileManager; +using LibationUiBase; +using ReactiveUI; using System; using System.Collections.Generic; -using System.Threading.Tasks; -using ReactiveUI; -using Dinah.Core; using System.Linq; -using FileManager; -using Avalonia.Collections; -using LibationUiBase; +using System.Threading.Tasks; namespace LibationAvalonia.Dialogs { @@ -51,7 +51,7 @@ namespace LibationAvalonia.Dialogs } public async void EditFileTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) - { + { var newTemplate = await editTemplate(TemplateEditor.CreateFilenameEditor(config.Books, settingsDisp.DownloadDecryptSettings.FileTemplate)); if (newTemplate is not null) settingsDisp.DownloadDecryptSettings.FileTemplate = newTemplate; @@ -59,7 +59,7 @@ namespace LibationAvalonia.Dialogs public async void EditChapterFileTemplateButton_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) { - + var newTemplate = await editTemplate(TemplateEditor.CreateFilenameEditor(config.Books, settingsDisp.DownloadDecryptSettings.ChapterFileTemplate)); if (newTemplate is not null) settingsDisp.DownloadDecryptSettings.ChapterFileTemplate = newTemplate; @@ -197,7 +197,7 @@ namespace LibationAvalonia.Dialogs this.RaiseAndSetIfChanged(ref themeVariant, value); SelectionChanged = ThemeVariant != InitialThemeVariant; - this.RaisePropertyChanged(nameof(SelectionChanged)); + this.RaisePropertyChanged(nameof(SelectionChanged)); } } public string InitialThemeVariant { get; private set; } @@ -242,7 +242,7 @@ namespace LibationAvalonia.Dialogs public bool DownloadEpisodes { get; set; } public bool AutoDownloadEpisodes { get; set; } } - + public class DownloadDecryptSettings : ViewModels.ViewModelBase, ISettingsDisplay { private bool _badBookAsk; @@ -345,7 +345,7 @@ namespace LibationAvalonia.Dialogs } } } - public bool BadBookRetry + public bool BadBookRetry { get => _badBookRetry; set @@ -392,7 +392,7 @@ namespace LibationAvalonia.Dialogs public AvaloniaList SampleRates { get; } = new( - new [] + new[] { AAXClean.SampleRate.Hz_44100, AAXClean.SampleRate.Hz_32000, diff --git a/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs index ced2995a..333af0ad 100644 --- a/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/SetupDialog.axaml.cs @@ -1,22 +1,16 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using LibationFileManager; namespace LibationAvalonia.Dialogs { public partial class SetupDialog : Window { - public bool IsNewUser { get;private set; } - public bool IsReturningUser { get;private set; } + public bool IsNewUser { get; private set; } + public bool IsReturningUser { get; private set; } public Configuration Config { get; init; } public SetupDialog() { InitializeComponent(); - -#if DEBUG - this.AttachDevTools(); -#endif } public void NewUser_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) diff --git a/Source/LibationAvalonia/Dialogs/TagsBatchDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/TagsBatchDialog.axaml.cs index d51bf5d2..12f1f3df 100644 --- a/Source/LibationAvalonia/Dialogs/TagsBatchDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/TagsBatchDialog.axaml.cs @@ -1,6 +1,4 @@ -using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/Dialogs/TrashBinDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/TrashBinDialog.axaml.cs index 073a0845..07d66868 100644 --- a/Source/LibationAvalonia/Dialogs/TrashBinDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/TrashBinDialog.axaml.cs @@ -1,7 +1,6 @@ using ApplicationServices; using Avalonia.Collections; using Avalonia.Controls; -using Avalonia.Threading; using DataLayer; using LibationAvalonia.Controls; using LibationAvalonia.ViewModels; @@ -25,7 +24,7 @@ namespace LibationAvalonia.Dialogs this.RestoreSizeAndLocation(Configuration.Instance); DataContext = _viewModel = new(); - this.Closing += (_,_) => this.SaveSizeAndLocation(Configuration.Instance); + this.Closing += (_, _) => this.SaveSizeAndLocation(Configuration.Instance); } public async void EmptyTrash_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) @@ -40,7 +39,7 @@ namespace LibationAvalonia.Dialogs public string CheckedCountText => $"Checked : {_checkedBooksCount} of {_totalBooksCount}"; private bool _controlsEnabled = true; - public bool ControlsEnabled { get => _controlsEnabled; set=> this.RaiseAndSetIfChanged(ref _controlsEnabled, value); } + public bool ControlsEnabled { get => _controlsEnabled; set => this.RaiseAndSetIfChanged(ref _controlsEnabled, value); } private bool? everythingChecked = false; public bool? EverythingChecked @@ -96,7 +95,7 @@ namespace LibationAvalonia.Dialogs { foreach (var item in DeletedBooks) item.IsChecked = true; - } + } public void UncheckAll() { diff --git a/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs b/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs index fcb48511..cb298132 100644 --- a/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs +++ b/Source/LibationAvalonia/Dialogs/UpgradeNotificationDialog.axaml.cs @@ -1,7 +1,6 @@ using AppScaffolding; using Avalonia.Controls; using Dinah.Core; -using System; namespace LibationAvalonia.Dialogs { diff --git a/Source/LibationAvalonia/FormSaveExtension.cs b/Source/LibationAvalonia/FormSaveExtension.cs index 748bb344..c9bca50b 100644 --- a/Source/LibationAvalonia/FormSaveExtension.cs +++ b/Source/LibationAvalonia/FormSaveExtension.cs @@ -1,9 +1,9 @@ -using System; -using System.Linq; -using Avalonia; +using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using LibationFileManager; +using System; +using System.Linq; namespace LibationAvalonia { diff --git a/Source/LibationAvalonia/MessageBox.cs b/Source/LibationAvalonia/MessageBox.cs index a1ee276f..b5468893 100644 --- a/Source/LibationAvalonia/MessageBox.cs +++ b/Source/LibationAvalonia/MessageBox.cs @@ -1,16 +1,15 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Threading; using DataLayer; using Dinah.Core.Logging; -using LibationAvalonia.ViewModels.Dialogs; using LibationAvalonia.Dialogs; +using LibationAvalonia.ViewModels.Dialogs; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using System.Threading; -using Avalonia.Threading; namespace LibationAvalonia { @@ -64,23 +63,23 @@ namespace LibationAvalonia public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) => ShowCoreAsync(null, text, caption, buttons, icon, defaultButton); -public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, bool saveAndRestorePosition = true) - => ShowCoreAsync(null, text, caption, buttons, icon, MessageBoxDefaultButton.Button1, saveAndRestorePosition); -public static Task Show(string text, string caption, MessageBoxButtons buttons) - => ShowCoreAsync(null, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); - public static Task Show(string text, string caption) - => ShowCoreAsync(null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); - public static Task Show(string text) - => ShowCoreAsync(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); -public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) - => ShowCoreAsync(owner, text, caption, buttons, icon, defaultButton); + public static Task Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, bool saveAndRestorePosition = true) + => ShowCoreAsync(null, text, caption, buttons, icon, MessageBoxDefaultButton.Button1, saveAndRestorePosition); + public static Task Show(string text, string caption, MessageBoxButtons buttons) + => ShowCoreAsync(null, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(string text, string caption) + => ShowCoreAsync(null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(string text) + => ShowCoreAsync(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) + => ShowCoreAsync(owner, text, caption, buttons, icon, defaultButton); -public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) - => ShowCoreAsync(owner, text, caption, buttons, icon, MessageBoxDefaultButton.Button1); - public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons) - => ShowCoreAsync(owner, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); - public static Task Show(Window owner, string text, string caption) - => ShowCoreAsync(owner, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) + => ShowCoreAsync(owner, text, caption, buttons, icon, MessageBoxDefaultButton.Button1); + public static Task Show(Window owner, string text, string caption, MessageBoxButtons buttons) + => ShowCoreAsync(owner, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + public static Task Show(Window owner, string text, string caption) + => ShowCoreAsync(owner, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); public static Task Show(Window owner, string text) => ShowCoreAsync(owner, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); @@ -102,10 +101,10 @@ Libation. ".Trim(), "Verbose logging enabled", MessageBoxButtons.OK, MessageBoxIcon.Warning); } - /// - /// Note: the format field should use {0} and NOT use the `$` string interpolation. Formatting is done inside this method. - /// - public static async Task ShowConfirmationDialog(Window owner, IEnumerable libraryBooks, string format, string title, MessageBoxDefaultButton defaultButton = MessageBoxDefaultButton.Button1) + /// + /// Note: the format field should use {0} and NOT use the `$` string interpolation. Formatting is done inside this method. + /// + 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; @@ -120,7 +119,7 @@ Libation. = string.Format(format, $"{thisThese} {count} {bookBooks}") + $"\r\n\r\n{titlesAgg}"; - return await ShowCoreAsync(owner, + return await ShowCoreAsync(owner, message, title, MessageBoxButtons.YesNo, diff --git a/Source/LibationAvalonia/ViewModels/AvaloniaEntryStatus.cs b/Source/LibationAvalonia/ViewModels/AvaloniaEntryStatus.cs index 0ad70c44..d02429db 100644 --- a/Source/LibationAvalonia/ViewModels/AvaloniaEntryStatus.cs +++ b/Source/LibationAvalonia/ViewModels/AvaloniaEntryStatus.cs @@ -6,7 +6,7 @@ using System; namespace LibationAvalonia.ViewModels { - public class AvaloniaEntryStatus : EntryStatus, IEntryStatus, IComparable + public class AvaloniaEntryStatus : EntryStatus, IEntryStatus, IComparable { public override IBrush BackgroundBrush => IsEpisode ? App.SeriesEntryGridBackgroundBrush : Brushes.Transparent; diff --git a/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs b/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs index c28bccb0..4bef5275 100644 --- a/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/Dialogs/MessageBoxViewModel.cs @@ -22,8 +22,8 @@ namespace LibationAvalonia.ViewModels.Dialogs public bool HasButton3 => !string.IsNullOrEmpty(Button3Text); public bool HasButton2 => !string.IsNullOrEmpty(Button2Text); - public int WindowHeight { get;private set; } - public int WindowWidth { get;private set; } + public int WindowHeight { get; private set; } + public int WindowWidth { get; private set; } public string Button1Text => _button switch { @@ -47,7 +47,7 @@ namespace LibationAvalonia.ViewModels.Dialogs MessageBoxButtons.CancelTryContinue => "Try", _ => string.Empty, }; - + public string Button3Text => _button switch { MessageBoxButtons.AbortRetryIgnore => "Ignore", diff --git a/Source/LibationAvalonia/ViewModels/MainWindowViewModel.cs b/Source/LibationAvalonia/ViewModels/MainWindowViewModel.cs index 8c76b2c8..367e0702 100644 --- a/Source/LibationAvalonia/ViewModels/MainWindowViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/MainWindowViewModel.cs @@ -1,4 +1,6 @@ using ApplicationServices; +using Avalonia.Collections; +using Avalonia.Controls; using LibationFileManager; using ReactiveUI; @@ -41,24 +43,25 @@ namespace LibationAvalonia.ViewModels /// Auto scanning accounts is enables - public bool AutoScanChecked - { - get => _autoScanChecked; - set - { + public bool AutoScanChecked + { + get => _autoScanChecked; + set + { if (value != _autoScanChecked) Configuration.Instance.AutoScan = value; this.RaiseAndSetIfChanged(ref _autoScanChecked, value); - } + } } + public AvaloniaList QuickFilterMenuItems { get; } = new(); /// Indicates if the first quick filter is the default filter public bool FirstFilterIsDefault - { - get => _firstFilterIsDefault; - set - { + { + get => _firstFilterIsDefault; + set + { if (value != _firstFilterIsDefault) QuickFilters.UseDefault = value; this.RaiseAndSetIfChanged(ref _firstFilterIsDefault, value); diff --git a/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs b/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs index 58dfe144..0f8f2ff9 100644 --- a/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProcessBookViewModel.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using ApplicationServices; +using ApplicationServices; using AudibleApi; using AudibleApi.Common; using Avalonia.Media; @@ -15,6 +11,10 @@ using FileLiberator; using LibationFileManager; using LibationUiBase; using ReactiveUI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; namespace LibationAvalonia.ViewModels { @@ -65,7 +65,7 @@ namespace LibationAvalonia.ViewModels public string Author { get => _author; set => Dispatcher.UIThread.Post(() => this.RaiseAndSetIfChanged(ref _author, value)); } public string Title { get => _title; set => Dispatcher.UIThread.Post(() => this.RaiseAndSetIfChanged(ref _title, value)); } public int Progress { get => _progress; private set => Dispatcher.UIThread.Post(() => this.RaiseAndSetIfChanged(ref _progress, value)); } - public string ETA { get => _eta; private set => Dispatcher.UIThread.Post(() =>this.RaiseAndSetIfChanged(ref _eta, value)); } + public string ETA { get => _eta; private set => Dispatcher.UIThread.Post(() => this.RaiseAndSetIfChanged(ref _eta, value)); } public Bitmap Cover { get => _cover; private set => Dispatcher.UIThread.Post(() => this.RaiseAndSetIfChanged(ref _cover, value)); } public bool IsFinished => Status is not ProcessBookStatus.Queued and not ProcessBookStatus.Working; public bool IsDownloading => Status is ProcessBookStatus.Working; @@ -315,36 +315,36 @@ namespace LibationAvalonia.ViewModels Logger.Info($"{((Processable)sender).Name} Step, Completed: {libraryBook.Book}"); UnlinkProcessable((Processable)sender); - if (Processes.Count == 0) - { - Completed?.Invoke(this, EventArgs.Empty); + if (Processes.Count == 0) + { + Completed?.Invoke(this, EventArgs.Empty); return; - } + } - NextProcessable(); - LinkProcessable(CurrentProcessable); + NextProcessable(); + LinkProcessable(CurrentProcessable); StatusHandler result; - try + try { result = await CurrentProcessable.ProcessSingleAsync(libraryBook, validate: true); - } - catch (Exception ex) - { - Serilog.Log.Logger.Error(ex, $"{nameof(Processable_Completed)} error"); + } + catch (Exception ex) + { + Serilog.Log.Logger.Error(ex, $"{nameof(Processable_Completed)} error"); - result = new StatusHandler(); - result.AddError($"{nameof(Processable_Completed)} error. See log for details. Error summary: {ex.Message}"); - } + result = new StatusHandler(); + result.AddError($"{nameof(Processable_Completed)} error. See log for details. Error summary: {ex.Message}"); + } - if (result.HasErrors) - { - foreach (var errorMessage in result.Errors.Where(e => e != "Validation failed")) - Logger.Error(errorMessage); + if (result.HasErrors) + { + foreach (var errorMessage in result.Errors.Where(e => e != "Validation failed")) + Logger.Error(errorMessage); - Completed?.Invoke(this, EventArgs.Empty); - } - } + Completed?.Invoke(this, EventArgs.Empty); + } + } #endregion diff --git a/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs b/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs index fbcc46d9..c7742e92 100644 --- a/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProcessQueueViewModel.cs @@ -33,7 +33,7 @@ namespace LibationAvalonia.ViewModels Queue.CompletedCountChanged += Queue_CompletedCountChanged; if (Design.IsDesignMode) - _ = Configuration.Instance.LibationFiles; + _ = Configuration.Instance.LibationFiles; SpeedLimit = Configuration.Instance.DownloadSpeedLimit / 1024m / 1024; } diff --git a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs index e35cc9c8..481f1b7b 100644 --- a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs +++ b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs @@ -133,12 +133,12 @@ namespace LibationAvalonia.ViewModels } private void GridEntries_CollectionChanged(object sender = null, EventArgs e = null) - { + { var count = FilteredInGridEntries?.OfType().Count() ?? SOURCE.OfType().Count(); - VisibleCountChanged?.Invoke(this, count); + VisibleCountChanged?.Invoke(this, count); } /// diff --git a/Source/LibationAvalonia/ViewModels/ViewModelBase.cs b/Source/LibationAvalonia/ViewModels/ViewModelBase.cs index 4dd106c2..f521141b 100644 --- a/Source/LibationAvalonia/ViewModels/ViewModelBase.cs +++ b/Source/LibationAvalonia/ViewModels/ViewModelBase.cs @@ -1,8 +1,4 @@ -using Avalonia.Controls; using ReactiveUI; -using System; -using System.Collections.Generic; -using System.Text; namespace LibationAvalonia.ViewModels { diff --git a/Source/LibationAvalonia/Views/LiberateStatusButton.axaml b/Source/LibationAvalonia/Views/LiberateStatusButton.axaml index 8c20263c..56eafd97 100644 --- a/Source/LibationAvalonia/Views/LiberateStatusButton.axaml +++ b/Source/LibationAvalonia/Views/LiberateStatusButton.axaml @@ -35,7 +35,7 @@ Name="button" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" - IsEnabled="{Binding IsButtonEnabled}" Padding="0" Click="Button_Click" > + IsEnabled="{CompiledBinding IsButtonEnabled}" Padding="0" Click="Button_Click" > _viewModel.LibraryStats = LibraryCommands.GetCounts()); + updateCountsTask = Dispatcher.UIThread.InvokeAsync(() => _viewModel.LibraryStats = LibraryCommands.GetCounts()); } } } diff --git a/Source/LibationAvalonia/Views/MainWindow.Export.cs b/Source/LibationAvalonia/Views/MainWindow.Export.cs index 0e849899..7bcd0fb9 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Export.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Export.cs @@ -1,14 +1,11 @@ using ApplicationServices; -using Avalonia.Controls; using Avalonia.Platform.Storage; using FileManager; using LibationFileManager; using System; -using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_Export() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.Filter.cs b/Source/LibationAvalonia/Views/MainWindow.Filter.cs index e550abf2..9874b586 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Filter.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Filter.cs @@ -1,18 +1,16 @@ using Avalonia.Input; using System; -using System.Linq; using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { protected void Configure_Filter() { } public async void filterHelpBtn_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) => await (new LibationAvalonia.Dialogs.SearchSyntaxDialog()).ShowDialog(this); - + public async void filterSearchTb_KeyPress(object sender, KeyEventArgs e) { if (e.Key == Key.Return) diff --git a/Source/LibationAvalonia/Views/MainWindow.Liberate.cs b/Source/LibationAvalonia/Views/MainWindow.Liberate.cs index 6aab470f..c79ba1e9 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Liberate.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Liberate.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_Liberate() { } diff --git a/Source/LibationAvalonia/Views/MainWindow.NoUI.cs b/Source/LibationAvalonia/Views/MainWindow.NoUI.cs index acb239ad..22542e70 100644 --- a/Source/LibationAvalonia/Views/MainWindow.NoUI.cs +++ b/Source/LibationAvalonia/Views/MainWindow.NoUI.cs @@ -1,8 +1,6 @@ using LibationFileManager; using LibationUiBase; -using System; using System.IO; -using System.Linq; namespace LibationAvalonia.Views { @@ -13,11 +11,11 @@ namespace LibationAvalonia.Views using var ms1 = new MemoryStream(); App.OpenAsset("img-coverart-prod-unavailable_80x80.jpg").CopyTo(ms1); PictureStorage.SetDefaultImage(PictureSize._80x80, ms1.ToArray()); - + using var ms2 = new MemoryStream(); App.OpenAsset("img-coverart-prod-unavailable_300x300.jpg").CopyTo(ms2); PictureStorage.SetDefaultImage(PictureSize._300x300, ms2.ToArray()); - + using var ms3 = new MemoryStream(); App.OpenAsset("img-coverart-prod-unavailable_500x500.jpg").CopyTo(ms3); PictureStorage.SetDefaultImage(PictureSize._500x500, ms3.ToArray()); diff --git a/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs b/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs index b63a183b..7b3699d5 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ProcessQueue.cs @@ -3,7 +3,6 @@ using Dinah.Core; using LibationFileManager; using LibationUiBase.GridView; using System; -using System.Collections.Generic; using System.Linq; namespace LibationAvalonia.Views diff --git a/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs b/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs index a3f6563f..74220033 100644 --- a/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs +++ b/Source/LibationAvalonia/Views/MainWindow.QuickFilters.cs @@ -1,11 +1,11 @@ -using Avalonia.Controls; +using Avalonia; +using Avalonia.Controls; using LibationFileManager; -using System; using System.Linq; +using Avalonia.Data; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_QuickFilters() @@ -13,24 +13,54 @@ namespace LibationAvalonia.Views _viewModel.FirstFilterIsDefault = QuickFilters.UseDefault; Load += updateFiltersMenu; QuickFilters.Updated += updateFiltersMenu; + + //We need to be able to dynamically add and remove menu items from the Quick Filters menu. + //To do that, we need quick filter's menu items source to be writable, which we can only + //achieve by creating the list ourselves (instead of allowing Avalonia to create it from the xaml) + + var startWithFilterMenuItem = new MenuItem + { + Header = "Start Libation with 1st filter _Default", + Icon = new CheckBox + { + BorderThickness = new Thickness(0), + IsHitTestVisible = false, + [!CheckBox.IsCheckedProperty] = new Binding(nameof(_viewModel.FirstFilterIsDefault)) + } + }; + + var editFiltersMenuItem = new MenuItem { Header = "_Edit quick filters..." }; + + startWithFilterMenuItem.Click += firstFilterIsDefaultToolStripMenuItem_Click; + editFiltersMenuItem.Click += editQuickFiltersToolStripMenuItem_Click; + + _viewModel.QuickFilterMenuItems.Add(startWithFilterMenuItem); + _viewModel.QuickFilterMenuItems.Add(editFiltersMenuItem); + _viewModel.QuickFilterMenuItems.Add(new Separator()); + } + + private async void QuickFiltersMenuItem_KeyDown(object sender, Avalonia.Input.KeyEventArgs e) + { + int keyNum = (int)e.Key - 34; + + if (keyNum <=9 && keyNum >= 1) + { + var menuItem = _viewModel.QuickFilterMenuItems + .OfType() + .FirstOrDefault(i => i.Header is string h && h.StartsWith($"_{keyNum}")); + + if (menuItem is not null) + { + await performFilter(menuItem.Tag as string); + e.Handled = true; + } + } } - private object quickFilterTag { get; } = new(); private void updateFiltersMenu(object _ = null, object __ = null) { - var allItems = quickFiltersToolStripMenuItem - .Items - .Cast() - .ToList(); - - var toRemove = allItems - .OfType() - .Where(mi => mi.Tag == quickFilterTag) - .ToList(); - - allItems = allItems - .Except(toRemove) - .ToList(); + //Clear all filters + _viewModel.QuickFilterMenuItems.RemoveAll(_viewModel.QuickFilterMenuItems.Where(i => i.Tag is string).ToList()); // re-populate var index = 0; @@ -38,27 +68,23 @@ namespace LibationAvalonia.Views { var quickFilterMenuItem = new MenuItem { - Tag = quickFilterTag, + Tag = filter, Header = $"_{++index}: {filter}" }; quickFilterMenuItem.Click += async (_, __) => await performFilter(filter); - allItems.Add(quickFilterMenuItem); + _viewModel.QuickFilterMenuItems.Add(quickFilterMenuItem); } - quickFiltersToolStripMenuItem.Items = allItems; } - public void firstFilterIsDefaultToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) + private void firstFilterIsDefaultToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) { - if (sender is MenuItem mi && mi.Icon is CheckBox checkBox) - { - checkBox.IsChecked = !(checkBox.IsChecked ?? false); - } + _viewModel.FirstFilterIsDefault = !_viewModel.FirstFilterIsDefault; } - public void addQuickFilterBtn_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) + private void addQuickFilterBtn_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) => QuickFilters.Add(_viewModel.FilterString); - public async void editQuickFiltersToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) + private async void editQuickFiltersToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e) => await new Dialogs.EditQuickFilters().ShowDialog(this); } } diff --git a/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs b/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs index e95b2bd4..785bddcb 100644 --- a/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs +++ b/Source/LibationAvalonia/Views/MainWindow.RemoveBooks.cs @@ -1,14 +1,12 @@ using AudibleUtilities; using LibationAvalonia.Dialogs; -using System; using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { - private void Configure_RemoveBooks() + private void Configure_RemoveBooks() { if (Avalonia.Controls.Design.IsDesignMode) return; diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs b/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs index 7b9b33be..785202da 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanAuto.cs @@ -43,7 +43,7 @@ namespace LibationAvalonia.Views }; _viewModel.AutoScanChecked = Configuration.Instance.AutoScan; - + // if enabled: begin on load Opened += startAutoScan; diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs b/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs index 1349d02f..4375c7c3 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanManual.cs @@ -1,6 +1,5 @@ using ApplicationServices; using AudibleUtilities; -using Avalonia.Controls; using LibationAvalonia.Dialogs; using LibationFileManager; using System; @@ -10,7 +9,6 @@ using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_ScanManual() @@ -69,7 +67,7 @@ namespace LibationAvalonia.Views if (Configuration.Instance.ShowImportedStats && newAdded > 0) await MessageBox.Show($"Total processed: {totalProcessed}\r\nNew: {newAdded}"); } - catch(OperationCanceledException) + catch (OperationCanceledException) { Serilog.Log.Information("Audible login attempt cancelled by user"); } diff --git a/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs b/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs index 08f39e8d..8f27fdb9 100644 --- a/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs +++ b/Source/LibationAvalonia/Views/MainWindow.ScanNotification.cs @@ -1,10 +1,8 @@ using ApplicationServices; using System; -using System.Linq; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_ScanNotification() diff --git a/Source/LibationAvalonia/Views/MainWindow.Settings.cs b/Source/LibationAvalonia/Views/MainWindow.Settings.cs index 9cb02447..2a99fd97 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Settings.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Settings.cs @@ -3,7 +3,6 @@ using System; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_Settings() { } @@ -23,7 +22,7 @@ namespace LibationAvalonia.Views { System.Diagnostics.Process.Start("Hangover" + (Configuration.IsWindows ? ".exe" : "")); } - catch(Exception ex) + catch (Exception ex) { Serilog.Log.Logger.Error(ex, "Failed to launch Hangover"); } diff --git a/Source/LibationAvalonia/Views/MainWindow.Upgrade.cs b/Source/LibationAvalonia/Views/MainWindow.Upgrade.cs index 02b315ba..ce999588 100644 --- a/Source/LibationAvalonia/Views/MainWindow.Upgrade.cs +++ b/Source/LibationAvalonia/Views/MainWindow.Upgrade.cs @@ -1,12 +1,7 @@ -using Avalonia.Threading; -using LibationAvalonia.Dialogs; -using LibationUiBase; -using System.Threading.Tasks; - -namespace LibationAvalonia.Views +namespace LibationAvalonia.Views { - public partial class MainWindow - { + public partial class MainWindow + { private void Configure_Upgrade() { setProgressVisible(false); diff --git a/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs b/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs index caa5a52b..097d26a5 100644 --- a/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs +++ b/Source/LibationAvalonia/Views/MainWindow.VisibleBooks.cs @@ -1,15 +1,11 @@ using ApplicationServices; using Avalonia.Threading; using DataLayer; -using Dinah.Core; -using LibationFileManager; using System; -using System.Linq; using System.Threading.Tasks; namespace LibationAvalonia.Views { - //DONE public partial class MainWindow { private void Configure_VisibleBooks() @@ -52,15 +48,15 @@ namespace LibationAvalonia.Views var confirmationResult = await MessageBox.ShowConfirmationDialog( this, visibleLibraryBooks, - // do not use `$` string interpolation. See impl. - "Are you sure you want to replace tags in {0}?", + // do not use `$` string interpolation. See impl. + "Are you sure you want to replace tags in {0}?", "Replace tags?"); if (confirmationResult != DialogResult.Yes) return; visibleLibraryBooks.UpdateTags(dialog.NewTags); - } + } public async void setBookDownloadedManualToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) { @@ -74,73 +70,73 @@ namespace LibationAvalonia.Views var confirmationResult = await MessageBox.ShowConfirmationDialog( this, visibleLibraryBooks, - // do not use `$` string interpolation. See impl. - "Are you sure you want to replace book downloaded status in {0}?", + // do not use `$` string interpolation. See impl. + "Are you sure you want to replace book downloaded status in {0}?", "Replace downloaded status?"); if (confirmationResult != DialogResult.Yes) return; - visibleLibraryBooks.UpdateBookStatus(dialog.BookLiberatedStatus); - } + visibleLibraryBooks.UpdateBookStatus(dialog.BookLiberatedStatus); + } - public async void setPdfDownloadedManualToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) - { - var dialog = new Dialogs.LiberatedStatusBatchManualDialog(isPdf: true); - var result = await dialog.ShowDialog(this); - if (result != DialogResult.OK) - return; + public async void setPdfDownloadedManualToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) + { + var dialog = new Dialogs.LiberatedStatusBatchManualDialog(isPdf: true); + var result = await dialog.ShowDialog(this); + if (result != DialogResult.OK) + return; - var visibleLibraryBooks = _viewModel.ProductsDisplay.GetVisibleBookEntries(); + var visibleLibraryBooks = _viewModel.ProductsDisplay.GetVisibleBookEntries(); - var confirmationResult = await MessageBox.ShowConfirmationDialog( - this, - visibleLibraryBooks, - // do not use `$` string interpolation. See impl. - "Are you sure you want to replace PDF downloaded status in {0}?", - "Replace downloaded status?"); + var confirmationResult = await MessageBox.ShowConfirmationDialog( + this, + visibleLibraryBooks, + // do not use `$` string interpolation. See impl. + "Are you sure you want to replace PDF downloaded status in {0}?", + "Replace downloaded status?"); - if (confirmationResult != DialogResult.Yes) - return; + if (confirmationResult != DialogResult.Yes) + return; - visibleLibraryBooks.UpdatePdfStatus(dialog.BookLiberatedStatus); - } + visibleLibraryBooks.UpdatePdfStatus(dialog.BookLiberatedStatus); + } - public async void setDownloadedAutoToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) - { - var dialog = new Dialogs.LiberatedStatusBatchAutoDialog(); - var result = await dialog.ShowDialog(this); - if (result != DialogResult.OK) - return; + public async void setDownloadedAutoToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) + { + var dialog = new Dialogs.LiberatedStatusBatchAutoDialog(); + var result = await dialog.ShowDialog(this); + if (result != DialogResult.OK) + return; - var bulkSetStatus = new BulkSetDownloadStatus(_viewModel.ProductsDisplay.GetVisibleBookEntries(), dialog.SetDownloaded, dialog.SetNotDownloaded); - var count = await Task.Run(bulkSetStatus.Discover); + var bulkSetStatus = new BulkSetDownloadStatus(_viewModel.ProductsDisplay.GetVisibleBookEntries(), dialog.SetDownloaded, dialog.SetNotDownloaded); + var count = await Task.Run(bulkSetStatus.Discover); - if (count == 0) - return; + if (count == 0) + return; - var confirmationResult = await MessageBox.Show( - bulkSetStatus.AggregateMessage, - "Replace downloaded status?", - MessageBoxButtons.YesNo, - MessageBoxIcon.Question, - MessageBoxDefaultButton.Button1); + var confirmationResult = await MessageBox.Show( + bulkSetStatus.AggregateMessage, + "Replace downloaded status?", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question, + MessageBoxDefaultButton.Button1); - if (confirmationResult != DialogResult.Yes) - return; + if (confirmationResult != DialogResult.Yes) + return; - bulkSetStatus.Execute(); - } + bulkSetStatus.Execute(); + } - public async void removeToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) + public async void removeToolStripMenuItem_Click(object sender, Avalonia.Interactivity.RoutedEventArgs args) { var visibleLibraryBooks = _viewModel.ProductsDisplay.GetVisibleBookEntries(); var confirmationResult = await MessageBox.ShowConfirmationDialog( this, visibleLibraryBooks, - // do not use `$` string interpolation. See impl. - "Are you sure you want to remove {0} from Libation's library?", + // do not use `$` string interpolation. See impl. + "Are you sure you want to remove {0} from Libation's library?", "Remove books from Libation?", MessageBoxDefaultButton.Button2); diff --git a/Source/LibationAvalonia/Views/MainWindow.axaml b/Source/LibationAvalonia/Views/MainWindow.axaml index d4485a6a..8f141bbf 100644 --- a/Source/LibationAvalonia/Views/MainWindow.axaml +++ b/Source/LibationAvalonia/Views/MainWindow.axaml @@ -86,20 +86,13 @@ - + - - - - - - - diff --git a/Source/LibationAvalonia/Views/MainWindow.axaml.cs b/Source/LibationAvalonia/Views/MainWindow.axaml.cs index 6a436916..b33cb440 100644 --- a/Source/LibationAvalonia/Views/MainWindow.axaml.cs +++ b/Source/LibationAvalonia/Views/MainWindow.axaml.cs @@ -1,11 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; using ApplicationServices; using Avalonia.ReactiveUI; using DataLayer; using LibationAvalonia.ViewModels; using LibationFileManager; +using System; +using System.Collections.Generic; +using System.Linq; namespace LibationAvalonia.Views { diff --git a/Source/LibationAvalonia/Views/ProcessBookControl.axaml b/Source/LibationAvalonia/Views/ProcessBookControl.axaml index 0c2cb800..0592c850 100644 --- a/Source/LibationAvalonia/Views/ProcessBookControl.axaml +++ b/Source/LibationAvalonia/Views/ProcessBookControl.axaml @@ -2,20 +2,22 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:vm="clr-namespace:LibationAvalonia.ViewModels" + x:DataType="vm:ProcessBookViewModel" mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="87" MaxHeight="87" MinHeight="87" MinWidth="300" - x:Class="LibationAvalonia.Views.ProcessBookControl" Background="{Binding BackgroundColor}"> + x:Class="LibationAvalonia.Views.ProcessBookControl" Background="{CompiledBinding BackgroundColor}"> - + - - - + + + @@ -23,8 +25,8 @@ - - + + @@ -39,7 +41,7 @@ - + - - + diff --git a/Source/LibationAvalonia/Views/ProcessBookControl.axaml.cs b/Source/LibationAvalonia/Views/ProcessBookControl.axaml.cs index ccbdbe43..f7ccc4d0 100644 --- a/Source/LibationAvalonia/Views/ProcessBookControl.axaml.cs +++ b/Source/LibationAvalonia/Views/ProcessBookControl.axaml.cs @@ -1,9 +1,7 @@ -using System; -using Avalonia.Controls; -using Avalonia.Markup.Xaml; -using LibationAvalonia.ViewModels; using ApplicationServices; +using Avalonia.Controls; using DataLayer; +using LibationAvalonia.ViewModels; using LibationUiBase; namespace LibationAvalonia.Views diff --git a/Source/LibationAvalonia/Views/ProcessQueueControl.axaml.cs b/Source/LibationAvalonia/Views/ProcessQueueControl.axaml.cs index 51f25bab..70c95408 100644 --- a/Source/LibationAvalonia/Views/ProcessQueueControl.axaml.cs +++ b/Source/LibationAvalonia/Views/ProcessQueueControl.axaml.cs @@ -2,7 +2,6 @@ using Avalonia; using Avalonia.Controls; using Avalonia.Data.Converters; -using Avalonia.Markup.Xaml; using DataLayer; using LibationAvalonia.ViewModels; using LibationUiBase; @@ -14,7 +13,7 @@ using System.Linq; namespace LibationAvalonia.Views { public partial class ProcessQueueControl : UserControl - { + { private TrackedQueue Queue => _viewModel.Queue; private ProcessQueueViewModel _viewModel => DataContext as ProcessQueueViewModel; diff --git a/Source/LibationAvalonia/Views/ProductsDisplay.axaml b/Source/LibationAvalonia/Views/ProductsDisplay.axaml index 38a6b59d..f93e5abb 100644 --- a/Source/LibationAvalonia/Views/ProductsDisplay.axaml +++ b/Source/LibationAvalonia/Views/ProductsDisplay.axaml @@ -3,6 +3,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:views="clr-namespace:LibationAvalonia.Views" + xmlns:uibase="clr-namespace:LibationUiBase.GridView;assembly=LibationUiBase" xmlns:controls="clr-namespace:LibationAvalonia.Controls" mc:Ignorable="d" d:DesignWidth="1560" d:DesignHeight="400" x:Class="LibationAvalonia.Views.ProductsDisplay"> @@ -37,6 +38,14 @@ + + @@ -51,25 +60,25 @@ Width="75"> - + + IsChecked="{CompiledBinding Remove, Mode=TwoWay}" /> - + @@ -77,17 +86,17 @@ - - + + - - - + + + @@ -95,9 +104,9 @@ - - - + + + @@ -105,9 +114,9 @@ - - - + + + @@ -115,9 +124,9 @@ - - - + + + @@ -125,9 +134,9 @@ - - - + + + @@ -135,9 +144,9 @@ - - - + + + @@ -145,49 +154,51 @@ - - - + + + + OpacityBinding="{CompiledBinding Liberate.Opacity}" + BackgroundBinding="{CompiledBinding Liberate.BackgroundBrush}" + ClipboardContentBinding="{CompiledBinding ProductRating}" + Binding="{CompiledBinding ProductRating}" /> - - - + + + + OpacityBinding="{CompiledBinding Liberate.Opacity}" + BackgroundBinding="{CompiledBinding Liberate.BackgroundBrush}" + ClipboardContentBinding="{CompiledBinding MyRating}" + Binding="{CompiledBinding MyRating, Mode=TwoWay}" /> - - - + + + @@ -195,9 +206,9 @@ - - - + + + @@ -205,13 +216,13 @@ - - diff --git a/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs b/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs index 8f29b4ca..f8610139 100644 --- a/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs +++ b/Source/LibationAvalonia/Views/ProductsDisplay.axaml.cs @@ -1,7 +1,6 @@ using ApplicationServices; using Avalonia; using Avalonia.Controls; -using Avalonia.Markup.Xaml; using Avalonia.Platform.Storage; using DataLayer; using FileLiberator; @@ -256,7 +255,7 @@ namespace LibationAvalonia.Views contextMenu.MenuClosed += ContextMenu_MenuClosed; contextMenu.ContextMenuOpening += ContextMenu_ContextMenuOpening; List menuItems = new(); - contextMenu.Items = menuItems; + contextMenu.ItemsSource = menuItems; menuItems.Add(new MenuItem { Header = "Show / Hide Columns" }); menuItems.Add(new MenuItem { Header = "-" }); @@ -274,13 +273,9 @@ namespace LibationAvalonia.Views ( new MenuItem { - Header = ((string)column.Header).Replace((char)0xa, ' '), + Header = ((string)column.Header).Replace('\n', ' '), Tag = column, - Margin = new Thickness(6, 0), - Icon = new CheckBox - { - Width = 50, - } + Icon = new CheckBox(), } ); diff --git a/Source/LibationAvalonia/Views/SeriesViewDialog.axaml.cs b/Source/LibationAvalonia/Views/SeriesViewDialog.axaml.cs index f80e0991..a337c349 100644 --- a/Source/LibationAvalonia/Views/SeriesViewDialog.axaml.cs +++ b/Source/LibationAvalonia/Views/SeriesViewDialog.axaml.cs @@ -1,16 +1,11 @@ -using AudibleApi.Common; -using AudibleApi; +using Avalonia.Collections; using Avalonia.Controls; +using Avalonia.Media; using DataLayer; using Dinah.Core; -using FileLiberator; -using System.Collections.Generic; -using System.Linq; -using Avalonia.Collections; using LibationAvalonia.Dialogs; using LibationUiBase.SeriesView; using System; -using Avalonia.Media; namespace LibationAvalonia.Views { diff --git a/Source/LibationAvalonia/Views/SeriesViewGrid.axaml b/Source/LibationAvalonia/Views/SeriesViewGrid.axaml index 712eb24e..ad7d3a91 100644 --- a/Source/LibationAvalonia/Views/SeriesViewGrid.axaml +++ b/Source/LibationAvalonia/Views/SeriesViewGrid.axaml @@ -4,6 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" xmlns:controls="clr-namespace:LibationAvalonia.Controls" + xmlns:uibase="clr-namespace:LibationUiBase.SeriesView;assembly=LibationUiBase" x:Class="LibationAvalonia.Views.SeriesViewGrid"> - + @@ -46,10 +47,10 @@ - + @@ -59,7 +60,7 @@ - +