From 91147c4d75bee207052b06a7dca4b610df321de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Orhun=20Parmaks=C4=B1z?= Date: Sun, 1 Dec 2024 20:34:57 +0300 Subject: [PATCH] docs(widgets): add example for chart (#1536) stonks --- ratatui-widgets/examples/chart.rs | 90 +++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 ratatui-widgets/examples/chart.rs diff --git a/ratatui-widgets/examples/chart.rs b/ratatui-widgets/examples/chart.rs new file mode 100644 index 00000000..5b824e72 --- /dev/null +++ b/ratatui-widgets/examples/chart.rs @@ -0,0 +1,90 @@ +//! # [Ratatui] `Chart` example +//! +//! The latest version of this example is available in the [widget examples] folder in the +//! repository. +//! +//! Please note that the examples are designed to be run against the `main` branch of the Github +//! repository. This means that you may not be able to compile with the latest release version on +//! crates.io, or the one that you have installed locally. +//! +//! See the [examples readme] for more information on finding examples that match the version of the +//! library you are using. +//! +//! [Ratatui]: https://github.com/ratatui/ratatui +//! [widget examples]: https://github.com/ratatui/ratatui/blob/main/ratatui-widgets/examples +//! [examples readme]: https://github.com/ratatui/ratatui/blob/main/examples/README.md + +use color_eyre::Result; +use ratatui::{ + crossterm::event::{self, Event}, + layout::{Constraint, Layout, Rect}, + style::{Color, Stylize}, + symbols::Marker, + text::{Line, Span}, + widgets::{Axis, Chart, Dataset, GraphType}, + DefaultTerminal, Frame, +}; + +fn main() -> Result<()> { + color_eyre::install()?; + let terminal = ratatui::init(); + let result = run(terminal); + ratatui::restore(); + result +} + +/// Run the application. +fn run(mut terminal: DefaultTerminal) -> Result<()> { + loop { + terminal.draw(draw)?; + if matches!(event::read()?, Event::Key(_)) { + break Ok(()); + } + } +} + +/// Draw the UI with a chart. +fn draw(frame: &mut Frame) { + let vertical = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]).spacing(1); + let [top, main] = vertical.areas(frame.area()); + + let title = Line::from_iter([ + Span::from("Chart Widget").bold(), + Span::from(" (Press 'q' to quit)"), + ]); + frame.render_widget(title.centered(), top); + + render_chart(frame, main); +} + +/// Render a chart going upward. +pub fn render_chart(frame: &mut Frame, area: Rect) { + let dataset = Dataset::default() + .name("Stonks") + .marker(Marker::Braille) + .graph_type(GraphType::Line) + .style(Color::Blue) + .data(&[ + (0.0, 1.0), + (1.5, 2.5), + (3.0, 2.0), + (4.5, 4.5), + (6.0, 4.0), + (7.5, 6.5), + (9.0, 7.5), + (10.0, 10.0), + ]); + + let x_axis = Axis::default() + .title("Hustle".blue()) + .bounds([0.0, 10.0]) + .labels(["0%", "50%", "100%"]); + + let y_axis = Axis::default() + .title("Profit".blue()) + .bounds([0.0, 10.0]) + .labels(["0", "5", "10"]); + + let chart = Chart::new(vec![dataset]).x_axis(x_axis).y_axis(y_axis); + frame.render_widget(chart, area); +}