Skip to content

Commit

Permalink
[ext.pages] Fixes and enhancements for PageGroup handling (Pycord-D…
Browse files Browse the repository at this point in the history
…evelopment#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
  • Loading branch information
krittick authored May 13, 2022
1 parent 711576a commit 028dd27
Showing 1 changed file with 38 additions and 4 deletions.
42 changes: 38 additions & 4 deletions discord/ext/pages/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,9 @@ class PageGroup:
The description shown on the corresponding PaginatorMenu dropdown option.
emoji: Union[:class:`str`, :class:`discord.Emoji`, :class:`discord.PartialEmoji`]
The emoji shown on the corresponding PaginatorMenu dropdown option.
default: Optional[:class:`bool`]
Whether the page group should be the default page group initially shown when the paginator response is sent.
Only one ``PageGroup`` can be the default page group.
show_disabled: :class:`bool`
Whether to show disabled buttons.
show_indicator: :class:`bool`
Expand Down Expand Up @@ -266,6 +269,7 @@ def __init__(
label: str,
description: Optional[str] = None,
emoji: Union[str, discord.Emoji, discord.PartialEmoji] = None,
default: Optional[bool] = None,
show_disabled: Optional[bool] = None,
show_indicator: Optional[bool] = None,
author_check: Optional[bool] = None,
Expand All @@ -282,6 +286,7 @@ def __init__(
self.description: Optional[str] = description
self.emoji: Union[str, discord.Emoji, discord.PartialEmoji] = emoji
self.pages: Union[List[str], List[Union[List[discord.Embed], discord.Embed]]] = pages
self.default: Optional[bool] = default
self.show_disabled = show_disabled
self.show_indicator = show_indicator
self.author_check = author_check
Expand Down Expand Up @@ -340,6 +345,8 @@ class Paginator(discord.ui.View):
The page group select menu associated with this paginator.
page_groups: Optional[List[:class:`PageGroup`]]
List of :class:`PageGroup` objects the user can switch between.
default_page_group: Optional[:class:`int`]
The index of the default page group shown when the paginator is initially sent. Defined by setting ``default`` to ``True`` on a :class:`PageGroup`.
current_page: :class:`int`
A zero-indexed value showing the current page number.
page_count: :class:`int`
Expand Down Expand Up @@ -379,12 +386,17 @@ def __init__(
self.show_menu = show_menu
self.menu_placeholder = menu_placeholder
self.page_groups: Optional[List[PageGroup]] = None
self.default_page_group: int = 0

if all(isinstance(pg, PageGroup) for pg in pages):
self.page_groups = self.pages if show_menu else None
self.pages: Union[
List[str], List[Page], List[Union[List[discord.Embed], discord.Embed]]
] = self.page_groups[0].pages
if sum(pg.default is True for pg in self.page_groups) > 1:
raise ValueError("Only one PageGroup can be set as the default.")
for pg in self.page_groups:
if pg.default:
self.default_page_group = self.page_groups.index(pg)
break
self.pages: List[Page] = self.get_page_group_content(self.page_groups[self.default_page_group])

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

async def update(
self,
pages: Optional[Union[List[str], List[Page], List[Union[List[discord.Embed], discord.Embed]]]] = None,
pages: Optional[
Union[List[PageGroup], List[Page], List[str], List[Union[List[discord.Embed], discord.Embed]]]
] = None,
show_disabled: Optional[bool] = None,
show_indicator: Optional[bool] = None,
show_menu: Optional[bool] = None,
author_check: Optional[bool] = None,
menu_placeholder: Optional[str] = None,
disable_on_timeout: Optional[bool] = None,
Expand All @@ -438,6 +453,8 @@ async def update(
Whether to show disabled buttons.
show_indicator: :class:`bool`
Whether to show the page indicator when using the default buttons.
show_menu: :class:`bool`
Whether to show a select menu that allows the user to switch between groups of pages.
author_check: :class:`bool`
Whether only the original user of the command can change pages.
menu_placeholder: :class:`str`
Expand Down Expand Up @@ -470,6 +487,16 @@ async def update(
self.pages: Union[List[PageGroup], List[str], List[Page], List[Union[List[discord.Embed], discord.Embed]]] = (
pages if pages is not None else self.pages
)
self.show_menu = show_menu if show_menu is not None else self.show_menu
if pages is not None and all(isinstance(pg, PageGroup) for pg in pages):
self.page_groups = self.pages if self.show_menu else None
if sum(pg.default is True for pg in self.page_groups) > 1:
raise ValueError("Only one PageGroup can be set as the default.")
for pg in self.page_groups:
if pg.default:
self.default_page_group = self.page_groups.index(pg)
break
self.pages: List[Page] = self.get_page_group_content(self.page_groups[self.default_page_group])
self.page_count = max(len(self.pages) - 1, 0)
self.current_page = 0
# Apply config changes, if specified
Expand Down Expand Up @@ -769,6 +796,10 @@ def update_custom_view(self, custom_view: discord.ui.View):
for item in custom_view.children:
self.add_item(item)

def get_page_group_content(self, page_group: PageGroup) -> List[Page]:
"""Returns a converted list of `Page` objects for the given page group based on the content of its pages."""
return [self.get_page_content(page) for page in page_group.pages]

@staticmethod
def get_page_content(page: Union[Page, str, discord.Embed, List[discord.Embed]]) -> Page:
"""Converts a page into a :class:`Page` object based on its content."""
Expand Down Expand Up @@ -1123,8 +1154,11 @@ async def callback(self, interaction: discord.Interaction):
author_check=page_group.author_check,
disable_on_timeout=page_group.disable_on_timeout,
use_default_buttons=page_group.use_default_buttons,
default_button_row=page_group.default_button_row,
loop_pages=page_group.loop_pages,
custom_view=page_group.custom_view,
timeout=page_group.timeout,
custom_buttons=page_group.custom_buttons,
trigger_on_display=page_group.trigger_on_display,
interaction=interaction,
)

0 comments on commit 028dd27

Please sign in to comment.