ratatui/examples/chart.rs

132 lines
3.9 KiB
Rust
Raw Normal View History

extern crate failure;
2016-11-07 23:35:46 +00:00
extern crate termion;
2017-10-30 21:28:37 +00:00
extern crate tui;
2016-11-07 23:35:46 +00:00
#[allow(dead_code)]
2016-11-07 23:35:46 +00:00
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;
2017-10-30 21:28:37 +00:00
use tui::style::{Color, Modifier, Style};
2018-05-06 10:59:24 +00:00
use tui::widgets::{Axis, Block, Borders, Chart, Dataset, Marker, Widget};
2018-06-09 09:02:37 +00:00
use tui::Terminal;
2016-11-07 23:35:46 +00:00
use util::event::{Event, Events};
use util::SinSignal;
2016-11-07 23:35:46 +00:00
struct App {
signal1: SinSignal,
data1: Vec<(f64, f64)>,
signal2: SinSignal,
data2: Vec<(f64, f64)>,
window: [f64; 2],
}
impl App {
fn new() -> App {
let mut signal1 = SinSignal::new(0.2, 3.0, 18.0);
let mut signal2 = SinSignal::new(0.1, 2.0, 10.0);
let data1 = signal1.by_ref().take(200).collect::<Vec<(f64, f64)>>();
let data2 = signal2.by_ref().take(200).collect::<Vec<(f64, f64)>>();
App {
2018-08-12 22:27:56 +00:00
signal1,
data1,
signal2,
data2,
2016-11-07 23:35:46 +00:00
window: [0.0, 20.0],
}
}
fn update(&mut self) {
2016-11-07 23:35:46 +00:00
for _ in 0..5 {
self.data1.remove(0);
}
self.data1.extend(self.signal1.by_ref().take(5));
for _ in 0..10 {
self.data2.remove(0);
}
self.data2.extend(self.signal2.by_ref().take(10));
self.window[0] += 1.0;
self.window[1] += 1.0;
}
}
fn main() -> Result<(), failure::Error> {
2016-11-07 23:35:46 +00:00
// 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()?;
2016-11-07 23:35:46 +00:00
let events = Events::new();
2016-11-07 23:35:46 +00:00
// App
let mut app = App::new();
loop {
terminal.draw(|mut f| {
let size = f.size();
Chart::default()
.block(
Block::default()
.title("Chart")
.title_style(Style::default().fg(Color::Cyan).modifier(Modifier::Bold))
.borders(Borders::ALL),
)
.x_axis(
Axis::default()
.title("X Axis")
.style(Style::default().fg(Color::Gray))
.labels_style(Style::default().modifier(Modifier::Italic))
.bounds(app.window)
.labels(&[
&format!("{}", app.window[0]),
&format!("{}", (app.window[0] + app.window[1]) / 2.0),
&format!("{}", app.window[1]),
]),
)
.y_axis(
Axis::default()
.title("Y Axis")
.style(Style::default().fg(Color::Gray))
.labels_style(Style::default().modifier(Modifier::Italic))
.bounds([-20.0, 20.0])
.labels(&["-20", "0", "20"]),
)
.datasets(&[
Dataset::default()
.name("data2")
.marker(Marker::Dot)
.style(Style::default().fg(Color::Cyan))
.data(&app.data1),
Dataset::default()
.name("data3")
.marker(Marker::Braille)
.style(Style::default().fg(Color::Yellow))
.data(&app.data2),
])
.render(&mut f, size);
})?;
match events.next()? {
Event::Input(input) => {
if input == Key::Char('q') {
break;
}
}
2016-11-07 23:35:46 +00:00
Event::Tick => {
app.update();
2016-11-07 23:35:46 +00:00
}
}
}
Ok(())
2016-11-07 23:35:46 +00:00
}