diff --git a/BookReader/Models/Book.cs b/BookReader/Models/Book.cs index 0066e51..06219f8 100644 --- a/BookReader/Models/Book.cs +++ b/BookReader/Models/Book.cs @@ -57,4 +57,4 @@ public class Book [Ignore] public double ProgressBarWidth => ReadingProgress * 120; // relative to cover width -} \ No newline at end of file +} diff --git a/BookReader/ViewModels/ReaderViewModel.cs b/BookReader/ViewModels/ReaderViewModel.cs index 3452114..629590f 100644 --- a/BookReader/ViewModels/ReaderViewModel.cs +++ b/BookReader/ViewModels/ReaderViewModel.cs @@ -46,11 +46,17 @@ public partial class ReaderViewModel : BaseViewModel [ObservableProperty] private int _totalPages = 1; + [ObservableProperty] + private bool _isLocationsLoaded; + // Это свойство будет обновляться автоматически при изменении любого из полей выше public string ChapterProgressText => $"{ChapterCurrentPage} из {ChapterTotalPages}"; // Это свойство будет обновляться автоматически при изменении любого из полей выше - public string ProgressText => $"{CurrentPage} из {TotalPages}"; + // Пока страницы не посчитаны, показываем 0% + public string ProgressText => !_isLocationsLoaded || TotalPages <= 0 + ? "0%" + : $"{CurrentPage} из {TotalPages}"; // Чтобы ChapterProgressText уведомлял интерфейс, добавим частичные методы (особенность Toolkit) partial void OnChapterCurrentPageChanged(int value) => OnPropertyChanged(nameof(ChapterProgressText)); @@ -59,6 +65,7 @@ public partial class ReaderViewModel : BaseViewModel // Чтобы ProgressText уведомлял интерфейс, добавим частичные методы (особенность Toolkit) partial void OnCurrentPageChanged(int value) => OnPropertyChanged(nameof(ProgressText)); partial void OnTotalPagesChanged(int value) => OnPropertyChanged(nameof(ProgressText)); + partial void OnIsLocationsLoadedChanged(bool value) => OnPropertyChanged(nameof(ProgressText)); public List AvailableFonts { get; } = new() { @@ -109,6 +116,25 @@ public partial class ReaderViewModel : BaseViewModel return; } + // Проверяем, есть ли сохранённые локации (кэш) + var hasCachedLocations = !string.IsNullOrEmpty(Book.Locations); + + // Если есть кэш - сразу показываем реальный прогресс + IsLocationsLoaded = hasCachedLocations; + + // Если есть кэш - восстанавливаем прогресс из книги + if (hasCachedLocations) + { + CurrentPage = Book.CurrentPage > 0 ? Book.CurrentPage : 0; + TotalPages = Book.TotalPages > 0 ? Book.TotalPages : 0; + } + else + { + // Сбрасываем прогресс в 0% пока идёт подсчёт страниц + CurrentPage = 0; + TotalPages = 0; + } + var savedFontSize = await _settingsService.GetIntAsync(SettingsKeys.DefaultFontSize, Constants.Reader.DefaultFontSize); var savedFontFamily = await _settingsService.GetAsync(SettingsKeys.DefaultFontFamily, "serif"); @@ -171,6 +197,13 @@ public partial class ReaderViewModel : BaseViewModel } Book.Locations = locations; await _databaseService.UpdateBookAsync(Book); + + // Локации сохранены - теперь показываем реальный прогресс + // (если ещё не был показан из кэша) + if (!IsLocationsLoaded) + { + IsLocationsLoaded = true; + } } public async Task SaveProgressAsync(double progress, string? cfi, string? chapter, int currentPage, int totalPages) diff --git a/BookReader/Views/BookshelfPage.xaml.cs b/BookReader/Views/BookshelfPage.xaml.cs index 1727fe9..8342ebd 100644 --- a/BookReader/Views/BookshelfPage.xaml.cs +++ b/BookReader/Views/BookshelfPage.xaml.cs @@ -26,6 +26,18 @@ public partial class BookshelfPage : ContentPage } } + protected override async void OnNavigatedTo(NavigatedToEventArgs args) + { + base.OnNavigatedTo(args); + + // Если вернулись на главную страницу и книги уже загружены - обновляем прогресс + // (например, после чтения) + if (_viewModel.Books.Count > 0 && !_viewModel.IsBusy) + { + await _viewModel.LoadBooksCommand.ExecuteAsync(null); + } + } + private async void OnMenuClicked(object? sender, EventArgs e) { var action = await _navigationService.DisplayActionSheetAsync("Menu", "Cancel",