using ApplicationServices; using DataLayer; using FileLiberator; using LibationFileManager; using System; using System.Linq; using System.Threading.Tasks; namespace LibationUiBase.GridView; public class GridContextMenu { public string CopyCellText => $"{Accelerator}Copy Cell Contents"; public string LiberateEpisodesText => $"{Accelerator}Liberate All Episodes"; public string SetDownloadedText => $"Set Download status to '{Accelerator}Downloaded'"; public string SetNotDownloadedText => $"Set Download status to '{Accelerator}Not Downloaded'"; public string RemoveText => $"{Accelerator}Remove from library"; public string LocateFileText => $"{Accelerator}Locate file..."; public string LocateFileDialogTitle => $"Locate the audio file for '{GridEntries[0].Book.TitleWithSubtitle}'"; public string LocateFileErrorMessage => "Error saving book's location"; public string ConvertToMp3Text => $"{Accelerator}Convert to Mp3"; public string ReDownloadText => "Re-download this audiobook"; public string DownloadSelectedText => "Download selected audiobooks"; public string EditTemplatesText => "Edit Templates"; public string FolderTemplateText => "Folder Template"; public string FileTemplateText => "File Template"; public string MultipartTemplateText => "Multipart File Template"; public string ViewBookmarksText => "View _Bookmarks/Clips"; public string ViewSeriesText => GridEntries[0].Liberate.IsSeries ? "View All Episodes in Series" : "View All Books in Series"; public bool LiberateEpisodesEnabled => GridEntries.OfType().Any(sEntry => sEntry.Children.Any(c => c.Liberate.BookStatus is LiberatedStatus.NotLiberated or LiberatedStatus.PartialDownload)); public bool SetDownloadedEnabled => LibraryBookEntries.Any(ge => ge.Book.UserDefinedItem.BookStatus != LiberatedStatus.Liberated || ge.Liberate.IsSeries); public bool SetNotDownloadedEnabled => LibraryBookEntries.Any(ge => ge.Book.UserDefinedItem.BookStatus != LiberatedStatus.NotLiberated || ge.Liberate.IsSeries); public bool ConvertToMp3Enabled => LibraryBookEntries.Any(ge => ge.Book.UserDefinedItem.BookStatus is LiberatedStatus.Liberated); public bool ReDownloadEnabled => LibraryBookEntries.Any(ge => ge.Book.UserDefinedItem.BookStatus is LiberatedStatus.Liberated); private IGridEntry[] GridEntries { get; } public ILibraryBookEntry[] LibraryBookEntries { get; } public char Accelerator { get; } public GridContextMenu(IGridEntry[] gridEntries, char accelerator) { ArgumentNullException.ThrowIfNull(gridEntries, nameof(gridEntries)); ArgumentOutOfRangeException.ThrowIfZero(gridEntries.Length, $"{nameof(gridEntries)}.{nameof(gridEntries.Length)}"); GridEntries = gridEntries; Accelerator = accelerator; LibraryBookEntries = GridEntries .OfType() .SelectMany(s => s.Children) .Concat(GridEntries.OfType()) .ToArray(); } public void SetDownloaded() { LibraryBookEntries.Select(e => e.LibraryBook) .UpdateUserDefinedItem(udi => { udi.BookStatus = LiberatedStatus.Liberated; if (udi.Book.HasPdf()) udi.SetPdfStatus(LiberatedStatus.Liberated); }); } public void SetNotDownloaded() { LibraryBookEntries.Select(e => e.LibraryBook) .UpdateUserDefinedItem(udi => { udi.BookStatus = LiberatedStatus.NotLiberated; if (udi.Book.HasPdf()) udi.SetPdfStatus(LiberatedStatus.NotLiberated); }); } public async Task RemoveAsync() { await LibraryBookEntries.Select(e => e.LibraryBook).RemoveBooksAsync(); } public ITemplateEditor CreateTemplateEditor(LibraryBook libraryBook, string existingTemplate) where T : Templates, ITemplate, new() { LibraryBookDto fileDto = libraryBook.ToDto(), folderDto = fileDto; if (libraryBook.Book.IsEpisodeChild() && Configuration.Instance.SavePodcastsToParentFolder && libraryBook.Book.SeriesLink.SingleOrDefault() is SeriesBook series) { using var context = DbContexts.GetContext(); var seriesParent = context.GetLibraryBook_Flat_NoTracking(series.Series.AudibleSeriesId); folderDto = seriesParent?.ToDto() ?? fileDto; } return TemplateEditor.CreateFilenameEditor(Configuration.Instance.Books, existingTemplate, folderDto, fileDto); } }