From e8e68682d834d867306e16aaede974f8159922db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Fri, 23 Jan 2026 23:37:36 +0100 Subject: [PATCH] feat: ctrl-c handling --- src/main.rs | 86 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3ac0cb2..8ca487f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ use crossterm::terminal::{ use ratatui::Terminal; use ratatui::backend::CrosstermBackend; use ratatui::layout::{Constraint, Direction, Layout}; -use ratatui::style::{Color, Modifier, Style}; +use ratatui::style::Style; use ratatui::widgets::{Block, Borders, List, ListItem, ListState}; fn main() -> Result<(), Box> { @@ -58,48 +58,62 @@ fn main() -> Result<(), Box> { .borders(Borders::ALL) .title("Lines (space to mark, q to quit)"), ) - .highlight_style( - Style::default() - .fg(Color::White) - .bg(Color::Blue) - .add_modifier(Modifier::BOLD), - ); + .highlight_style(Style::default().bold().yellow().on_dark_gray()); f.render_stateful_widget(list, chunks[0], &mut state); })?; // Event handling - if event::poll(Duration::from_millis(100))? - && let Event::Key(key) = event::read()? - { - match key.code { - KeyCode::Char('q') => break, - KeyCode::Up => { - if let Some(i) = state.selected() - && i > 0 - { - state.select(Some(i - 1)); + if event::poll(Duration::from_millis(100))? { + match event::read()? { + Event::Key(key) => { + match key.code { + KeyCode::Char('q') => break, + KeyCode::Up => { + if let Some(i) = state.selected() + && i > 0 + { + state.select(Some(i - 1)); + } + } + KeyCode::Down => { + if let Some(i) = state.selected() + && i + 1 < lines.len() + { + state.select(Some(i + 1)); + } + } + KeyCode::Char(' ') => { + if let Some(i) = state.selected() + && i < marked.len() + { + assert!(i < marked.len()); + if marked[i] { + marked[i] = false; + } else { + marked[i] = true; + // move cursor down + let next = lines.len().min(i + 1); + state.select(Some(next)); + } + } + } + KeyCode::Char('c') + if key.modifiers.contains(event::KeyModifiers::CONTROL) => + { + break; + } + _ => {} } } - KeyCode::Down => { - if let Some(i) = state.selected() - && i + 1 < lines.len() - { - state.select(Some(i + 1)); - } - } - KeyCode::Char(' ') => { - if let Some(i) = state.selected() - && i < marked.len() - { - assert!(i < marked.len()); - if marked[i] { - marked[i] = false; - } else { - marked[i] = true; - // move cursor down - let next = lines.len().min(i + 1); - state.select(Some(next)); + Event::Mouse(s) => { + if let event::MouseEventKind::Down(event::MouseButton::Left) = s.kind { + let area = terminal.size()?; + if s.row > area.height && s.row < area.height + area.height { + let idx = (s.row - area.height - 1) as usize; + if idx < lines.len() { + state.select(Some(idx)); + } } } }