booktile.md 2.1 KB

BookTile Module Overview

BookTile is the compact widget that displays a single book inside the shelf grid. Each tile shows the cover art (if available) and a wrapped title label, and emits a signal when the user clicks it.

Responsibilities

  • Render a thumbnail using Gtk::Picture, loading a Gdk::Texture from the Book when needed.
  • Display a short title (falling back to the file name if the book has no title).
  • Provide a click gesture (Gtk::GestureClick) that triggers signalActivated() for the parent view to handle.
  • Respect layout hints (size request, alignment) so BookShelf can pack multiple tiles per row seamlessly.

Structure

BookTile : Gtk::Box (vertical)
 ├── Gtk::Picture m_cover
 └── Gtk::Label   m_title

Gestures and styling are applied to the box itself so the grid behind it can control selection appearance.

Key methods

  • BookTile::setBook(const Book&): updates internal state, refreshes the cover texture and title.
  • BookTile::rebuild(): helper that (re)loads the cover if missing and updates the label text.
  • signalActivated(): forward this signal to react when the tile is clicked.

Styling expectations

BookShelf adds CSS classes (book-tile) and wraps each tile inside a GridView child. To keep a consistent grid:

  • The constructor calls set_size_request(m_coverSize + 16, -1) so each tile has a predictable width for column calculations.
  • Margins and spacing are kept small; the grid’s CSS handles selection borders.

Extension points

  • Add badges/metadata: append extra widgets (e.g., author label, progress bar) to the box.
  • Context menus: attach a Gtk::GestureClick with button 3 or a Gtk::Popover.
  • Custom selection visuals: override the CSS class or expose a property that the grid can toggle.

Expected usage

BookShelf creates BookTile instances inside onFactorySetup(), binds them to BookObject data during onFactoryBind(), and listens to signalActivated() to emit its own signalBookActivated().

If other modules need to render books (e.g., a details sidebar), they can reuse BookTile directly or subclass it with additional controls.