@@ -80,7 +80,7 @@ def __init__(
80
80
)
81
81
self .button_type = button_type
82
82
self .label = label if label or emoji else button_type .capitalize ()
83
- self .emoji = emoji
83
+ self .emoji : Union [ str , discord . Emoji , discord . PartialEmoji ] = emoji
84
84
self .style = style
85
85
self .disabled = disabled
86
86
self .loop_label = self .label if not loop_label else loop_label
@@ -170,18 +170,20 @@ def __init__(
170
170
):
171
171
self .label = label
172
172
self .description = description
173
- self .emoji = emoji
174
- self .pages = pages
173
+ self .emoji : Union [str , discord .Emoji , discord .PartialEmoji ] = emoji
174
+ self .pages : Union [
175
+ List [str ], List [Union [List [discord .Embed ], discord .Embed ]]
176
+ ] = pages
175
177
self .show_disabled = show_disabled
176
178
self .show_indicator = show_indicator
177
179
self .author_check = author_check
178
180
self .disable_on_timeout = disable_on_timeout
179
181
self .use_default_buttons = use_default_buttons
180
182
self .default_button_row = default_button_row
181
183
self .loop_pages = loop_pages
182
- self .custom_view = custom_view
183
- self .timeout = timeout
184
- self .custom_buttons = custom_buttons
184
+ self .custom_view : discord . ui . View = custom_view
185
+ self .timeout : float = timeout
186
+ self .custom_buttons : List = custom_buttons
185
187
186
188
187
189
class Paginator (discord .ui .View ):
@@ -252,27 +254,31 @@ def __init__(
252
254
custom_buttons : Optional [List [PaginatorButton ]] = None ,
253
255
) -> None :
254
256
super ().__init__ (timeout = timeout )
255
- self .timeout = timeout
256
- self .pages = pages
257
+ self .timeout : float = timeout
258
+ self .pages : Union [
259
+ List [PageGroup ], List [str ], List [Union [List [discord .Embed ], discord .Embed ]]
260
+ ] = pages
257
261
self .current_page = 0
258
262
self .menu : Optional [PaginatorMenu ] = None
259
263
self .show_menu = show_menu
260
264
self .page_groups : Optional [List [PageGroup ]] = None
261
265
262
266
if all (isinstance (pg , PageGroup ) for pg in pages ):
263
267
self .page_groups = self .pages if show_menu else None
264
- self .pages = self .page_groups [0 ].pages
268
+ self .pages : Union [
269
+ List [str ], List [Union [List [discord .Embed ], discord .Embed ]]
270
+ ] = self .page_groups [0 ].pages
265
271
266
272
self .page_count = len (self .pages ) - 1
267
273
self .buttons = {}
268
- self .custom_buttons = custom_buttons
274
+ self .custom_buttons : List = custom_buttons
269
275
self .show_disabled = show_disabled
270
276
self .show_indicator = show_indicator
271
277
self .disable_on_timeout = disable_on_timeout
272
278
self .use_default_buttons = use_default_buttons
273
279
self .default_button_row = default_button_row
274
280
self .loop_pages = loop_pages
275
- self .custom_view = custom_view
281
+ self .custom_view : discord . ui . View = custom_view
276
282
self .message : Union [discord .Message , discord .WebhookMessage , None ] = None
277
283
278
284
if self .custom_buttons and not self .use_default_buttons :
@@ -333,7 +339,9 @@ async def update(
333
339
"""
334
340
335
341
# Update pages and reset current_page to 0 (default)
336
- self .pages = pages if pages is not None else self .pages
342
+ self .pages : Union [
343
+ List [PageGroup ], List [str ], List [Union [List [discord .Embed ], discord .Embed ]]
344
+ ] = (pages if pages is not None else self .pages )
337
345
self .page_count = len (self .pages ) - 1
338
346
self .current_page = 0
339
347
# Apply config changes, if specified
@@ -360,8 +368,8 @@ async def update(
360
368
else self .default_button_row
361
369
)
362
370
self .loop_pages = loop_pages if loop_pages is not None else self .loop_pages
363
- self .custom_view = None if custom_view is None else custom_view
364
- self .timeout = timeout if timeout is not None else self .timeout
371
+ self .custom_view : discord . ui . View = None if custom_view is None else custom_view
372
+ self .timeout : float = timeout if timeout is not None else self .timeout
365
373
if custom_buttons and not self .use_default_buttons :
366
374
self .buttons = {}
367
375
for button in custom_buttons :
@@ -379,6 +387,61 @@ async def on_timeout(self) -> None:
379
387
item .disabled = True
380
388
await self .message .edit (view = self )
381
389
390
+ async def disable (
391
+ self ,
392
+ include_custom : bool = False ,
393
+ page : Optional [Union [str , Union [List [discord .Embed ], discord .Embed ]]] = None ,
394
+ ) -> None :
395
+ """Stops the paginator, disabling all of its components.
396
+
397
+ Parameters
398
+ ----------
399
+ include_custom: :class:`bool`
400
+ Whether to disable components added via custom views.
401
+ page: Optional[Union[:class:`str`, Union[List[:class:`discord.Embed`], :class:`discord.Embed`]]]
402
+ The page content to show after disabling the paginator.
403
+ """
404
+ page = self .get_page_content (page )
405
+ for item in self .children :
406
+ if item not in self .custom_view .children or include_custom :
407
+ item .disabled = True
408
+ if page :
409
+ await self .message .edit (
410
+ content = page if isinstance (page , str ) else None ,
411
+ embeds = [] if isinstance (page , str ) else page ,
412
+ view = self ,
413
+ )
414
+ else :
415
+ await self .message .edit (view = self )
416
+
417
+ async def cancel (
418
+ self ,
419
+ include_custom : bool = False ,
420
+ page : Optional [Union [str , Union [List [discord .Embed ], discord .Embed ]]] = None ,
421
+ ) -> None :
422
+ """Cancels the paginator, removing all of its components from the message.
423
+
424
+ Parameters
425
+ ----------
426
+ include_custom: :class:`bool`
427
+ Whether to remove components added via custom views.
428
+ page: Optional[Union[:class:`str`, Union[List[:class:`discord.Embed`], :class:`discord.Embed`]]]
429
+ The page content to show after canceling the paginator.
430
+ """
431
+ items = self .children .copy ()
432
+ page = self .get_page_content (page )
433
+ for item in items :
434
+ if item not in self .custom_view .children or include_custom :
435
+ self .remove_item (item )
436
+ if page :
437
+ await self .message .edit (
438
+ content = page if isinstance (page , str ) else None ,
439
+ embeds = [] if isinstance (page , str ) else page ,
440
+ view = self ,
441
+ )
442
+ else :
443
+ await self .message .edit (view = self )
444
+
382
445
async def goto_page (self , page_number = 0 ) -> discord .Message :
383
446
"""Updates the paginator message to show the specified page number.
384
447
@@ -559,7 +622,6 @@ def update_buttons(self) -> Dict:
559
622
if self .custom_view :
560
623
for item in self .custom_view .children :
561
624
self .add_item (item )
562
-
563
625
return self .buttons
564
626
565
627
@staticmethod
0 commit comments