paginate long tocs
This commit is contained in:
@@ -37,6 +37,11 @@ class NavigationOverlay(OverlaySubApplication):
|
||||
self._cached_chapters: List[Tuple[str, int]] = []
|
||||
self._cached_bookmarks: List[Dict[str, Any]] = []
|
||||
|
||||
# Pagination state
|
||||
self._toc_page: int = 0 # Current page in TOC
|
||||
self._toc_items_per_page: int = 10 # Items per page
|
||||
self._bookmarks_page: int = 0 # Current page in bookmarks
|
||||
|
||||
def get_overlay_type(self) -> OverlayState:
|
||||
"""Return NAVIGATION overlay type."""
|
||||
return OverlayState.NAVIGATION
|
||||
@@ -63,6 +68,10 @@ class NavigationOverlay(OverlaySubApplication):
|
||||
self._cached_bookmarks = bookmarks
|
||||
self._active_tab = active_tab
|
||||
|
||||
# Reset pagination when opening
|
||||
self._toc_page = 0
|
||||
self._bookmarks_page = 0
|
||||
|
||||
# Calculate panel size (60% width, 70% height)
|
||||
panel_size = self._calculate_panel_size(0.6, 0.7)
|
||||
|
||||
@@ -77,7 +86,10 @@ class NavigationOverlay(OverlaySubApplication):
|
||||
chapters=chapter_data,
|
||||
bookmarks=bookmarks,
|
||||
active_tab=active_tab,
|
||||
page_size=panel_size
|
||||
page_size=panel_size,
|
||||
toc_page=self._toc_page,
|
||||
toc_items_per_page=self._toc_items_per_page,
|
||||
bookmarks_page=self._bookmarks_page
|
||||
)
|
||||
|
||||
# Render HTML to image
|
||||
@@ -180,6 +192,16 @@ class NavigationOverlay(OverlaySubApplication):
|
||||
logger.info(f"[NAV_OVERLAY] Close button clicked")
|
||||
return GestureResponse(ActionType.OVERLAY_CLOSED, {})
|
||||
|
||||
# Parse "page:direction" format for pagination
|
||||
elif link_target.startswith("page:"):
|
||||
direction = link_target.split(":", 1)[1]
|
||||
logger.info(f"[NAV_OVERLAY] Pagination button clicked: {direction}")
|
||||
self._handle_pagination(direction)
|
||||
return GestureResponse(ActionType.PAGE_CHANGED, {
|
||||
"direction": direction,
|
||||
"tab": self._active_tab
|
||||
})
|
||||
|
||||
# Tap inside overlay but not on interactive element - keep overlay open
|
||||
logger.info(f"[NAV_OVERLAY] Tap on non-interactive area inside overlay, ignoring")
|
||||
return GestureResponse(ActionType.NONE, {})
|
||||
@@ -225,7 +247,10 @@ class NavigationOverlay(OverlaySubApplication):
|
||||
chapters=chapter_data,
|
||||
bookmarks=self._cached_bookmarks,
|
||||
active_tab=new_tab,
|
||||
page_size=panel_size
|
||||
page_size=panel_size,
|
||||
toc_page=self._toc_page,
|
||||
toc_items_per_page=self._toc_items_per_page,
|
||||
bookmarks_page=self._bookmarks_page
|
||||
)
|
||||
|
||||
# Render HTML to image
|
||||
@@ -236,3 +261,51 @@ class NavigationOverlay(OverlaySubApplication):
|
||||
|
||||
# Composite and return
|
||||
return self.composite_overlay(self._cached_base_page, overlay_panel)
|
||||
|
||||
def _handle_pagination(self, direction: str) -> Optional[Image.Image]:
|
||||
"""
|
||||
Handle pagination within the active tab.
|
||||
|
||||
Args:
|
||||
direction: Either "next" or "prev"
|
||||
|
||||
Returns:
|
||||
Updated composited image with new page, or None if invalid
|
||||
"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
if self._active_tab == "contents":
|
||||
# Calculate total pages
|
||||
total_items = len(self._cached_chapters)
|
||||
total_pages = (total_items + self._toc_items_per_page - 1) // self._toc_items_per_page
|
||||
|
||||
# Update page number
|
||||
if direction == "next" and self._toc_page < total_pages - 1:
|
||||
self._toc_page += 1
|
||||
logger.info(f"[NAV_OVERLAY] TOC page -> {self._toc_page + 1}/{total_pages}")
|
||||
elif direction == "prev" and self._toc_page > 0:
|
||||
self._toc_page -= 1
|
||||
logger.info(f"[NAV_OVERLAY] TOC page -> {self._toc_page + 1}/{total_pages}")
|
||||
else:
|
||||
logger.info(f"[NAV_OVERLAY] Can't paginate {direction} from page {self._toc_page + 1}/{total_pages}")
|
||||
return None
|
||||
|
||||
elif self._active_tab == "bookmarks":
|
||||
# Calculate total pages
|
||||
total_items = len(self._cached_bookmarks)
|
||||
total_pages = (total_items + self._toc_items_per_page - 1) // self._toc_items_per_page
|
||||
|
||||
# Update page number
|
||||
if direction == "next" and self._bookmarks_page < total_pages - 1:
|
||||
self._bookmarks_page += 1
|
||||
logger.info(f"[NAV_OVERLAY] Bookmarks page -> {self._bookmarks_page + 1}/{total_pages}")
|
||||
elif direction == "prev" and self._bookmarks_page > 0:
|
||||
self._bookmarks_page -= 1
|
||||
logger.info(f"[NAV_OVERLAY] Bookmarks page -> {self._bookmarks_page + 1}/{total_pages}")
|
||||
else:
|
||||
logger.info(f"[NAV_OVERLAY] Can't paginate {direction} from page {self._bookmarks_page + 1}/{total_pages}")
|
||||
return None
|
||||
|
||||
# Regenerate the overlay with new page
|
||||
return self._switch_tab(self._active_tab)
|
||||
|
||||
Reference in New Issue
Block a user