using ApplicationServices; using Dinah.Core; using LibationFileManager; using ReactiveUI; namespace LibationWinForms.AvaloniaUI.ViewModels { public class MainWindowViewModel : ViewModelBase { private string _filterString; private string _removeBooksButtonText = "Remove # Books from Libation"; private bool _removeBooksButtonEnabled = true; private bool _autoScanChecked = true; private bool _firstFilterIsDefault = true; private bool _removeButtonsVisible = true; private int _numAccountsScanning = 2; private int _accountsCount = 0; private bool _queueOpen = true; private int _visibleCount = 1; private LibraryCommands.LibraryStats _libraryStats; private int _visibleNotLiberated = 1; /// The Process Queue's viewmodel public ProcessQueueViewModel ProcessQueueViewModel { get; } = new ProcessQueueViewModel(); public ProductsDisplayViewModel ProductsDisplay { get; } = new ProductsDisplayViewModel(); /// Library filterting query public string FilterString { get => _filterString; set => this.RaiseAndSetIfChanged(ref _filterString, value); } /// Display text for the "Remove # Books from Libation" button public string RemoveBooksButtonText { get => _removeBooksButtonText; set => this.RaiseAndSetIfChanged(ref _removeBooksButtonText, value); } /// Indicates if the "Remove # Books from Libation" button is enabled public bool RemoveBooksButtonEnabled { get => _removeBooksButtonEnabled; set { this.RaiseAndSetIfChanged(ref _removeBooksButtonEnabled, value); } } /// Auto scanning accounts is enables public bool AutoScanChecked { get => _autoScanChecked; set { if (value != _autoScanChecked) Configuration.Instance.AutoScan = value; this.RaiseAndSetIfChanged(ref _autoScanChecked, value); } } /// Indicates if the first quick filter is the default filter public bool FirstFilterIsDefault { get => _firstFilterIsDefault; set { if (value != _firstFilterIsDefault) QuickFilters.UseDefault = value; this.RaiseAndSetIfChanged(ref _firstFilterIsDefault, value); } } /// Indicates if the "Remove # Books from Libation" and "Done Removing" buttons should be visible public bool RemoveButtonsVisible { get => _removeButtonsVisible; set { this.RaiseAndSetIfChanged(ref _removeButtonsVisible, value); this.RaisePropertyChanged(nameof(RemoveMenuItemsEnabled)); } } /// The number of accounts currently being scanned public int NumAccountsScanning { get => _numAccountsScanning; set { this.RaiseAndSetIfChanged(ref _numAccountsScanning, value); this.RaisePropertyChanged(nameof(ActivelyScanning)); this.RaisePropertyChanged(nameof(RemoveMenuItemsEnabled)); this.RaisePropertyChanged(nameof(ScanningText)); } } /// Indicates if Libation is currently scanning account(s) public bool ActivelyScanning => _numAccountsScanning > 0; /// Indicates if the "Remove Books" menu items are enabled public bool RemoveMenuItemsEnabled => !RemoveButtonsVisible && !ActivelyScanning; /// The library scanning status text public string ScanningText => _numAccountsScanning == 1 ? "Scanning..." : $"Scanning {_numAccountsScanning} accounts..."; /// The number of accounts added to Libation public int AccountsCount { get => _accountsCount; set { this.RaiseAndSetIfChanged(ref _accountsCount, value); this.RaisePropertyChanged(nameof(ZeroAccounts)); this.RaisePropertyChanged(nameof(AnyAccounts)); this.RaisePropertyChanged(nameof(OneAccount)); this.RaisePropertyChanged(nameof(MultipleAccounts)); } } /// There are no Audible accounts public bool ZeroAccounts => _accountsCount == 0; /// There is at least one Audible account public bool AnyAccounts => _accountsCount > 0; /// There is exactly one Audible account public bool OneAccount => _accountsCount == 1; /// There are more than 1 Audible accounts public bool MultipleAccounts => _accountsCount > 1; /// The Process Queue panel is open public bool QueueOpen { get => _queueOpen; set { this.RaiseAndSetIfChanged(ref _queueOpen, value); QueueHideButtonText = _queueOpen? "❱❱❱" : "❰❰❰"; this.RaisePropertyChanged(nameof(QueueHideButtonText)); } } /// The Process Queue's Expand/Collapse button display text public string QueueHideButtonText { get; private set; } /// The number of books visible in the Product Display public int VisibleCount { get => _visibleCount; set { this.RaiseAndSetIfChanged(ref _visibleCount, value); this.RaisePropertyChanged(nameof(VisibleCountText)); this.RaisePropertyChanged(nameof(VisibleCountMenuItemText)); } } /// The Bottom-right visible book count status text public string VisibleCountText => $"Visible: {VisibleCount}"; /// The Visible Books menu item header text public string VisibleCountMenuItemText => $"_Visible Books {VisibleCount}"; /// The user's library statistics public LibraryCommands.LibraryStats LibraryStats { get => _libraryStats; set { this.RaiseAndSetIfChanged(ref _libraryStats, value); var backupsCountText = !LibraryStats.HasBookResults ? "No books. Begin by importing your library" : !LibraryStats.HasPendingBooks ? $"All {"book".PluralizeWithCount(LibraryStats.booksFullyBackedUp)} backed up" : $"BACKUPS: No progress: {LibraryStats.booksNoProgress} In process: {LibraryStats.booksDownloadedOnly} Fully backed up: {LibraryStats.booksFullyBackedUp} {(LibraryStats.booksError > 0 ? $" Errors : {LibraryStats.booksError}" : "")}"; var pdfCountText = !LibraryStats.HasPdfResults ? "" : LibraryStats.pdfsNotDownloaded == 0 ? $" | All {LibraryStats.pdfsDownloaded} PDFs downloaded" : $" | PDFs: NOT d/l'ed: {LibraryStats.pdfsNotDownloaded} Downloaded: {LibraryStats.pdfsDownloaded}"; StatusCountText = backupsCountText + pdfCountText; BookBackupsToolStripText = LibraryStats.HasPendingBooks ? $"Begin _Book and PDF Backups: {LibraryStats.PendingBooks} remaining" : "All books have been liberated"; PdfBackupsToolStripText = LibraryStats.pdfsNotDownloaded > 0 ? $"Begin _PDF Only Backups: {LibraryStats.pdfsNotDownloaded} remaining" : "All PDFs have been downloaded"; this.RaisePropertyChanged(nameof(StatusCountText)); this.RaisePropertyChanged(nameof(BookBackupsToolStripText)); this.RaisePropertyChanged(nameof(PdfBackupsToolStripText)); } } /// Bottom-left library statistics display text public string StatusCountText { get; private set; } = "[Calculating backed up book quantities] | [Calculating backed up PDFs]"; /// The "Begin Book and PDF Backup" menu item header text public string BookBackupsToolStripText { get; private set; } = "Begin _Book and PDF Backups: 0"; /// The "Begin PDF Only Backup" menu item header text public string PdfBackupsToolStripText { get; private set; } = "Begin _PDF Only Backups: 0"; /// The number of books visible in the Products Display that have not yet been liberated public int VisibleNotLiberated { get => _visibleNotLiberated; set { this.RaiseAndSetIfChanged(ref _visibleNotLiberated, value); LiberateVisibleToolStripText = AnyVisibleNotLiberated ? $"Liberate _Visible Books: {VisibleNotLiberated}" : "All visible books are liberated"; LiberateVisibleToolStripText_2 = AnyVisibleNotLiberated ? $"_Liberate: {VisibleNotLiberated}" : "All visible books are liberated"; this.RaisePropertyChanged(nameof(AnyVisibleNotLiberated)); this.RaisePropertyChanged(nameof(LiberateVisibleToolStripText)); this.RaisePropertyChanged(nameof(LiberateVisibleToolStripText_2)); } } /// 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; } = "_Liberate: 0"; } }