From 87c42f806e6009b6b20361b1ec94c17b0c959101 Mon Sep 17 00:00:00 2001 From: pax Date: Sun, 5 Apr 2026 16:58:22 -0500 Subject: [PATCH] Fix library/bookmark info panel, save indicator, DB migration - Migrate library_meta to add tag_categories column - Info panel always updates (not gated on isVisible) - Library info shows status bar with score/rating - Save indicator: changed elif to if so Saved always triggers - Bookmark info panel always populated --- booru_viewer/core/db.py | 8 +++++ booru_viewer/gui/app.py | 71 +++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/booru_viewer/core/db.py b/booru_viewer/core/db.py index 42b7254..0708137 100644 --- a/booru_viewer/core/db.py +++ b/booru_viewer/core/db.py @@ -164,6 +164,14 @@ class Database: self._conn.execute("ALTER TABLE favorites ADD COLUMN folder TEXT") self._conn.commit() self._conn.execute("CREATE INDEX IF NOT EXISTS idx_favorites_folder ON favorites(folder)") + # Add tag_categories to library_meta if missing + tables = {r[0] for r in self._conn.execute("SELECT name FROM sqlite_master WHERE type='table'").fetchall()} + if "library_meta" in tables: + cur = self._conn.execute("PRAGMA table_info(library_meta)") + cols = {row[1] for row in cur.fetchall()} + if "tag_categories" not in cols: + self._conn.execute("ALTER TABLE library_meta ADD COLUMN tag_categories TEXT DEFAULT ''") + self._conn.commit() def close(self) -> None: if self._conn: diff --git a/booru_viewer/gui/app.py b/booru_viewer/gui/app.py index bd0882b..5357faa 100644 --- a/booru_viewer/gui/app.py +++ b/booru_viewer/gui/app.py @@ -1114,54 +1114,47 @@ class BooruApp(QMainWindow): if evicted: log.info(f"Auto-evicted {evicted} cached files") + def _set_library_info(self, path: str) -> None: + """Update info panel with library metadata for the given file.""" + stem = Path(path).stem + if not stem.isdigit(): + return + meta = self._db.get_library_meta(int(stem)) + if meta: + from ..core.api.base import Post + p = Post( + id=int(stem), file_url=meta.get("file_url", ""), + preview_url=None, tags=meta.get("tags", ""), + score=meta.get("score", 0), rating=meta.get("rating"), + source=meta.get("source"), tag_categories=meta.get("tag_categories", {}), + ) + self._info_panel.set_post(p) + info = f"#{p.id} score:{p.score} [{p.rating}] {Path(path).suffix.lstrip('.').upper()}" + self._status.showMessage(info) + def _on_library_selected(self, path: str) -> None: self._set_preview_media(path, Path(path).name) self._update_fullscreen(path, Path(path).name) - # Show metadata in info panel - stem = Path(path).stem - if stem.isdigit() and self._info_panel.isVisible(): - meta = self._db.get_library_meta(int(stem)) - if meta: - from ..core.api.base import Post - p = Post( - id=int(stem), file_url=meta.get("file_url", ""), - preview_url=None, tags=meta.get("tags", ""), - score=meta.get("score", 0), rating=meta.get("rating"), - source=meta.get("source"), tag_categories=meta.get("tag_categories", {}), - ) - self._info_panel.set_post(p) + self._set_library_info(path) def _on_library_activated(self, path: str) -> None: self._set_preview_media(path, Path(path).name) self._update_fullscreen(path, Path(path).name) - stem = Path(path).stem - if stem.isdigit() and self._info_panel.isVisible(): - meta = self._db.get_library_meta(int(stem)) - if meta: - from ..core.api.base import Post - p = Post( - id=int(stem), file_url=meta.get("file_url", ""), - preview_url=None, tags=meta.get("tags", ""), - score=meta.get("score", 0), rating=meta.get("rating"), - source=meta.get("source"), tag_categories=meta.get("tag_categories", {}), - ) - self._info_panel.set_post(p) + self._set_library_info(path) def _on_bookmark_selected(self, fav) -> None: self._status.showMessage(f"Bookmark #{fav.post_id}") # Show bookmark tags in info panel - if self._info_panel.isVisible(): - from ..core.api.base import Post - # Try library metadata for categories - meta = self._db.get_library_meta(fav.post_id) - cats = meta.get("tag_categories", {}) if meta else {} - p = Post( - id=fav.post_id, file_url=fav.file_url or "", - preview_url=fav.preview_url, tags=fav.tags or "", - score=fav.score or 0, rating=fav.rating, - source=fav.source, tag_categories=cats, - ) - self._info_panel.set_post(p) + from ..core.api.base import Post + meta = self._db.get_library_meta(fav.post_id) + cats = meta.get("tag_categories", {}) if meta else {} + p = Post( + id=fav.post_id, file_url=fav.file_url or "", + preview_url=fav.preview_url, tags=fav.tags or "", + score=fav.score or 0, rating=fav.rating, + source=fav.source, tag_categories=cats, + ) + self._info_panel.set_post(p) self._on_bookmark_activated(fav) def _on_bookmark_activated(self, fav) -> None: @@ -2069,12 +2062,12 @@ class BooruApp(QMainWindow): self._run_async(_fav) def _on_bookmark_done(self, index: int, msg: str) -> None: - self._status.showMessage(msg) + self._status.showMessage(f"{len(self._posts)} results — {msg}") thumbs = self._grid._thumbs if 0 <= index < len(thumbs): if "Saved" in msg: thumbs[index].set_saved_locally(True) - elif "Bookmarked" in msg: + if "Bookmarked" in msg: thumbs[index].set_bookmarked(True) self._update_fullscreen_state()