Skip to content

Commit 028dd27

Browse files
authored
[ext.pages] Fixes and enhancements for PageGroup handling (#1350)
* fix missing `PageGroup` parameters in `PaginatorMenu` callback to `Paginator.update` Add `default` parameter to `PageGroup` which controls the initial `PageGroup`'s list of pages to display. * add missing `show_menu` parameter to `Paginator.update` add logic to allow replacing PageGroups in `Paginator.update` add `Paginator.get_page_group_content` method to convert `PageGroup` pages to `Page` objects when initialized / updated. * add logic to check if `pages` parameter is specified in `Paginator.update` before trying to check if they're all `PageGroup` objects
1 parent 711576a commit 028dd27

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

discord/ext/pages/pagination.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ class PageGroup:
234234
The description shown on the corresponding PaginatorMenu dropdown option.
235235
emoji: Union[:class:`str`, :class:`discord.Emoji`, :class:`discord.PartialEmoji`]
236236
The emoji shown on the corresponding PaginatorMenu dropdown option.
237+
default: Optional[:class:`bool`]
238+
Whether the page group should be the default page group initially shown when the paginator response is sent.
239+
Only one ``PageGroup`` can be the default page group.
237240
show_disabled: :class:`bool`
238241
Whether to show disabled buttons.
239242
show_indicator: :class:`bool`
@@ -266,6 +269,7 @@ def __init__(
266269
label: str,
267270
description: Optional[str] = None,
268271
emoji: Union[str, discord.Emoji, discord.PartialEmoji] = None,
272+
default: Optional[bool] = None,
269273
show_disabled: Optional[bool] = None,
270274
show_indicator: Optional[bool] = None,
271275
author_check: Optional[bool] = None,
@@ -282,6 +286,7 @@ def __init__(
282286
self.description: Optional[str] = description
283287
self.emoji: Union[str, discord.Emoji, discord.PartialEmoji] = emoji
284288
self.pages: Union[List[str], List[Union[List[discord.Embed], discord.Embed]]] = pages
289+
self.default: Optional[bool] = default
285290
self.show_disabled = show_disabled
286291
self.show_indicator = show_indicator
287292
self.author_check = author_check
@@ -340,6 +345,8 @@ class Paginator(discord.ui.View):
340345
The page group select menu associated with this paginator.
341346
page_groups: Optional[List[:class:`PageGroup`]]
342347
List of :class:`PageGroup` objects the user can switch between.
348+
default_page_group: Optional[:class:`int`]
349+
The index of the default page group shown when the paginator is initially sent. Defined by setting ``default`` to ``True`` on a :class:`PageGroup`.
343350
current_page: :class:`int`
344351
A zero-indexed value showing the current page number.
345352
page_count: :class:`int`
@@ -379,12 +386,17 @@ def __init__(
379386
self.show_menu = show_menu
380387
self.menu_placeholder = menu_placeholder
381388
self.page_groups: Optional[List[PageGroup]] = None
389+
self.default_page_group: int = 0
382390

383391
if all(isinstance(pg, PageGroup) for pg in pages):
384392
self.page_groups = self.pages if show_menu else None
385-
self.pages: Union[
386-
List[str], List[Page], List[Union[List[discord.Embed], discord.Embed]]
387-
] = self.page_groups[0].pages
393+
if sum(pg.default is True for pg in self.page_groups) > 1:
394+
raise ValueError("Only one PageGroup can be set as the default.")
395+
for pg in self.page_groups:
396+
if pg.default:
397+
self.default_page_group = self.page_groups.index(pg)
398+
break
399+
self.pages: List[Page] = self.get_page_group_content(self.page_groups[self.default_page_group])
388400

389401
self.page_count = max(len(self.pages) - 1, 0)
390402
self.buttons = {}
@@ -413,9 +425,12 @@ def __init__(
413425

414426
async def update(
415427
self,
416-
pages: Optional[Union[List[str], List[Page], List[Union[List[discord.Embed], discord.Embed]]]] = None,
428+
pages: Optional[
429+
Union[List[PageGroup], List[Page], List[str], List[Union[List[discord.Embed], discord.Embed]]]
430+
] = None,
417431
show_disabled: Optional[bool] = None,
418432
show_indicator: Optional[bool] = None,
433+
show_menu: Optional[bool] = None,
419434
author_check: Optional[bool] = None,
420435
menu_placeholder: Optional[str] = None,
421436
disable_on_timeout: Optional[bool] = None,
@@ -438,6 +453,8 @@ async def update(
438453
Whether to show disabled buttons.
439454
show_indicator: :class:`bool`
440455
Whether to show the page indicator when using the default buttons.
456+
show_menu: :class:`bool`
457+
Whether to show a select menu that allows the user to switch between groups of pages.
441458
author_check: :class:`bool`
442459
Whether only the original user of the command can change pages.
443460
menu_placeholder: :class:`str`
@@ -470,6 +487,16 @@ async def update(
470487
self.pages: Union[List[PageGroup], List[str], List[Page], List[Union[List[discord.Embed], discord.Embed]]] = (
471488
pages if pages is not None else self.pages
472489
)
490+
self.show_menu = show_menu if show_menu is not None else self.show_menu
491+
if pages is not None and all(isinstance(pg, PageGroup) for pg in pages):
492+
self.page_groups = self.pages if self.show_menu else None
493+
if sum(pg.default is True for pg in self.page_groups) > 1:
494+
raise ValueError("Only one PageGroup can be set as the default.")
495+
for pg in self.page_groups:
496+
if pg.default:
497+
self.default_page_group = self.page_groups.index(pg)
498+
break
499+
self.pages: List[Page] = self.get_page_group_content(self.page_groups[self.default_page_group])
473500
self.page_count = max(len(self.pages) - 1, 0)
474501
self.current_page = 0
475502
# Apply config changes, if specified
@@ -769,6 +796,10 @@ def update_custom_view(self, custom_view: discord.ui.View):
769796
for item in custom_view.children:
770797
self.add_item(item)
771798

799+
def get_page_group_content(self, page_group: PageGroup) -> List[Page]:
800+
"""Returns a converted list of `Page` objects for the given page group based on the content of its pages."""
801+
return [self.get_page_content(page) for page in page_group.pages]
802+
772803
@staticmethod
773804
def get_page_content(page: Union[Page, str, discord.Embed, List[discord.Embed]]) -> Page:
774805
"""Converts a page into a :class:`Page` object based on its content."""
@@ -1123,8 +1154,11 @@ async def callback(self, interaction: discord.Interaction):
11231154
author_check=page_group.author_check,
11241155
disable_on_timeout=page_group.disable_on_timeout,
11251156
use_default_buttons=page_group.use_default_buttons,
1157+
default_button_row=page_group.default_button_row,
11261158
loop_pages=page_group.loop_pages,
11271159
custom_view=page_group.custom_view,
1160+
timeout=page_group.timeout,
11281161
custom_buttons=page_group.custom_buttons,
1162+
trigger_on_display=page_group.trigger_on_display,
11291163
interaction=interaction,
11301164
)

0 commit comments

Comments
 (0)