From f0a3c19a3c7c19e18fed64a20783161fa6d75517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=BD=D0=B0=D1=82=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Wed, 18 Feb 2026 14:49:20 +0300 Subject: [PATCH] qwen edit --- BookReader/ViewModels/BookshelfViewModel.cs | 39 ++++++++++++++++++ .../ViewModels/CalibreLibraryViewModel.cs | 26 +++++++++++- BookReader/Views/BookshelfPage.xaml | 41 ++++++++++++------- BookReader/Views/CalibreLibraryPage.xaml | 41 ++++++++++++++++--- 4 files changed, 126 insertions(+), 21 deletions(-) diff --git a/BookReader/ViewModels/BookshelfViewModel.cs b/BookReader/ViewModels/BookshelfViewModel.cs index 11f25fa..b190fee 100644 --- a/BookReader/ViewModels/BookshelfViewModel.cs +++ b/BookReader/ViewModels/BookshelfViewModel.cs @@ -19,6 +19,12 @@ public partial class BookshelfViewModel : BaseViewModel [ObservableProperty] private bool _isEmpty; + [ObservableProperty] + private bool _isRefreshing; + + [ObservableProperty] + private string _searchText = string.Empty; + public BookshelfViewModel( IDatabaseService databaseService, IBookParserService bookParserService, @@ -43,6 +49,17 @@ public partial class BookshelfViewModel : BaseViewModel try { var books = await _databaseService.GetAllBooksAsync(); + + // Применяем фильтр поиска если есть + if (!string.IsNullOrWhiteSpace(SearchText)) + { + var searchLower = SearchText.ToLowerInvariant(); + books = books.Where(b => + b.Title.ToLowerInvariant().Contains(searchLower) || + b.Author.ToLowerInvariant().Contains(searchLower) + ).ToList(); + } + Books.Clear(); foreach (var book in books) { @@ -60,6 +77,28 @@ public partial class BookshelfViewModel : BaseViewModel } } + [RelayCommand] + public async Task RefreshBooksAsync() + { + if (IsRefreshing) return; + IsRefreshing = true; + + try + { + await LoadBooksAsync(); + } + finally + { + IsRefreshing = false; + } + } + + [RelayCommand] + public async Task SearchAsync() + { + await LoadBooksAsync(); + } + [RelayCommand] public async Task AddBookFromFileAsync() { diff --git a/BookReader/ViewModels/CalibreLibraryViewModel.cs b/BookReader/ViewModels/CalibreLibraryViewModel.cs index 2e40bcf..7b1a736 100644 --- a/BookReader/ViewModels/CalibreLibraryViewModel.cs +++ b/BookReader/ViewModels/CalibreLibraryViewModel.cs @@ -26,6 +26,12 @@ public partial class CalibreLibraryViewModel : BaseViewModel [ObservableProperty] private string _downloadStatus = string.Empty; + [ObservableProperty] + private bool _isRefreshing; + + [ObservableProperty] + private string _connectionErrorMessage = string.Empty; + private int _currentPage; public CalibreLibraryViewModel( @@ -67,6 +73,7 @@ public partial class CalibreLibraryViewModel : BaseViewModel if (IsBusy || !IsConfigured) return; IsBusy = true; _currentPage = 0; + ConnectionErrorMessage = string.Empty; try { @@ -79,7 +86,8 @@ public partial class CalibreLibraryViewModel : BaseViewModel } catch (Exception ex) { - await _navigationService.DisplayAlertAsync("Error", $"Failed to load library: {ex.Message}", "OK"); + ConnectionErrorMessage = "No connection to Calibre server"; + System.Diagnostics.Debug.WriteLine($"Error loading Calibre library: {ex.Message}"); } finally { @@ -87,6 +95,22 @@ public partial class CalibreLibraryViewModel : BaseViewModel } } + [RelayCommand] + public async Task RefreshBooksAsync() + { + if (IsRefreshing || !IsConfigured) return; + IsRefreshing = true; + + try + { + await LoadBooksAsync(); + } + finally + { + IsRefreshing = false; + } + } + [RelayCommand] public async Task LoadMoreBooksAsync() { diff --git a/BookReader/Views/BookshelfPage.xaml b/BookReader/Views/BookshelfPage.xaml index 1f95a66..d77893d 100644 --- a/BookReader/Views/BookshelfPage.xaml +++ b/BookReader/Views/BookshelfPage.xaml @@ -30,10 +30,20 @@ - + + + + - + - - + + + - - - + + + @@ -144,6 +156,7 @@ + - diff --git a/BookReader/Views/CalibreLibraryPage.xaml b/BookReader/Views/CalibreLibraryPage.xaml index 0a1fd28..cf5bd91 100644 --- a/BookReader/Views/CalibreLibraryPage.xaml +++ b/BookReader/Views/CalibreLibraryPage.xaml @@ -38,6 +38,32 @@ HorizontalOptions="Center" /> + + +