diff --git a/LibationLauncher/LibationLauncher.csproj b/LibationLauncher/LibationLauncher.csproj index cc7f8967..8284fd30 100644 --- a/LibationLauncher/LibationLauncher.csproj +++ b/LibationLauncher/LibationLauncher.csproj @@ -13,7 +13,7 @@ win-x64 - 5.6.0.1 + 5.6.0.2 diff --git a/LibationWinForms/Form1.Designer.cs b/LibationWinForms/Form1.Designer.cs index 00917758..1710dccc 100644 --- a/LibationWinForms/Form1.Designer.cs +++ b/LibationWinForms/Form1.Designer.cs @@ -173,18 +173,19 @@ this.removeLibraryBooksToolStripMenuItem.Name = "removeLibraryBooksToolStripMenuItem"; this.removeLibraryBooksToolStripMenuItem.Size = new System.Drawing.Size(247, 22); this.removeLibraryBooksToolStripMenuItem.Text = "Remove Library Books"; + this.removeLibraryBooksToolStripMenuItem.Click += new System.EventHandler(this.removeLibraryBooksToolStripMenuItem_Click); // // removeAllAccountsToolStripMenuItem // this.removeAllAccountsToolStripMenuItem.Name = "removeAllAccountsToolStripMenuItem"; - this.removeAllAccountsToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.removeAllAccountsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.removeAllAccountsToolStripMenuItem.Text = "All Accounts"; this.removeAllAccountsToolStripMenuItem.Click += new System.EventHandler(this.removeAllAccountsToolStripMenuItem_Click); // // removeSomeAccountsToolStripMenuItem // this.removeSomeAccountsToolStripMenuItem.Name = "removeSomeAccountsToolStripMenuItem"; - this.removeSomeAccountsToolStripMenuItem.Size = new System.Drawing.Size(157, 22); + this.removeSomeAccountsToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.removeSomeAccountsToolStripMenuItem.Text = "Some Accounts"; this.removeSomeAccountsToolStripMenuItem.Click += new System.EventHandler(this.removeSomeAccountsToolStripMenuItem_Click); // @@ -201,23 +202,22 @@ // beginBookBackupsToolStripMenuItem // this.beginBookBackupsToolStripMenuItem.Name = "beginBookBackupsToolStripMenuItem"; - this.beginBookBackupsToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.beginBookBackupsToolStripMenuItem.Size = new System.Drawing.Size(293, 22); this.beginBookBackupsToolStripMenuItem.Text = "Begin &Book and PDF Backups: {0}"; this.beginBookBackupsToolStripMenuItem.Click += new System.EventHandler(this.beginBookBackupsToolStripMenuItem_Click); // // beginPdfBackupsToolStripMenuItem // this.beginPdfBackupsToolStripMenuItem.Name = "beginPdfBackupsToolStripMenuItem"; - this.beginPdfBackupsToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.beginPdfBackupsToolStripMenuItem.Size = new System.Drawing.Size(293, 22); this.beginPdfBackupsToolStripMenuItem.Text = "Begin &PDF Only Backups: {0}"; this.beginPdfBackupsToolStripMenuItem.Click += new System.EventHandler(this.beginPdfBackupsToolStripMenuItem_Click); // // convertAllM4bToMp3ToolStripMenuItem // this.convertAllM4bToMp3ToolStripMenuItem.Name = "convertAllM4bToMp3ToolStripMenuItem"; - this.convertAllM4bToMp3ToolStripMenuItem.Size = new System.Drawing.Size(284, 22); + this.convertAllM4bToMp3ToolStripMenuItem.Size = new System.Drawing.Size(293, 22); this.convertAllM4bToMp3ToolStripMenuItem.Text = "Convert all M4b to Mp3 [Long-running]..."; - this.convertAllM4bToMp3ToolStripMenuItem.Visible = true; this.convertAllM4bToMp3ToolStripMenuItem.Click += new System.EventHandler(this.convertAllM4bToMp3ToolStripMenuItem_Click); // // exportToolStripMenuItem @@ -310,7 +310,7 @@ // springLbl // this.springLbl.Name = "springLbl"; - this.springLbl.Size = new System.Drawing.Size(517, 17); + this.springLbl.Size = new System.Drawing.Size(548, 17); this.springLbl.Spring = true; // // backupsCountsLbl diff --git a/LibationWinForms/Form1.cs b/LibationWinForms/Form1.cs index 3470741f..3bda0aff 100644 --- a/LibationWinForms/Form1.cs +++ b/LibationWinForms/Form1.cs @@ -1,4 +1,8 @@ -using ApplicationServices; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using ApplicationServices; using DataLayer; using Dinah.Core; using Dinah.Core.Drawing; @@ -6,11 +10,6 @@ using Dinah.Core.Windows.Forms; using FileManager; using InternalUtilities; using LibationWinForms.Dialogs; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.Windows.Forms; namespace LibationWinForms { @@ -31,9 +30,9 @@ namespace LibationWinForms return; // independent UI updates - this.Load += setBackupCountsAsync; this.Load += (_, __) => RestoreSizeAndLocation(); this.Load += (_, __) => RefreshImportMenu(); + UserDefinedItem.ItemChanged += setBackupCounts; var format = System.Drawing.Imaging.ImageFormat.Jpeg; PictureStorage.SetDefaultImage(PictureSize._80x80, Properties.Resources.default_cover_80x80.ToBytes(format)); @@ -46,7 +45,7 @@ namespace LibationWinForms if (this.DesignMode) return; - reloadGrid(); + reloadGridAndUpdateBottomNumbers(); // also applies filter. ONLY call AFTER loading grid loadInitialQuickFilterState(); @@ -127,9 +126,7 @@ namespace LibationWinForms config.MainFormIsMaximized = this.WindowState == FormWindowState.Maximized; } - #region reload grid - private bool isProcessingGridSelect = false; - private void reloadGrid() + private void reloadGridAndUpdateBottomNumbers() { // suppressed filter while init'ing UI var prev_isProcessingGridSelect = isProcessingGridSelect; @@ -139,8 +136,11 @@ namespace LibationWinForms // UI init complete. now we can apply filter doFilter(lastGoodFilter); + + setBackupCounts(null, null); } + #region reload grid private ProductsGrid currProductsGrid; private void setGrid() { @@ -150,13 +150,11 @@ namespace LibationWinForms { gridPanel.Controls.Remove(currProductsGrid); currProductsGrid.VisibleCountChanged -= setVisibleCount; - currProductsGrid.BackupCountsChanged -= setBackupCountsAsync; currProductsGrid.Dispose(); } currProductsGrid = new ProductsGrid { Dock = DockStyle.Fill }; currProductsGrid.VisibleCountChanged += setVisibleCount; - currProductsGrid.BackupCountsChanged += setBackupCountsAsync; gridPanel.UIThread(() => gridPanel.Controls.Add(currProductsGrid)); currProductsGrid.Display(); } @@ -169,13 +167,42 @@ namespace LibationWinForms #endregion #region bottom: backup counts - private async void setBackupCountsAsync(object _, object __) + private System.ComponentModel.BackgroundWorker updateCountsBw; + private bool runBackupCountsAgain; + + private void setBackupCounts(object _, object __) { - var libraryStats = await Task.Run(() => LibraryCommands.GetCounts()); + runBackupCountsAgain = true; + + if (updateCountsBw is not null) + return; + + updateCountsBw = new System.ComponentModel.BackgroundWorker(); + updateCountsBw.DoWork += UpdateCountsBw_DoWork; + updateCountsBw.RunWorkerCompleted += UpdateCountsBw_RunWorkerCompleted; + updateCountsBw.RunWorkerAsync(); + } + + private void UpdateCountsBw_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) + { + while (runBackupCountsAgain) + { + runBackupCountsAgain = false; + + var libraryStats = LibraryCommands.GetCounts(); + e.Result = libraryStats; + } + updateCountsBw = null; + } + + private void UpdateCountsBw_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) + { + var libraryStats = e.Result as LibraryCommands.LibraryStats; setBookBackupCounts(libraryStats); setPdfBackupCounts(libraryStats); } + private void setBookBackupCounts(LibraryCommands.LibraryStats libraryStats) { var backupsCountsLbl_Format = "BACKUPS: No progress: {0} Encrypted: {1} Fully backed up: {2}"; @@ -248,6 +275,7 @@ namespace LibationWinForms } private void filterBtn_Click(object sender, EventArgs e) => doFilter(); + private bool isProcessingGridSelect = false; private string lastGoodFilter = ""; private void doFilter(string filterString) { @@ -287,11 +315,6 @@ namespace LibationWinForms removeLibraryBooksToolStripMenuItem.Visible = count != 0; - if (count == 1) - { - removeLibraryBooksToolStripMenuItem.Click += removeThisAccountToolStripMenuItem_Click; - } - removeSomeAccountsToolStripMenuItem.Visible = count > 1; removeAllAccountsToolStripMenuItem.Visible = count > 1; } @@ -329,13 +352,22 @@ namespace LibationWinForms scanLibraries(scanAccountsDialog.CheckedAccounts); } - private void removeThisAccountToolStripMenuItem_Click(object sender, EventArgs e) + private void removeLibraryBooksToolStripMenuItem_Click(object sender, EventArgs e) { + // if 0 accounts, this will not be visible + // if 1 account, run scanLibrariesRemovedBooks() on this account + // if multiple accounts, another menu set will open. do not run scanLibrariesRemovedBooks() using var persister = AudibleApiStorage.GetAccountsSettingsPersister(); - var firstAccount = persister.AccountsSettings.GetAll().FirstOrDefault(); + var accounts = persister.AccountsSettings.GetAll(); + + if (accounts.Count != 1) + return; + + var firstAccount = accounts.Single(); scanLibrariesRemovedBooks(firstAccount); } + // selectively remove books from all accounts private void removeAllAccountsToolStripMenuItem_Click(object sender, EventArgs e) { using var persister = AudibleApiStorage.GetAccountsSettingsPersister(); @@ -343,6 +375,7 @@ namespace LibationWinForms scanLibrariesRemovedBooks(allAccounts.ToArray()); } + // selectively remove books from some accounts private void removeSomeAccountsToolStripMenuItem_Click(object sender, EventArgs e) { using var scanAccountsDialog = new ScanAccountsDialog(this); @@ -362,7 +395,7 @@ namespace LibationWinForms dialog.ShowDialog(); if (dialog.BooksRemoved) - reloadGrid(); + reloadGridAndUpdateBottomNumbers(); } private void scanLibraries(IEnumerable accounts) => scanLibraries(accounts.ToArray()); @@ -377,7 +410,7 @@ namespace LibationWinForms MessageBox.Show($"Total processed: {totalProcessed}\r\nNew: {newAdded}"); if (totalProcessed > 0) - reloadGrid(); + reloadGridAndUpdateBottomNumbers(); } #endregion @@ -495,6 +528,5 @@ namespace LibationWinForms private void basicSettingsToolStripMenuItem_Click(object sender, EventArgs e) => new SettingsDialog().ShowDialog(); #endregion - } } diff --git a/LibationWinForms/ProductsGrid.cs b/LibationWinForms/ProductsGrid.cs index b6c6b5b0..e92ef9a1 100644 --- a/LibationWinForms/ProductsGrid.cs +++ b/LibationWinForms/ProductsGrid.cs @@ -29,7 +29,6 @@ namespace LibationWinForms public partial class ProductsGrid : UserControl { public event EventHandler VisibleCountChanged; - public event EventHandler BackupCountsChanged; // alias private DataGridView _dataGridView => gridEntryDataGridView; @@ -101,8 +100,6 @@ namespace LibationWinForms liveGridEntry.Liberate = (bookDetailsForm.BookLiberatedStatus, bookDetailsForm.PdfLiberatedStatus); liveGridEntry.EndEdit(); - - BackupCountsChanged?.Invoke(this, EventArgs.Empty); } #endregion @@ -145,8 +142,6 @@ namespace LibationWinForms // FILTER Filter(); - - BackupCountsChanged?.Invoke(this, EventArgs.Empty); } #endregion