using ApplicationServices; using System; using System.Threading.Tasks; using DataLayer; using Avalonia.Threading; using LibationAvalonia.Dialogs; using ReactiveUI; namespace LibationAvalonia.ViewModels { partial class MainVM { private int _visibleNotLiberated = 1; private int _visibleCount = 1; /// The Bottom-right visible book count status text public string VisibleCountText => $"Visible: {_visibleCount}"; /// The Visible Books menu item header text public string VisibleCountMenuItemText => menufyText($"Visible Books {_visibleCount}"); /// Indicates if any of the books visible in the Products Display haven't been liberated public bool AnyVisibleNotLiberated => _visibleNotLiberated > 0; /// The "Liberate Visible Books" menu item header text (submenu item of the "Liberate Menu" menu item) public string LiberateVisibleToolStripText { get; private set; } = "Liberate _Visible Books: 0"; /// The "Liberate" menu item header text (submenu item of the "Visible Books" menu item) public string LiberateVisibleToolStripText_2 { get; private set; } = menufyText("Liberate: 0"); private void Configure_VisibleBooks() { LibraryCommands.BookUserDefinedItemCommitted += setLiberatedVisibleMenuItemAsync; ProductsDisplay.VisibleCountChanged += ProductsDisplay_VisibleCountChanged; } private void setVisibleCount(int visibleCount) { _visibleCount = visibleCount; this.RaisePropertyChanged(nameof(VisibleCountText)); this.RaisePropertyChanged(nameof(VisibleCountMenuItemText)); } private void setVisibleNotLiberatedCount(int visibleNotLiberated) { _visibleNotLiberated = visibleNotLiberated; LiberateVisibleToolStripText = AnyVisibleNotLiberated ? "Liberate " + menufyText($"Visible Books: {visibleNotLiberated}") : "All visible books are liberated"; LiberateVisibleToolStripText_2 = AnyVisibleNotLiberated ? menufyText($"Liberate: {visibleNotLiberated}") : "All visible books are liberated"; this.RaisePropertyChanged(nameof(AnyVisibleNotLiberated)); this.RaisePropertyChanged(nameof(LiberateVisibleToolStripText)); this.RaisePropertyChanged(nameof(LiberateVisibleToolStripText_2)); } public async void ProductsDisplay_VisibleCountChanged(object sender, int qty) { setVisibleCount(qty); await Dispatcher.UIThread.InvokeAsync(setLiberatedVisibleMenuItem); } private async void setLiberatedVisibleMenuItemAsync(object _, object __) => await Dispatcher.UIThread.InvokeAsync(setLiberatedVisibleMenuItem); public void LiberateVisible() { try { setQueueCollapseState(false); Serilog.Log.Logger.Information("Begin backing up visible library books"); ProcessQueue.AddDownloadDecrypt( ProductsDisplay .GetVisibleBookEntries() .UnLiberated() ); } catch (Exception ex) { Serilog.Log.Logger.Error(ex, "An error occurred while backing up visible library books"); } } public async Task ReplaceTagsAsync() { var dialog = new TagsBatchDialog(); var result = await dialog.ShowDialog(MainWindow); if (result != DialogResult.OK) return; var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries(); var confirmationResult = await MessageBox.ShowConfirmationDialog( MainWindow, visibleLibraryBooks, // 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 Task SetBookDownloadedAsync() { var dialog = new LiberatedStatusBatchManualDialog(); var result = await dialog.ShowDialog(MainWindow); if (result != DialogResult.OK) return; var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries(); var confirmationResult = await MessageBox.ShowConfirmationDialog( MainWindow, visibleLibraryBooks, // 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); } public async Task SetPdfDownloadedAsync() { var dialog = new LiberatedStatusBatchManualDialog(isPdf: true); var result = await dialog.ShowDialog(MainWindow); if (result != DialogResult.OK) return; var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries(); var confirmationResult = await MessageBox.ShowConfirmationDialog( MainWindow, 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; visibleLibraryBooks.UpdatePdfStatus(dialog.BookLiberatedStatus); } public async Task SetDownloadedAutoAsync() { var dialog = new LiberatedStatusBatchAutoDialog(); var result = await dialog.ShowDialog(MainWindow); if (result != DialogResult.OK) return; var bulkSetStatus = new BulkSetDownloadStatus(ProductsDisplay.GetVisibleBookEntries(), dialog.SetDownloaded, dialog.SetNotDownloaded); var count = await Task.Run(bulkSetStatus.Discover); if (count == 0) return; var confirmationResult = await MessageBox.Show( bulkSetStatus.AggregateMessage, "Replace downloaded status?", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (confirmationResult != DialogResult.Yes) return; bulkSetStatus.Execute(); } public async Task RemoveVisibleAsync() { var visibleLibraryBooks = ProductsDisplay.GetVisibleBookEntries(); var confirmationResult = await MessageBox.ShowConfirmationDialog( MainWindow, visibleLibraryBooks, // 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); if (confirmationResult is DialogResult.Yes) await visibleLibraryBooks.RemoveBooksAsync(); } private void setLiberatedVisibleMenuItem() { var libraryStats = LibraryCommands.GetCounts(ProductsDisplay.GetVisibleBookEntries()); setVisibleNotLiberatedCount(libraryStats.PendingBooks); } } }