From 18194f586cefafc9d2301c95fa5073d4294cc515 Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 15 Feb 2022 23:16:01 +0100 Subject: [PATCH] Render basic tui and restore terminal --- Cargo.lock | 83 ++++++++++++++++++++++++++++++++++++++++++++ cove-tui/Cargo.toml | 10 ++++++ cove-tui/src/main.rs | 46 ++++++++++++++++++++++-- 3 files changed, 137 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5737358..7daaf5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,6 +70,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + [[package]] name = "cfg-if" version = "1.0.0" @@ -105,6 +111,12 @@ dependencies = [ [[package]] name = "cove-tui" version = "0.1.0" +dependencies = [ + "anyhow", + "crossterm", + "tokio", + "tui", +] [[package]] name = "cpufeatures" @@ -115,6 +127,31 @@ dependencies = [ "libc", ] +[[package]] +name = "crossterm" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85525306c4291d1b73ce93c8acf9c339f9b213aef6c1d85c3830cbf1c16325c" +dependencies = [ + "bitflags", + "crossterm_winapi", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" +dependencies = [ + "winapi", +] + [[package]] name = "crypto-common" version = "0.1.2" @@ -638,6 +675,27 @@ dependencies = [ "digest 0.10.2", ] +[[package]] +name = "signal-hook" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29fd5867f1c4f2c5be079aee7a2adf1152ebb04a4bc4d341f504b7dece607ed4" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -767,6 +825,19 @@ dependencies = [ "tungstenite", ] +[[package]] +name = "tui" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ed0a32c88b039b73f1b6c5acbd0554bfa5b6be94467375fd947c4de3a02271" +dependencies = [ + "bitflags", + "cassowary", + "crossterm", + "unicode-segmentation", + "unicode-width", +] + [[package]] name = "tungstenite" version = "0.16.0" @@ -807,6 +878,18 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + [[package]] name = "unicode-xid" version = "0.2.2" diff --git a/cove-tui/Cargo.toml b/cove-tui/Cargo.toml index ae4e3fb..aaad749 100644 --- a/cove-tui/Cargo.toml +++ b/cove-tui/Cargo.toml @@ -4,3 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = "1.0.53" +# cove-core = { path = "../cove-core" } +crossterm = "0.22.1" +# futures = "0.3.21" +# serde_json = "1.0.78" +# thiserror = "1.0.30" +tokio = { version = "1.16.1", features = ["full"] } +# tokio-stream = "0.1.8" +# tokio-tungstenite = "0.16.1" +tui = "0.17.0" diff --git a/cove-tui/src/main.rs b/cove-tui/src/main.rs index e7a11a9..b3d6126 100644 --- a/cove-tui/src/main.rs +++ b/cove-tui/src/main.rs @@ -1,3 +1,45 @@ -fn main() { - println!("Hello, world!"); +use std::io::{self, Stdout}; +use std::time::Duration; + +use crossterm::event::{DisableMouseCapture, EnableMouseCapture}; +use crossterm::execute; +use crossterm::terminal::{EnterAlternateScreen, LeaveAlternateScreen}; +use tokio::time; +use tui::backend::CrosstermBackend; +use tui::widgets::{Block, Borders}; +use tui::Terminal; + +async fn run(terminal: &mut Terminal>) -> anyhow::Result<()> { + terminal.draw(|f| { + let block = Block::default().title("Block").borders(Borders::ALL); + f.render_widget(block, f.size()); + })?; + time::sleep(Duration::from_secs(1)).await; + Ok(()) +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let mut terminal = Terminal::new(CrosstermBackend::new(io::stdout()))?; + + crossterm::terminal::enable_raw_mode()?; + execute!( + terminal.backend_mut(), + EnterAlternateScreen, + EnableMouseCapture + )?; + + // Defer error handling so the terminal always gets restored properly + let result = run(&mut terminal).await; + + crossterm::terminal::disable_raw_mode()?; + execute!( + terminal.backend_mut(), + LeaveAlternateScreen, + DisableMouseCapture + )?; + + result?; + + Ok(()) }