This repository has been archived by the owner on Aug 6, 2023. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Introduce a common event handler in order to focus on the drawing part * Remove deprecated custom termion backends
- Loading branch information
Showing
20 changed files
with
1,114 additions
and
1,168 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,84 +1,110 @@ | ||
extern crate failure; | ||
extern crate termion; | ||
extern crate tui; | ||
|
||
use std::io; | ||
use termion::event; | ||
use termion::input::TermRead; | ||
#[allow(dead_code)] | ||
mod util; | ||
|
||
use tui::backend::MouseBackend; | ||
use std::io; | ||
use termion::event::Key; | ||
use termion::input::MouseTerminal; | ||
use termion::raw::IntoRawMode; | ||
use termion::screen::AlternateScreen; | ||
use tui::backend::TermionBackend; | ||
use tui::layout::{Constraint, Direction, Layout, Rect}; | ||
use tui::style::{Color, Modifier, Style}; | ||
use tui::widgets::{Block, Borders, Widget}; | ||
use tui::Terminal; | ||
|
||
fn main() { | ||
let mut terminal = Terminal::new(MouseBackend::new().unwrap()).unwrap(); | ||
let stdin = io::stdin(); | ||
terminal.clear().unwrap(); | ||
terminal.hide_cursor().unwrap(); | ||
use util::event::{Event, Events}; | ||
|
||
let mut term_size = terminal.size().unwrap(); | ||
draw(&mut terminal, term_size).unwrap(); | ||
for c in stdin.keys() { | ||
let size = terminal.size().unwrap(); | ||
if term_size != size { | ||
terminal.resize(size).unwrap(); | ||
term_size = size; | ||
} | ||
draw(&mut terminal, term_size).unwrap(); | ||
let evt = c.unwrap(); | ||
if evt == event::Key::Char('q') { | ||
break; | ||
struct App { | ||
size: Rect, | ||
} | ||
|
||
impl Default for App { | ||
fn default() -> App { | ||
App { | ||
size: Rect::default(), | ||
} | ||
} | ||
terminal.show_cursor().unwrap(); | ||
} | ||
|
||
fn draw(t: &mut Terminal<MouseBackend>, size: Rect) -> Result<(), io::Error> { | ||
t.draw(|mut f| { | ||
// Wrapping block for a group | ||
// Just draw the block and the group on the same area and build the group | ||
// with at least a margin of 1 | ||
Block::default().borders(Borders::ALL).render(&mut f, size); | ||
let chunks = Layout::default() | ||
.direction(Direction::Vertical) | ||
.margin(4) | ||
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) | ||
.split(size); | ||
{ | ||
let chunks = Layout::default() | ||
.direction(Direction::Horizontal) | ||
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) | ||
.split(chunks[0]); | ||
Block::default() | ||
.title("With background") | ||
.title_style(Style::default().fg(Color::Yellow)) | ||
.style(Style::default().bg(Color::Green)) | ||
.render(&mut f, chunks[0]); | ||
Block::default() | ||
.title("Styled title") | ||
.title_style( | ||
Style::default() | ||
.fg(Color::White) | ||
.bg(Color::Red) | ||
.modifier(Modifier::Bold), | ||
) | ||
.render(&mut f, chunks[1]); | ||
fn main() -> Result<(), failure::Error> { | ||
// Terminal initialization | ||
let stdout = io::stdout().into_raw_mode()?; | ||
let stdout = MouseTerminal::from(stdout); | ||
let stdout = AlternateScreen::from(stdout); | ||
let backend = TermionBackend::new(stdout); | ||
let mut terminal = Terminal::new(backend)?; | ||
terminal.hide_cursor()?; | ||
|
||
// Create default app state | ||
let mut app = App::default(); | ||
|
||
// Setup event handlers | ||
let events = Events::new(); | ||
|
||
loop { | ||
let size = terminal.size()?; | ||
if app.size != size { | ||
terminal.resize(size)?; | ||
app.size = size; | ||
} | ||
{ | ||
|
||
terminal.draw(|mut f| { | ||
// Wrapping block for a group | ||
// Just draw the block and the group on the same area and build the group | ||
// with at least a margin of 1 | ||
Block::default().borders(Borders::ALL).render(&mut f, size); | ||
let chunks = Layout::default() | ||
.direction(Direction::Horizontal) | ||
.direction(Direction::Vertical) | ||
.margin(4) | ||
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) | ||
.split(chunks[1]); | ||
Block::default() | ||
.title("With borders") | ||
.borders(Borders::ALL) | ||
.render(&mut f, chunks[0]); | ||
Block::default() | ||
.title("With styled borders") | ||
.border_style(Style::default().fg(Color::Cyan)) | ||
.borders(Borders::LEFT | Borders::RIGHT) | ||
.render(&mut f, chunks[1]); | ||
.split(app.size); | ||
{ | ||
let chunks = Layout::default() | ||
.direction(Direction::Horizontal) | ||
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) | ||
.split(chunks[0]); | ||
Block::default() | ||
.title("With background") | ||
.title_style(Style::default().fg(Color::Yellow)) | ||
.style(Style::default().bg(Color::Green)) | ||
.render(&mut f, chunks[0]); | ||
Block::default() | ||
.title("Styled title") | ||
.title_style( | ||
Style::default() | ||
.fg(Color::White) | ||
.bg(Color::Red) | ||
.modifier(Modifier::Bold), | ||
).render(&mut f, chunks[1]); | ||
} | ||
{ | ||
let chunks = Layout::default() | ||
.direction(Direction::Horizontal) | ||
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) | ||
.split(chunks[1]); | ||
Block::default() | ||
.title("With borders") | ||
.borders(Borders::ALL) | ||
.render(&mut f, chunks[0]); | ||
Block::default() | ||
.title("With styled borders") | ||
.border_style(Style::default().fg(Color::Cyan)) | ||
.borders(Borders::LEFT | Borders::RIGHT) | ||
.render(&mut f, chunks[1]); | ||
} | ||
})?; | ||
|
||
match events.next()? { | ||
Event::Input(key) => if key == Key::Char('q') { | ||
break; | ||
}, | ||
_ => {} | ||
} | ||
}) | ||
} | ||
terminal.show_cursor()?; | ||
Ok(()) | ||
} |
Oops, something went wrong.