diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2023-02-01 09:43:02 -0330 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2023-02-01 09:43:02 -0330 |
| commit | cdb67db4ab688dc93f28fefa2281616a00160c65 (patch) | |
| tree | 86ab35c669482d1966a5e770bdda4760ac5b42b0 /src/main.rs | |
| parent | e5f32ef621ec1fbad0b86ddcdb5b2e32077891c1 (diff) | |
| download | pfc-cdb67db4ab688dc93f28fefa2281616a00160c65.zip | |
ui skeleton
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs index e7a11a9..85e95ea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,93 @@ -fn main() { - println!("Hello, world!"); +use crossterm::{ + event::{ + self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEvent, KeyModifiers, + }, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, +}; +use std::io; +use tui::{ + backend::{Backend, CrosstermBackend}, + layout::{Constraint, Direction, Layout}, + widgets::Paragraph, + Frame, Terminal, +}; + +enum Signal { + None, + Exit, +} + +#[derive(Default)] +struct App {} + +impl App { + fn handle_input(&mut self, key: KeyEvent) -> Signal { + match key.modifiers { + KeyModifiers::CONTROL => match key.code { + KeyCode::Char('c') => { + return Signal::Exit; + } + _ => {} + }, + KeyModifiers::NONE => match key.code { + KeyCode::Char('q') => { + return Signal::Exit; + } + _ => {} + }, + _ => {} + } + return Signal::None; + } + + fn draw<B: Backend>(&self, f: &mut Frame<B>) { + let chunks = Layout::default() + .direction(Direction::Vertical) + .constraints([Constraint::Percentage(100)].as_ref()) + .split(f.size()); + f.render_widget(Paragraph::new("test"), chunks[0]); + } +} + +fn main() -> io::Result<()> { + let app = App::default(); + let mut terminal = init_terminal()?; + let result = run(app, &mut terminal); + cleanup_terminal(terminal)?; + result +} + +fn init_terminal() -> Result<Terminal<CrosstermBackend<io::Stdout>>, io::Error> { + enable_raw_mode()?; + let mut stdout = io::stdout(); + execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; + let backend = CrosstermBackend::new(stdout); + Terminal::new(backend) +} + +fn cleanup_terminal<B>(mut terminal: Terminal<B>) -> Result<(), io::Error> +where + B: Backend + io::Write, +{ + disable_raw_mode()?; + execute!( + terminal.backend_mut(), + LeaveAlternateScreen, + DisableMouseCapture, + )?; + terminal.show_cursor()?; + Ok(()) +} + +fn run<B: Backend>(mut app: App, terminal: &mut Terminal<B>) -> io::Result<()> { + loop { + terminal.draw(|f| app.draw(f))?; + + if let Event::Key(key) = event::read()? { + if let Signal::Exit = app.handle_input(key) { + return Ok(()); + } + } + } } |