From 89ccf6ecb0eea16ae0e2b4d6ab5ad25ae98a2d02 Mon Sep 17 00:00:00 2001 From: forkless Date: Sun, 31 May 2026 21:39:23 +0200 Subject: [PATCH] Non-blocking poll + whale in all pickers and popups --- src/main.rs | 15 ++++++++++----- src/tui.rs | 6 +++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7f4e445..e949468 100644 --- a/src/main.rs +++ b/src/main.rs @@ -485,7 +485,7 @@ fn action_recover_bak(terminal: &mut Terminal, app: &mut App) -> selected_info, ); })?; - let key = read_key_event()?; + if let Some(key) = poll_key(250)? { match key.code { KeyCode::Up => { let i = state.selected().unwrap_or(0); @@ -588,6 +588,7 @@ fn action_recover_bak(terminal: &mut Terminal, app: &mut App) -> KeyCode::Esc => break, _ => {} } + } } refresh_stats(&mut app.tui_state, Some(&save_folder)); @@ -664,7 +665,7 @@ fn action_restore_backup(terminal: &mut Terminal, app: &mut App) terminal.draw(|f| { tui::draw_picker(f, &app.tui_state, &item_refs, &descs, &mut state); })?; - let key = read_key_event()?; + if let Some(key) = poll_key(250)? { match key.code { KeyCode::Up => { let i = state.selected().unwrap_or(0); @@ -703,6 +704,7 @@ fn action_restore_backup(terminal: &mut Terminal, app: &mut App) KeyCode::Esc => break, _ => {} } + } } refresh_stats(&mut app.tui_state, Some(&save_folder)); @@ -731,7 +733,7 @@ fn run_ini_submenu(terminal: &mut Terminal, app: &mut App) -> Res terminal.draw(|f| { tui::draw_sub_menu(f, &app.tui_state, "Config (.ini) Management", &items, &descs, &mut state); })?; - let key = read_key_event()?; + if let Some(key) = poll_key(250)? { match key.code { KeyCode::Up => { let i = state.selected().unwrap_or(0); @@ -753,6 +755,7 @@ fn run_ini_submenu(terminal: &mut Terminal, app: &mut App) -> Res KeyCode::Esc => break, _ => {} } + } } refresh_stats(&mut app.tui_state, app.save_folder.as_deref()); @@ -815,7 +818,7 @@ fn ini_restore_action( terminal.draw(|f| { tui::draw_picker(f, &app.tui_state, &item_refs, &descs, &mut state); })?; - let key = read_key_event()?; + if let Some(key) = poll_key(250)? { match key.code { KeyCode::Up => { let i = state.selected().unwrap_or(0); @@ -844,6 +847,7 @@ fn ini_restore_action( KeyCode::Esc => break, _ => {} } + } } Ok(()) @@ -1109,7 +1113,7 @@ fn confirm_modal( } tui::draw_confirm_popup(f, &app.tui_state, title, details, selected_yes); })?; - let key = read_key_event()?; + if let Some(key) = poll_key(250)? { match key.code { KeyCode::Left | KeyCode::Right | KeyCode::Up | KeyCode::Down => { selected_yes = !selected_yes; @@ -1119,6 +1123,7 @@ fn confirm_modal( KeyCode::Enter => return Ok(selected_yes), _ => {} } + } } } diff --git a/src/tui.rs b/src/tui.rs index a1d782d..da2a9f0 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -170,7 +170,7 @@ pub fn draw_disclaimer_popup(f: &mut Frame, app: &AppState, selected_yes: bool) /// Draw a simple confirmation popup with [ Yes ] [ No ] buttons. pub fn draw_confirm_popup( f: &mut Frame, - _app: &AppState, + app: &AppState, title: &str, details: &[(&str, &str)], selected_yes: bool, @@ -223,6 +223,10 @@ pub fn draw_confirm_popup( Paragraph::new(buttons).alignment(Alignment::Center), Rect { y: inner.y + inner.height.saturating_sub(1), height: 1, ..inner }, ); + + // Whale + let bar = Rect { x: 0, y: f.area().height.saturating_sub(1), width: f.area().width, height: 1 }; + draw_whale_separator(f, bar, app); } pub fn draw_ok_dialog(f: &mut Frame, app: &AppState, title: &str, message: &str) {