mirror of
https://github.com/ratatui-org/ratatui
synced 2024-11-10 15:14:27 +00:00
94877f4e7e
This allows table column widths to be adapted more and scale with the UI. The constraints are solved using the Cassowary solver. An added constraint for fitting them all in the width is added.
106 lines
3.1 KiB
Rust
106 lines
3.1 KiB
Rust
#[allow(dead_code)]
|
|
mod util;
|
|
|
|
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, Layout};
|
|
use tui::style::{Color, Modifier, Style};
|
|
use tui::widgets::{Block, Borders, Row, Table, Widget};
|
|
use tui::Terminal;
|
|
|
|
use crate::util::event::{Event, Events};
|
|
|
|
struct App<'a> {
|
|
items: Vec<Vec<&'a str>>,
|
|
selected: usize,
|
|
}
|
|
|
|
impl<'a> App<'a> {
|
|
fn new() -> App<'a> {
|
|
App {
|
|
items: vec![
|
|
vec!["Row11", "Row12", "Row13"],
|
|
vec!["Row21", "Row22", "Row23"],
|
|
vec!["Row31", "Row32", "Row33"],
|
|
vec!["Row41", "Row42", "Row43"],
|
|
vec!["Row51", "Row52", "Row53"],
|
|
vec!["Row61", "Row62", "Row63"],
|
|
],
|
|
selected: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
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()?;
|
|
|
|
let events = Events::new();
|
|
|
|
// App
|
|
let mut app = App::new();
|
|
|
|
// Input
|
|
loop {
|
|
terminal.draw(|mut f| {
|
|
let selected_style = Style::default().fg(Color::Yellow).modifier(Modifier::BOLD);
|
|
let normal_style = Style::default().fg(Color::White);
|
|
let header = ["Header1", "Header2", "Header3"];
|
|
let rows = app.items.iter().enumerate().map(|(i, item)| {
|
|
if i == app.selected {
|
|
Row::StyledData(item.into_iter(), selected_style)
|
|
} else {
|
|
Row::StyledData(item.into_iter(), normal_style)
|
|
}
|
|
});
|
|
|
|
let rects = Layout::default()
|
|
.constraints([Constraint::Percentage(100)].as_ref())
|
|
.margin(5)
|
|
.split(f.size());
|
|
Table::new(header.into_iter(), rows)
|
|
.block(Block::default().borders(Borders::ALL).title("Table"))
|
|
.widths(&[
|
|
Constraint::Percentage(50),
|
|
Constraint::Length(30),
|
|
Constraint::Max(10),
|
|
])
|
|
.render(&mut f, rects[0]);
|
|
})?;
|
|
|
|
match events.next()? {
|
|
Event::Input(key) => match key {
|
|
Key::Char('q') => {
|
|
break;
|
|
}
|
|
Key::Down => {
|
|
app.selected += 1;
|
|
if app.selected > app.items.len() - 1 {
|
|
app.selected = 0;
|
|
}
|
|
}
|
|
Key::Up => {
|
|
if app.selected > 0 {
|
|
app.selected -= 1;
|
|
} else {
|
|
app.selected = app.items.len() - 1;
|
|
}
|
|
}
|
|
_ => {}
|
|
},
|
|
_ => {}
|
|
};
|
|
}
|
|
|
|
Ok(())
|
|
}
|