@@ -5,11 +5,14 @@ use serenity::{CollectComponentInteractions, builder::*, small_fixed_array::Fixe
55
66use tts_core:: structs:: { Context , TTSMode } ;
77
8+ use cursor:: PageCursor ;
9+
10+ mod cursor;
11+
812pub struct MenuPaginator < ' a > {
9- index : usize ,
1013 mode : TTSMode ,
1114 ctx : Context < ' a > ,
12- pages : Box < [ String ] > ,
15+ pages : PageCursor ,
1316 footer : Cow < ' a , str > ,
1417 current_voice : String ,
1518}
@@ -24,11 +27,10 @@ impl<'a> MenuPaginator<'a> {
2427 ) -> Self {
2528 Self {
2629 ctx,
27- pages,
2830 current_voice,
2931 mode,
3032 footer,
31- index : 0 ,
33+ pages : PageCursor :: new ( pages ) ,
3234 }
3335 }
3436
@@ -55,9 +57,8 @@ impl<'a> MenuPaginator<'a> {
5557 ) )
5658 . disabled (
5759 disabled
58- || ( [ "⏮️" , "◀" ] . contains ( & emoji) && self . index == 0 )
59- || ( [ "▶️" , "⏭️" ] . contains ( & emoji)
60- && self . index == ( self . pages . len ( ) - 1 ) ) ,
60+ || ( [ "⏮️" , "◀" ] . contains ( & emoji) && !self . pages . can_rewind ( ) )
61+ || ( [ "▶️" , "⏭️" ] . contains ( & emoji) && !self . pages . can_advance ( ) ) ,
6162 )
6263 } )
6364 . collect ( ) ;
@@ -68,7 +69,7 @@ impl<'a> MenuPaginator<'a> {
6869 async fn create_message ( & self ) -> serenity:: Result < serenity:: MessageId > {
6970 let components = [ self . create_action_row ( false ) ] ;
7071 let builder = poise:: CreateReply :: default ( )
71- . embed ( self . create_page ( & self . pages [ self . index ] ) )
72+ . embed ( self . create_page ( self . pages . current ( ) ) )
7273 . components ( & components) ;
7374
7475 self . ctx . send ( builder) . await ?. message ( ) . await . map ( |m| m. id )
@@ -81,7 +82,7 @@ impl<'a> MenuPaginator<'a> {
8182 ) -> serenity:: Result < ( ) > {
8283 let components = [ self . create_action_row ( disable) ] ;
8384 let builder = CreateInteractionResponseMessage :: default ( )
84- . embed ( self . create_page ( & self . pages [ self . index ] ) )
85+ . embed ( self . create_page ( self . pages . current ( ) ) )
8586 . components ( & components) ;
8687
8788 let response = CreateInteractionResponse :: UpdateMessage ( builder) ;
@@ -104,22 +105,22 @@ impl<'a> MenuPaginator<'a> {
104105
105106 match interaction. data . custom_id . as_str ( ) {
106107 "⏮️" => {
107- self . index = 0 ;
108+ self . pages . jump_start ( ) ;
108109 self . edit_message ( interaction, false ) . await ?;
109110 }
110111 "◀" => {
111- self . index = self . index . saturating_sub ( 1 ) ;
112+ self . pages . rewind ( ) ;
112113 self . edit_message ( interaction, false ) . await ?;
113114 }
114115 "⏹️" => {
115116 return self . edit_message ( interaction, true ) . await ;
116117 }
117118 "▶️" => {
118- self . index = self . index . saturating_add ( 1 ) . max ( self . pages . len ( ) - 1 ) ;
119+ self . pages . advance ( ) ;
119120 self . edit_message ( interaction, false ) . await ?;
120121 }
121122 "⏭️" => {
122- self . index = self . pages . len ( ) - 1 ;
123+ self . pages . jump_end ( ) ;
123124 self . edit_message ( interaction, false ) . await ?;
124125 }
125126 _ => unreachable ! ( ) ,
0 commit comments