mirror of
https://github.com/ratatui/ratatui.git
synced 2025-09-30 06:21:31 +00:00
parent
a38066d2d1
commit
819e92cd44
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -3694,6 +3694,16 @@ version = "0.2.97"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49"
|
checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "weather"
|
||||||
|
version = "0.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"color-eyre",
|
||||||
|
"crossterm",
|
||||||
|
"rand 0.8.5",
|
||||||
|
"ratatui",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "web-sys"
|
name = "web-sys"
|
||||||
version = "0.3.74"
|
version = "0.3.74"
|
||||||
|
@ -56,3 +56,7 @@ Shows how to handle mouse events. [Source](./apps/mouse-drawing/).
|
|||||||
## Async GitHub demo
|
## Async GitHub demo
|
||||||
|
|
||||||
Shows how to fetch data from GitHub API asynchronously. [Source](./apps/async-github/).
|
Shows how to fetch data from GitHub API asynchronously. [Source](./apps/async-github/).
|
||||||
|
|
||||||
|
## Weather demo
|
||||||
|
|
||||||
|
Shows how to render weather data using barchart widget. [Source](./apps/weather/).
|
||||||
|
15
examples/apps/weather/Cargo.toml
Normal file
15
examples/apps/weather/Cargo.toml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[package]
|
||||||
|
name = "weather"
|
||||||
|
publish = false
|
||||||
|
license.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
rust-version.workspace = true
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
color-eyre.workspace = true
|
||||||
|
crossterm.workspace = true
|
||||||
|
rand = "0.8.5"
|
||||||
|
ratatui.workspace = true
|
||||||
|
|
||||||
|
[lints]
|
||||||
|
workspace = true
|
9
examples/apps/weather/README.md
Normal file
9
examples/apps/weather/README.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Weather demo
|
||||||
|
|
||||||
|
This example shows how to render weather data using barchart widget.
|
||||||
|
|
||||||
|
To run this demo:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cargo run -p weather
|
||||||
|
```
|
@ -1,26 +1,21 @@
|
|||||||
//! # [Ratatui] `BarChart` example
|
//! A Ratatui example that demonstrates how to render weather data using [`BarChart`] widget.
|
||||||
//!
|
//!
|
||||||
//! The latest version of this example is available in the [examples] folder in the repository.
|
//! Generates random temperature data for each hour of the day and renders it as a vertical bar.
|
||||||
//!
|
//!
|
||||||
//! Please note that the examples are designed to be run against the `main` branch of the Github
|
//! This example runs with the Ratatui library code in the branch that you are currently reading.
|
||||||
//! repository. This means that you may not be able to compile with the latest release version on
|
//! See the [`latest`] branch for the code which works with the most recent Ratatui release.
|
||||||
//! 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
|
//! [`latest`]: https://github.com/ratatui/ratatui/tree/latest
|
||||||
//! library you are using.
|
//! [`BarChart`]: https://docs.rs/ratatui/latest/ratatui/widgets/struct.BarChart.html
|
||||||
//!
|
|
||||||
//! [Ratatui]: https://github.com/ratatui/ratatui
|
|
||||||
//! [examples]: https://github.com/ratatui/ratatui/blob/main/examples
|
|
||||||
//! [examples readme]: https://github.com/ratatui/ratatui/blob/main/examples/README.md
|
|
||||||
|
|
||||||
use color_eyre::Result;
|
use color_eyre::Result;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
crossterm::event::{self, Event, KeyCode, KeyEventKind},
|
crossterm::event::{self, Event, KeyCode, KeyEventKind},
|
||||||
layout::{Constraint, Direction, Layout},
|
layout::{Constraint, Layout},
|
||||||
style::{Color, Style, Stylize},
|
style::{Color, Style, Stylize},
|
||||||
text::Line,
|
text::Line,
|
||||||
widgets::{Bar, BarChart, BarGroup, Block},
|
widgets::{Bar, BarChart, BarGroup},
|
||||||
DefaultTerminal, Frame,
|
DefaultTerminal, Frame,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -65,17 +60,12 @@ impl App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn draw(&self, frame: &mut Frame) {
|
fn draw(&self, frame: &mut Frame) {
|
||||||
let [title, vertical, horizontal] = Layout::vertical([
|
let [title, main] = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)])
|
||||||
Constraint::Length(1),
|
.spacing(1)
|
||||||
Constraint::Fill(1),
|
.areas(frame.area());
|
||||||
Constraint::Fill(1),
|
|
||||||
])
|
|
||||||
.spacing(1)
|
|
||||||
.areas(frame.area());
|
|
||||||
|
|
||||||
frame.render_widget("Barchart".bold().into_centered_line(), title);
|
frame.render_widget("Weather demo".bold().into_centered_line(), title);
|
||||||
frame.render_widget(vertical_barchart(&self.temperatures), vertical);
|
frame.render_widget(vertical_barchart(&self.temperatures), main);
|
||||||
frame.render_widget(horizontal_barchart(&self.temperatures), horizontal);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,10 +76,8 @@ fn vertical_barchart(temperatures: &[u8]) -> BarChart {
|
|||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(hour, value)| vertical_bar(hour, value))
|
.map(|(hour, value)| vertical_bar(hour, value))
|
||||||
.collect();
|
.collect();
|
||||||
let title = Line::from("Weather (Vertical)").centered();
|
|
||||||
BarChart::default()
|
BarChart::default()
|
||||||
.data(BarGroup::default().bars(&bars))
|
.data(BarGroup::default().bars(&bars))
|
||||||
.block(Block::new().title(title))
|
|
||||||
.bar_width(5)
|
.bar_width(5)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,32 +90,6 @@ fn vertical_bar(hour: usize, temperature: &u8) -> Bar {
|
|||||||
.value_style(temperature_style(*temperature).reversed())
|
.value_style(temperature_style(*temperature).reversed())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a horizontal bar chart from the temperatures data.
|
|
||||||
fn horizontal_barchart(temperatures: &[u8]) -> BarChart {
|
|
||||||
let bars: Vec<Bar> = temperatures
|
|
||||||
.iter()
|
|
||||||
.enumerate()
|
|
||||||
.map(|(hour, value)| horizontal_bar(hour, value))
|
|
||||||
.collect();
|
|
||||||
let title = Line::from("Weather (Horizontal)").centered();
|
|
||||||
BarChart::default()
|
|
||||||
.block(Block::new().title(title))
|
|
||||||
.data(BarGroup::default().bars(&bars))
|
|
||||||
.bar_width(1)
|
|
||||||
.bar_gap(0)
|
|
||||||
.direction(Direction::Horizontal)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn horizontal_bar(hour: usize, temperature: &u8) -> Bar {
|
|
||||||
let style = temperature_style(*temperature);
|
|
||||||
Bar::default()
|
|
||||||
.value(u64::from(*temperature))
|
|
||||||
.label(Line::from(format!("{hour:>02}:00")))
|
|
||||||
.text_value(format!("{temperature:>3}°"))
|
|
||||||
.style(style)
|
|
||||||
.value_style(style.reversed())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// create a yellow to red value based on the value (50-90)
|
/// create a yellow to red value based on the value (50-90)
|
||||||
fn temperature_style(value: u8) -> Style {
|
fn temperature_style(value: u8) -> Style {
|
||||||
let green = (255.0 * (1.0 - f64::from(value - 50) / 40.0)) as u8;
|
let green = (255.0 * (1.0 - f64::from(value - 50) / 40.0)) as u8;
|
@ -142,11 +142,6 @@ bench = false
|
|||||||
name = "main"
|
name = "main"
|
||||||
harness = false
|
harness = false
|
||||||
|
|
||||||
[[example]]
|
|
||||||
name = "barchart"
|
|
||||||
required-features = ["crossterm"]
|
|
||||||
doc-scrape-examples = true
|
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "barchart-grouped"
|
name = "barchart-grouped"
|
||||||
required-features = ["crossterm"]
|
required-features = ["crossterm"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user