From 31d87c86ce2a5f2a8f8aa1d404e39a093e975da7 Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Mon, 29 Dec 2025 17:35:51 +0100 Subject: Allow filtering by genre --- src/book_flow.py | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) (limited to 'src/book_flow.py') diff --git a/src/book_flow.py b/src/book_flow.py index ff77616..37f4866 100644 --- a/src/book_flow.py +++ b/src/book_flow.py @@ -9,6 +9,7 @@ import subprocess import src.utils as utils import src.db as db +import src.models as models from src.book_detail import BookDetail from src.book_delete import BookDelete from src.book_form import BookForm @@ -18,7 +19,7 @@ import src.book_files as book_files class BookFlow(Gtk.FlowBox): - def __init__(self, window, resources, library, ereader, conn, progress, update_filter_progress): + def __init__(self, window, resources, library, ereader, conn, books, progress, genre, msg): Gtk.FlowBox.__init__(self) self._window = window @@ -26,29 +27,23 @@ class BookFlow(Gtk.FlowBox): self._library = library self._ereader = ereader self._conn = conn - self._progress = progress - self._update_filter_progress = update_filter_progress + self._msg = msg self._picture_cache = PictureCache() - self._books = db.get_books(self._conn) - self._reset_view() + self.reset(books, progress, genre) - def add_book(self, book_id, data): - self._books[book_id] = data - self.update_progress(data['progress']) - self.select_child(self._flow_box_children[book_id]) + def select_book(self, book_id): + if book_id in self._flow_box_children: + self.select_child(self._flow_box_children[book_id]) - def update_progress(self, progress): - self._progress = progress - self._reset_view() + def reset(self, books, progress, genre, book_id=None): + if book_id: + self._picture_cache.invalidate(f'{self._library}/{book_id}/cover-min.png') - # Private - - def _reset_view(self): self.remove_all() self._flow_box_children = {} - for book_id, data in sorted(self._books.items(), key=book_sort): - if data['progress'] == self._progress: + for book_id, data in sorted(books.items(), key=book_sort): + if self._is_selected(data, progress, genre): picture = self._picture_cache.get(f'{self._library}/{book_id}/cover-min.png') picture.set_can_shrink(False) @@ -66,6 +61,17 @@ class BookFlow(Gtk.FlowBox): self._flow_box_children[book_id] = flow_box_child self.append(flow_box_child) + # Private + + def _is_selected(self, data, progress, genre): + if data['progress'] != progress: + return False + if genre == models.all_genres: + return True + if genre == models.no_genre: + return len(data['genres']) == 0 + return genre in data['genres'] + def _on_left_click(self, gesture, n_press, x, y, book_id, data): if n_press == 2: self._open_detail(book_id, data) @@ -103,23 +109,15 @@ class BookFlow(Gtk.FlowBox): def _update_book(self, book_id, data): book = {'id': book_id, 'data': data } - BookForm(self._window, self._resources, self._library, self._conn, data['progress'], self._on_book_updated, book).present() - - def _on_book_updated(self, book_id, data): - self._picture_cache.invalidate(f'{self._library}/{book_id}/cover-min.png') - self._books[book_id] = data - self.update_progress(data['progress']) # Note: this redraws everything, this is overkill in some cases - self._update_filter_progress(data['progress']) - self.select_child(self._flow_box_children[book_id]) + BookForm(self._window, self._resources, self._library, self._conn, data['progress'], self._msg, book).present() def _confirm_delete_book(self, book_id, data): BookDelete(self._window, self._library, book_id, data, lambda: self._delete_book(book_id, data)).present() def _delete_book(self, book_id, data): - del self._books[book_id] db.delete_book(self._conn, book_id) shutil.rmtree(f'{self._library}/{book_id}', ignore_errors=True) - self._reset_view() + self._msg(['book-deleted', book_id, data]) def _transfer_book(self, book_id, data, paths): BookTransfer(self._window, self._ereader, book_id, data, paths).present() -- cgit v1.2.3