From f025cb0221bdc8fe14287ad1cea5139d7d3b9a2f Mon Sep 17 00:00:00 2001 From: Florian Dehau Date: Tue, 8 Nov 2016 10:19:28 +0100 Subject: [PATCH] Update README and examples --- Makefile | 2 + README.md | 1 - examples/table.rs | 109 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 examples/table.rs diff --git a/Makefile b/Makefile index 2cacb3b6..bd5a7af1 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ test: cargo test doc: cargo doc +clippy: + rustup run nightly cargo clippy watch: watchman-make -p 'src/**/*.rs' -t build -p 'test/**/*.rs' -t test diff --git a/README.md b/README.md index c0dba8b0..abf2d212 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,6 @@ fn draw(t: &mut Terminal) { /// of the closure .render(t, &size, |t, chunks| { /// Continue to describe your UI there. - /// Examples: Block::default() .title("Block") .borders(border::ALL) diff --git a/examples/table.rs b/examples/table.rs new file mode 100644 index 00000000..568c633a --- /dev/null +++ b/examples/table.rs @@ -0,0 +1,109 @@ +extern crate tui; +extern crate termion; + +use std::io; + +use termion::event; +use termion::input::TermRead; + +use tui::{Terminal, TermionBackend}; +use tui::widgets::{Widget, Block, border, Table}; +use tui::layout::{Group, Direction, Size}; +use tui::style::{Style, Color, Modifier}; + +struct App<'a> { + items: Vec>, + selected: usize, +} + +impl<'a> App<'a> { + fn new() -> App<'a> { + App { + items: vec![vec!["Row12", "Row12", "Row13"], + vec!["Row21", "Row22", "Row23"], + vec!["Row31", "Row32", "Row33"], + vec!["Row41", "Row42", "Row43"], + vec!["Row41", "Row42", "Row43"], + vec!["Row41", "Row42", "Row43"]], + selected: 0, + } + } +} + +fn main() { + // Terminal initialization + let backend = TermionBackend::new().unwrap(); + let mut terminal = Terminal::new(backend).unwrap(); + + + // App + let mut app = App::new(); + + // First draw call + terminal.clear().unwrap(); + terminal.hide_cursor().unwrap(); + draw(&mut terminal, &app); + + // Input + let stdin = io::stdin(); + for c in stdin.keys() { + let evt = c.unwrap(); + match evt { + event::Key::Char('q') => { + break; + } + event::Key::Down => { + app.selected += 1; + if app.selected > app.items.len() - 1 { + app.selected = 0; + } + } + event::Key::Up => { + if app.selected > 0 { + app.selected -= 1; + } else { + app.selected = app.items.len() - 1; + } + } + _ => {} + }; + draw(&mut terminal, &app); + } + + terminal.show_cursor().unwrap(); +} + +fn draw(t: &mut Terminal, app: &App) { + + let size = t.size().unwrap(); + + Group::default() + .direction(Direction::Horizontal) + .sizes(&[Size::Percent(100)]) + .margin(5) + .render(t, &size, |t, chunks| { + let selected_style = Style::default().fg(Color::Yellow).modifier(Modifier::Bold); + let normal_style = Style::default().fg(Color::White); + Table::default() + .block(Block::default() + .borders(border::ALL) + .title("Table")) + .header(&["Header1", "Header2", "Header3"]) + .widths(&[10, 10, 10]) + .rows(&app.items + .iter() + .enumerate() + .map(|(i, item)| { + (item, + if i == app.selected { + &selected_style + } else { + &normal_style + }) + }) + .collect::, &Style)>>()) + .render(t, &chunks[0]); + }); + + t.draw().unwrap(); +}