diff --git a/README.md b/README.md index 9c25c8c..5f51311 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,18 @@ buttons) behind previous / jump / next navigation, with an optional cache button `requirements.txt`: ``` -dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.3 +dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.4 ``` Direct: ```bash -pip install "dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.3" +pip install "dpy_paginator @ git+ssh://git@git.rethinkstudios.io/rethink-public/dpy_paginator.git@v0.1.4" ``` Requires `discord.py` (pulled transitively). -Drop the `@v0.1.3` suffix from the line above to install the latest unpinned. +Drop the `@v0.1.4` suffix from the line above to install the latest unpinned. ## Basic usage diff --git a/pyproject.toml b/pyproject.toml index e994982..b7a77a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "dpy_paginator" -version = "0.1.3" +version = "0.1.4" description = "Button-navigated paginator for discord.py — config-free, injectable emojis, installable." requires-python = ">=3.10" dependencies = [ diff --git a/src/dpy_paginator/dpy_paginator.py b/src/dpy_paginator/dpy_paginator.py index 1c70a08..d307c06 100644 --- a/src/dpy_paginator/dpy_paginator.py +++ b/src/dpy_paginator/dpy_paginator.py @@ -176,7 +176,9 @@ class ButtonPaginator(Generic[PageT_co], discord.ui.View): total_pages, left_over = divmod(len(self.pages), self.per_page) self.max_pages: int = total_pages + (1 if left_over else 0) - if cache is not None and len(cache) < self.max_pages: + # a falsy cache (None or []) disables the cache button (see the render path's + # `if self.cache:`); only a non-empty cache must have one entry per page + if cache and len(cache) < self.max_pages: raise ValueError( f"cache has {len(cache)} entries but there are {self.max_pages} pages; " "cache needs one entry per page" @@ -294,9 +296,13 @@ class ButtonPaginator(Generic[PageT_co], discord.ui.View): nav=False rebuilds with only the page's custom buttons and no navigation items (prev/jump/cache/next) — a single-page result that still carries custom buttons keeps them (and their live callbacks) without a nav row. + the nav row is also suppressed for a single page (max_pages < 2) even when + nav is left at its default, so a re-render (update_page) never resurrects it. """ self.clear_items() + nav = nav and self.max_pages >= 2 + if nav: self.previous_page.emoji = self.emojis["previous"] self.previous_page.disabled = self.current_page <= 0 @@ -382,17 +388,15 @@ class ButtonPaginator(Generic[PageT_co], discord.ui.View): ) -> Optional[Union[discord.Message, discord.WebhookMessage]]: """send the first page; obj is an Interaction or a Messageable""" kwargs = await self.get_page_kwargs(self.get_page(self.current_page)) + # update_buttons already suppresses the nav row for a single page (max_pages < 2), + # keeping only the page's custom buttons — so a single page with custom buttons + # renders them (live callbacks) with no nav row self.update_buttons() - if self.max_pages < 2: - if self.current_page_buttons: - # single page WITH custom buttons: keep the view live so the - # buttons' callbacks still fire; strip only the navigation row - self.update_buttons(nav=False) - else: - # single page, no custom buttons: no interactive row at all - self.stop() - kwargs.pop("view", None) + if self.max_pages < 2 and not self.current_page_buttons: + # single page, no custom buttons: no interactive row at all, drop the view + self.stop() + kwargs.pop("view", None) self.reset_files(kwargs)