diff --git a/src/app.rs b/src/app.rs index 2c2054e0..52e8e38b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -200,7 +200,7 @@ impl AppState { fn set_current_screen(&mut self, screen_type: CurrentScreen) { if self.current_screen == screen_type { self.current_screen = screen_type; - // TODO: Redraw + // FIXME: Redraw with new screen, save old screen state if main } } } diff --git a/src/bin/main.rs b/src/bin/main.rs index 2676ff7a..4292487c 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -8,7 +8,6 @@ use bottom::{app::AppMessages, options::*, tuine::RuntimeEvent, *}; use std::{ boxed::Box, - io::stdout, panic, sync::{mpsc, Arc, Condvar, Mutex}, thread, @@ -16,12 +15,6 @@ use std::{ }; use anyhow::{Context, Result}; -use crossterm::{ - event::EnableMouseCapture, - execute, - terminal::{enable_raw_mode, EnterAlternateScreen}, -}; -use tui::{backend::CrosstermBackend, Terminal}; fn main() -> Result<()> { let matches = clap::get_matches(); @@ -90,13 +83,7 @@ fn main() -> Result<()> { ); // Set up up tui and crossterm - let mut stdout_val = stdout(); - execute!(stdout_val, EnterAlternateScreen, EnableMouseCapture)?; - enable_raw_mode()?; - - let mut terminal = Terminal::new(CrosstermBackend::new(stdout_val))?; - terminal.clear()?; - terminal.hide_cursor()?; + let mut terminal = init_terminal()?; // Set panic hook // TODO: [Threads, Panic] Make this close all the child threads too! @@ -109,7 +96,7 @@ fn main() -> Result<()> { thread_termination_cvar.notify_all(); let _ = input_thread.join(); - cleanup_terminal(&mut terminal)?; + cleanup_terminal(&mut terminal); Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index 1c433b78..2d87db49 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,7 @@ extern crate log; use std::{ boxed::Box, fs, - io::{stdout, Write}, + io::{stdout, Stdout, Write}, panic::PanicInfo, path::PathBuf, sync::Arc, @@ -20,15 +20,19 @@ use std::{ }; use crossterm::{ - event::{poll, read, DisableMouseCapture, MouseEventKind}, + event::{poll, read, DisableMouseCapture, EnableMouseCapture, MouseEventKind}, execute, style::Print, - terminal::{disable_raw_mode, LeaveAlternateScreen}, + terminal::{ + disable_raw_mode, enable_raw_mode, Clear, ClearType, EnterAlternateScreen, + LeaveAlternateScreen, + }, }; use app::{data_harvester, AppMessages, UsedWidgets}; use constants::*; use options::*; +use tui::{backend::CrosstermBackend, terminal::Terminal}; use tuine::{Event, RuntimeEvent}; use utils::error; @@ -116,18 +120,28 @@ pub fn create_or_get_config(config_path: &Option) -> error::Result>, -) -> error::Result<()> { - disable_raw_mode()?; +pub fn init_terminal() -> anyhow::Result>> { + let mut stdout_val = stdout(); + execute!(stdout_val, EnterAlternateScreen, EnableMouseCapture)?; + enable_raw_mode()?; + + let mut terminal = Terminal::new(CrosstermBackend::new(stdout_val))?; + terminal.clear()?; + terminal.hide_cursor()?; + + Ok(terminal) +} + +pub fn cleanup_terminal(terminal: &mut Terminal>) { + terminal.clear().unwrap(); + disable_raw_mode().unwrap(); execute!( terminal.backend_mut(), DisableMouseCapture, LeaveAlternateScreen - )?; - terminal.show_cursor()?; - - Ok(()) + ) + .unwrap(); + terminal.show_cursor().unwrap(); } /// Based on https://github.com/Rigellute/spotify-tui/blob/master/src/main.rs @@ -146,7 +160,13 @@ pub fn panic_hook(panic_info: &PanicInfo<'_>) { let stacktrace: String = format!("{:?}", backtrace::Backtrace::new()); disable_raw_mode().unwrap(); - execute!(stdout, DisableMouseCapture, LeaveAlternateScreen).unwrap(); + execute!( + stdout, + Clear(ClearType::All), + DisableMouseCapture, + LeaveAlternateScreen + ) + .unwrap(); // Print stack trace. Must be done after! execute!( diff --git a/src/tuine/component/base/text_table/data_cell.rs b/src/tuine/component/base/text_table/data_cell.rs new file mode 100644 index 00000000..9966c852 --- /dev/null +++ b/src/tuine/component/base/text_table/data_cell.rs @@ -0,0 +1,10 @@ +use std::borrow::Cow; + +use tui::style::Style; + +pub enum DataCell { + Display, + Numeric, +} + +impl DataCell {} diff --git a/src/tuine/component/base/text_table/data_row.rs b/src/tuine/component/base/text_table/data_row.rs new file mode 100644 index 00000000..a805c5d9 --- /dev/null +++ b/src/tuine/component/base/text_table/data_row.rs @@ -0,0 +1,15 @@ +use tui::style::Style; + +use super::DataCell; + +pub struct DataRow { + cells: Vec, + style: Option