From 28f5ac90cc1ba7d668ae8a83eb5cd899294a8301 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 12 Sep 2022 09:45:50 +0800 Subject: [PATCH] feat: Automatically resize if the terminal changes in size. (#28) --- Cargo.lock | 4 --- src/interactive/app/eventloop.rs | 30 ++++++++++--------- .../app/tests/journeys_with_writes.rs | 8 ++--- src/interactive/app/tests/utils.rs | 8 +++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d5c34985..83742eb8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -214,8 +214,6 @@ dependencies = [ [[package]] name = "crosstermion" version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5ca9d96c86546f69eb86a54ae2c6e70f53342d5431cd73a92f7e2ce4ce4511" dependencies = [ "crossterm", "termion", @@ -782,8 +780,6 @@ dependencies = [ [[package]] name = "tui-react" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "542c37309aaf01ddaea86891f7845a8b0124194c6ccae6dbae7d223752648f4d" dependencies = [ "log", "tui", diff --git a/src/interactive/app/eventloop.rs b/src/interactive/app/eventloop.rs index 6814dd23..77901ed4 100644 --- a/src/interactive/app/eventloop.rs +++ b/src/interactive/app/eventloop.rs @@ -5,7 +5,7 @@ use crate::interactive::{ SortMode, }; use anyhow::Result; -use crosstermion::input::{key_input_channel, Key}; +use crosstermion::input::{input_channel, Event, Key}; use dua::{ traverse::{Traversal, TreeIndex}, WalkOptions, WalkResult, @@ -69,7 +69,7 @@ impl AppState { traversal: &mut Traversal, display: &mut DisplayOptions, terminal: &mut Terminal, - keys: impl Iterator, + events: impl Iterator, ) -> Result where B: Backend, @@ -77,8 +77,12 @@ impl AppState { use crosstermion::input::Key::*; use FocussedPane::*; - self.draw(window, traversal, *display, terminal)?; - for key in keys { + for event in events { + let key = match event { + Event::Key(key) => key, + Event::Resize(_, _) => Alt('\r'), + }; + self.reset_message(); match key { Char('?') => self.toggle_help_pane(window), @@ -106,17 +110,15 @@ impl AppState { } match self.focussed { - FocussedPane::Mark => { - self.dispatch_to_mark_pane(key, window, traversal, *display, terminal) - } - FocussedPane::Help => { + Mark => self.dispatch_to_mark_pane(key, window, traversal, *display, terminal), + Help => { window .help_pane .as_mut() .expect("help pane") .process_events(key); } - FocussedPane::Main => match key { + Main => match key { Char('O') => self.open_that(traversal), Char(' ') => self.mark_entry( CursorMode::KeepPosition, @@ -184,7 +186,7 @@ pub struct TerminalApp { pub window: MainWindow, } -type KeyboardInputAndApp = (std::sync::mpsc::Receiver, TerminalApp); +type KeyboardInputAndApp = (std::sync::mpsc::Receiver, TerminalApp); impl TerminalApp { pub fn refresh_view(&mut self, terminal: &mut Terminal) @@ -198,14 +200,14 @@ impl TerminalApp { &mut self.traversal, &mut self.display, terminal, - std::iter::once(Key::Alt('\r')), + std::iter::once(Event::Key(Key::Alt('\r'))), ) .ok(); } pub fn process_events( &mut self, terminal: &mut Terminal, - keys: impl Iterator, + events: impl Iterator, ) -> Result where B: Backend, @@ -215,7 +217,7 @@ impl TerminalApp { &mut self.traversal, &mut self.display, terminal, - keys, + events, )? { ProcessingResult::Finished(res) | ProcessingResult::ExitRequested(res) => Ok(res), } @@ -240,7 +242,7 @@ impl TerminalApp { let (_, keys_rx) = std::sync::mpsc::channel(); keys_rx } - Interaction::Full => key_input_channel(), + Interaction::Full => input_channel(), }; let fetch_buffered_key_events = || { diff --git a/src/interactive/app/tests/journeys_with_writes.rs b/src/interactive/app/tests/journeys_with_writes.rs index 6e411f32..4e990ee4 100644 --- a/src/interactive/app/tests/journeys_with_writes.rs +++ b/src/interactive/app/tests/journeys_with_writes.rs @@ -2,6 +2,8 @@ use crate::interactive::app::tests::utils::{ initialized_app_and_terminal_from_paths, into_keys, WritableFixture, }; use anyhow::Result; +use crosstermion::input::Event; +use crosstermion::input::Key; use pretty_assertions::assert_eq; #[test] @@ -24,11 +26,7 @@ fn basic_user_journey_with_deletion() -> Result<()> { // When selecting the marker window and pressing the combination to delete entries app.process_events( &mut terminal, - vec![ - crosstermion::input::Key::Char('\t'), - crosstermion::input::Key::Ctrl('r'), - ] - .into_iter(), + vec![Event::Key(Key::Char('\t')), Event::Key(Key::Ctrl('r'))].into_iter(), )?; assert!( app.window.mark_pane.is_none(), diff --git a/src/interactive/app/tests/utils.rs b/src/interactive/app/tests/utils.rs index 0e1a8f09..2882f6dc 100644 --- a/src/interactive/app/tests/utils.rs +++ b/src/interactive/app/tests/utils.rs @@ -21,8 +21,12 @@ use crate::interactive::{app::tests::FIXTURE_PATH, Interaction, TerminalApp}; pub fn into_keys<'a>( bytes: impl Iterator + 'a, -) -> impl Iterator + 'a { - bytes.map(|b| crosstermion::input::Key::Char(std::char::from_u32(*b as u32).unwrap())) +) -> impl Iterator + 'a { + bytes.map(|b| { + crosstermion::input::Event::Key(crosstermion::input::Key::Char( + std::char::from_u32(*b as u32).unwrap(), + )) + }) } pub fn node_by_index(app: &TerminalApp, id: TreeIndex) -> &EntryData {