1- use crate :: view:: { resources:: ResourcesTable , table:: TableListState , tasks:: TasksTable } ;
1+ use crate :: view:: help:: HelpView ;
2+ use crate :: view:: {
3+ help:: HelpText , resources:: ResourcesTable , table:: TableListState , tasks:: TasksTable ,
4+ } ;
25use crate :: { input, state:: State } ;
36use ratatui:: {
47 layout,
@@ -10,6 +13,7 @@ use std::{borrow::Cow, cmp};
1013mod async_ops;
1114mod controls;
1215mod durations;
16+ mod help;
1317mod mini_histogram;
1418mod percentiles;
1519mod resource;
@@ -43,6 +47,7 @@ pub struct View {
4347 tasks_list : TableListState < TasksTable , 12 > ,
4448 resources_list : TableListState < ResourcesTable , 9 > ,
4549 state : ViewState ,
50+ show_help_modal : bool ,
4651 pub ( crate ) styles : Styles ,
4752}
4853
@@ -96,6 +101,7 @@ impl View {
96101 state : ViewState :: TasksList ,
97102 tasks_list : TableListState :: < TasksTable , 12 > :: default ( ) ,
98103 resources_list : TableListState :: < ResourcesTable , 9 > :: default ( ) ,
104+ show_help_modal : false ,
99105 styles,
100106 }
101107 }
@@ -104,6 +110,11 @@ impl View {
104110 use ViewState :: * ;
105111 let mut update_kind = UpdateKind :: Other ;
106112
113+ if self . should_toggle_help_modal ( & event) {
114+ self . show_help_modal = !self . show_help_modal ;
115+ return update_kind;
116+ }
117+
107118 if matches ! ( event, key!( Char ( 't' ) ) ) {
108119 self . state = TasksList ;
109120 return update_kind;
@@ -180,32 +191,46 @@ impl View {
180191 update_kind
181192 }
182193
194+ /// The help modal should toggle on the `?` key and should exit on `Esc`
195+ fn should_toggle_help_modal ( & mut self , event : & crossterm:: event:: Event ) -> bool {
196+ input:: is_help_toggle ( event) || ( self . show_help_modal && input:: is_esc ( event) )
197+ }
198+
183199 pub ( crate ) fn render < B : ratatui:: backend:: Backend > (
184200 & mut self ,
185201 frame : & mut ratatui:: terminal:: Frame < B > ,
186202 area : layout:: Rect ,
187203 state : & mut State ,
188204 ) {
189- match self . state {
205+ let help_text : & dyn HelpText = match self . state {
190206 ViewState :: TasksList => {
191207 self . tasks_list . render ( & self . styles , frame, area, state, ( ) ) ;
208+ & self . tasks_list
192209 }
193210 ViewState :: ResourcesList => {
194211 self . resources_list
195212 . render ( & self . styles , frame, area, state, ( ) ) ;
213+ & self . resources_list
196214 }
197215 ViewState :: TaskInstance ( ref mut view) => {
198216 let now = state
199217 . last_updated_at ( )
200218 . expect ( "task view implies we've received an update" ) ;
201219 view. render ( & self . styles , frame, area, now) ;
220+ view
202221 }
203222 ViewState :: ResourceInstance ( ref mut view) => {
204223 view. render ( & self . styles , frame, area, state) ;
224+ view
205225 }
206- }
226+ } ;
207227
208228 state. retain_active ( ) ;
229+
230+ if self . show_help_modal {
231+ let mut help_view = HelpView :: new ( help_text. render_help_content ( & self . styles ) ) ;
232+ help_view. render ( & self . styles , frame, area, state) ;
233+ }
209234 }
210235
211236 pub ( crate ) fn current_view ( & self ) -> & ViewState {
0 commit comments