1- use std:: { collections:: VecDeque , sync:: Arc } ;
1+ use std:: {
2+ collections:: { HashSet , VecDeque } ,
3+ sync:: Arc ,
4+ } ;
25
36use tokio:: {
47 sync:: { mpsc, watch, RwLock } ,
@@ -16,6 +19,7 @@ use promkit_core::{
1619 PaneFactory ,
1720} ;
1821use promkit_widgets:: { text, text_editor} ;
22+ use termcfg:: event:: { event_def:: EventDef , format:: event_to_shortcut} ;
1923
2024use crate :: {
2125 config:: { matches_keybind, StreamingKeybinds } ,
@@ -32,6 +36,33 @@ enum InputAction {
3236 GotoStreaming ,
3337}
3438
39+ #[ derive( Clone ) ]
40+ struct HintKeybindLabels {
41+ archived : String ,
42+ pause_resume : String ,
43+ retry : Option < String > ,
44+ exit : String ,
45+ }
46+
47+ fn format_keybinds ( events : & HashSet < Event > ) -> String {
48+ let mut labels = events
49+ . iter ( )
50+ . filter_map ( |event| EventDef :: try_from ( event) . ok ( ) . map ( event_to_shortcut) )
51+ . collect :: < Vec < String > > ( ) ;
52+ labels. sort ( ) ;
53+ labels. dedup ( ) ;
54+ labels. join ( "/" )
55+ }
56+
57+ fn create_hint_keybind_labels ( keybinds : & StreamingKeybinds , has_cmd : bool ) -> HintKeybindLabels {
58+ HintKeybindLabels {
59+ archived : format_keybinds ( & keybinds. goto_archived ) ,
60+ pause_resume : format_keybinds ( & keybinds. toggle_pause ) ,
61+ retry : has_cmd. then ( || format_keybinds ( & keybinds. retry ) ) ,
62+ exit : format_keybinds ( & keybinds. exit ) ,
63+ }
64+ }
65+
3566// Evaluate a key event and return the corresponding InputAction.
3667fn evaluate_event (
3768 event : & Event ,
@@ -108,10 +139,22 @@ fn evaluate_event(
108139 Ok ( InputAction :: Continue )
109140}
110141
111- fn create_panes ( text_editor : & text_editor:: State , size : ( u16 , u16 ) , has_cmd : bool ) -> Vec < Pane > {
112- let retry_hint = if has_cmd { " | Retry" } else { "" } ;
142+ fn create_panes (
143+ text_editor : & text_editor:: State ,
144+ size : ( u16 , u16 ) ,
145+ paused : bool ,
146+ keybind_labels : & HintKeybindLabels ,
147+ ) -> Vec < Pane > {
148+ let badge = if paused { "[PAUSED]" } else { "[RUNNING]" } ;
149+ let retry_hint = match & keybind_labels. retry {
150+ Some ( retry) => format ! ( " | Retry({retry})" ) ,
151+ None => String :: new ( ) ,
152+ } ;
113153 let hint = text:: State {
114- text : text:: Text :: from ( format ! ( "Archived | Pause/Resume{} | Exit" , retry_hint) ) ,
154+ text : text:: Text :: from ( format ! (
155+ "{badge} Archived({}) | Pause/Resume({}){} | Exit({})" ,
156+ keybind_labels. archived, keybind_labels. pause_resume, retry_hint, keybind_labels. exit
157+ ) ) ,
115158 config : text:: Config {
116159 style : Some ( ContentStyle {
117160 foreground_color : Some ( Color :: DarkGrey ) ,
@@ -140,8 +183,9 @@ pub async fn run(
140183) -> anyhow:: Result < ( Signal , VecDeque < String > ) > {
141184 let size = crossterm:: terminal:: size ( ) ?;
142185 let has_cmd = cmd. is_some ( ) ;
186+ let keybind_labels = create_hint_keybind_labels ( & keybinds, has_cmd) ;
143187
144- let panes = create_panes ( & text_editor, size, has_cmd ) ;
188+ let panes = create_panes ( & text_editor, size, false , & keybind_labels ) ;
145189 let term = Terminal :: try_new ( size, & panes) ?;
146190 term. draw_pane ( & panes) ?;
147191
@@ -150,6 +194,7 @@ pub async fn run(
150194 let readonly_term = Arc :: clone ( & shared_term) ;
151195 let readonly_text_editor = Arc :: clone ( & shared_text_editor) ;
152196 let ( pause_tx, mut pause_rx) = watch:: channel ( false ) ;
197+ let keybind_labels_for_task = keybind_labels. clone ( ) ;
153198
154199 let ( tx, mut rx) = mpsc:: channel ( 1 ) ;
155200
@@ -233,7 +278,8 @@ pub async fn run(
233278 case_insensitive,
234279 ) {
235280 let matrix = highlighted. matrixify( size. 0 as usize , size. 1 as usize , 0 ) . 0 ;
236- let panes = create_panes( & text_editor, size, has_cmd) ;
281+ let panes =
282+ create_panes( & text_editor, size, paused, & keybind_labels_for_task) ;
237283 let mut term = readonly_term. write( ) . await ;
238284 let pane_rows = Terminal :: pane_rows( size, & panes) ;
239285 if term. sync_layout( size, pane_rows) ? {
@@ -275,7 +321,7 @@ pub async fn run(
275321 }
276322
277323 let size = crossterm:: terminal:: size ( ) ?;
278- let panes = create_panes ( & text_editor, size, has_cmd ) ;
324+ let panes = create_panes ( & text_editor, size, paused , & keybind_labels ) ;
279325 let mut term = shared_term. write ( ) . await ;
280326 term. sync_layout ( size, Terminal :: pane_rows ( size, & panes) ) ?;
281327 term. draw_pane ( & panes) ?;
0 commit comments