/// <summary> /// NavigateTo means navigate to a spot in the book. Will also do a navigation with User... /// </summary> /// <param name="sourceId"></param> /// <param name="location"></param> public void NavigateTo(NavigateControlId sourceId, BookLocation location) { var bookdb = BookDataContext.Get(); if (Logger.LogExtraTiming) { Logger.Log($"MainEpubReader: Navigation: to {location}"); } // Save the fact that we navigated to here. Only the main reader saves this information var navigationData = CommonQueries.BookNavigationDataFind(bookdb, BookData.BookId); if (navigationData == null) { navigationData = new BookNavigationData() { BookId = BookData.BookId, CurrStatus = BookNavigationData.UserStatus.Reading }; CommonQueries.BookNavigationDataAdd(bookdb, navigationData, CommonQueries.ExistHandling.IfNotExists); } navigationData.CurrSpot = location.Location; navigationData.CurrStatus = BookNavigationData.UserStatus.Reading; // If I'm navigating then I'm reading? // And now actually navigate. There are two types of navigation: navigation // via tags and navigation by percent. // Both need to be handled. var percent = location.HtmlPercent; if (percent >= 0.0) { if (Logger.LogExtraTiming) { Logger.Log($"MainEpubReader: Navigation: to percent"); } NavigateToPercent(location); } else { if (Logger.LogExtraTiming) { Logger.Log($"MainEpubReader: Navigation: via location, not percent ({location})"); } NavigateToLocation(location); } }
private BookNavigationData EnsureBookNavigationData(BookDataContext bookdb) { var nd = CommonQueries.BookNavigationDataFind(bookdb, BookData.BookId); if (nd == null) { nd = new BookNavigationData() { BookId = BookData.BookId, CurrSpot = GetCurrBookLocation().ToJson() }; CommonQueries.BookNavigationDataAdd(bookdb, nd, CommonQueries.ExistHandling.IfNotExists); nd = CommonQueries.BookNavigationDataFind(bookdb, BookData.BookId); } if (nd == null) { App.Error($"ERROR: trying to ensure navigation data, but don't have one."); } return(nd); }
/// <summary> /// Called externally in order to display a book; will use the BookNavigationData to move /// to the previous spot. /// </summary> /// <param name="bookId"></param> /// <returns></returns> public async Task DisplayBook(BookData bookData, BookLocation location = null) { // Reset all of the position values. CurrHtml = ""; CurrHtmlIndex = -1; CurrHtmlFileName = null; CurrScrollPosition = double.NaN; CurrSelectPosition = double.NaN; BookData = bookData; var bookdb = BookDataContext.Get(); var dd = bookData.DownloadData ?? CommonQueries.DownloadedBookFind(bookdb, BookData.BookId); var nav = bookData.NavigationData ?? CommonQueries.BookNavigationDataFind(bookdb, BookData.BookId); if (location == null && !string.IsNullOrEmpty(nav?.CurrSpot)) { location = BookLocation.FromJson(nav.CurrSpot); } SetReviewSymbol(); if (dd == null) { return; } var fullpath = dd.FullFilePath; if (fullpath.Contains(@"\source\repos\SimpleEpubReader\SimpleEpubReader\bin\x64\Debug\AppX\Assets\PreinstalledBooks")) { // Whoops. The initial database might incorrectly have a developer path hard-coded. // Replace with correct location. var installationFolder = FolderMethods.InstallationFolder; fullpath = $"{installationFolder}\\Assets\\PreinstalledBooks\\{dd.FileName}"; } else if (fullpath.StartsWith("PreinstalledBooks:")) { // Preinstalled books are in a sort of relative path. It's designed to be an invalid // (or at least incredibly rare) directory. var installationFolder = FolderMethods.InstallationFolder; fullpath = $"{installationFolder}\\Assets\\PreinstalledBooks\\{dd.FileName}"; } var openResult = await OpenFile(fullpath, location); switch (openResult) { case OpenResult.OK: // Set up the uiAllUpPosition var sectionSizes = new List <double>(); foreach (var file in EpubBook.ResourcesHtmlOrdered) { sectionSizes.Add(file.Content.Length); } uiAllUpPosition.SetSectionSizes(sectionSizes); // No need to set to zero; it's already set in the OpenFile!. uiAllUpPosition.UpdatePosition(0, 0); // set to zero! ApplicationView appView = ApplicationView.GetForCurrentView(); appView.Title = bookData.Title.Replace("\n", " -- "); // title is multi-line break; case OpenResult.RedownloadableError: // An error. Mark the book as not downloaded + redownload dd.CurrFileStatus = DownloadData.FileStatus.Unknown; // deleted? gone? corrupt? we really don't know. CommonQueries.BookSaveChanges(bookdb); await BookSearch.DoSwipeDownloadOrReadAsync(BookData); break; default: // An error. Mark the book as not downloaded dd.CurrFileStatus = DownloadData.FileStatus.Unknown; // deleted? gone? corrupt? we really don't know. CommonQueries.BookSaveChanges(bookdb); break; } }