diff options
| author | Vladislav Stepanov <8uk.8ak@gmail.com> | 2023-04-14 23:18:58 +0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-14 20:18:58 +0100 |
| commit | c05d2850420a2c163b8f62c33a6cef7c0ae1ad8d (patch) | |
| tree | 2c44a44eda7e76fa74e78ac1fd02f55c1ed4d804 /src/ratatui/widgets/barchart.rs | |
| parent | Switch to uuidv7 (#864) (diff) | |
| download | atuin-c05d2850420a2c163b8f62c33a6cef7c0ae1ad8d.zip | |
Workspace reorder (#868)
* Try different workspace structure
Move main crate (atuin) to be on the same level with other crates in
this workspace
* extract common dependencies to the workspace definition
* fix base64 v0.21 deprecation warning
* questionable: update deps & fix chrono deprecations
possible panic sites are unchanged, they're just more visible now
* Revert "questionable: update deps & fix chrono deprecations"
This reverts commit 993e60f8dea81a1625a04285a617959ad09a0866.
Diffstat (limited to 'src/ratatui/widgets/barchart.rs')
| -rw-r--r-- | src/ratatui/widgets/barchart.rs | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/src/ratatui/widgets/barchart.rs b/src/ratatui/widgets/barchart.rs deleted file mode 100644 index 13f386a4..00000000 --- a/src/ratatui/widgets/barchart.rs +++ /dev/null @@ -1,219 +0,0 @@ -use crate::ratatui::{ - buffer::Buffer, - layout::Rect, - style::Style, - symbols, - widgets::{Block, Widget}, -}; -use std::cmp::min; -use unicode_width::UnicodeWidthStr; - -/// Display multiple bars in a single widgets -/// -/// # Examples -/// -/// ``` -/// # use ratatui::widgets::{Block, Borders, BarChart}; -/// # use ratatui::style::{Style, Color, Modifier}; -/// BarChart::default() -/// .block(Block::default().title("BarChart").borders(Borders::ALL)) -/// .bar_width(3) -/// .bar_gap(1) -/// .bar_style(Style::default().fg(Color::Yellow).bg(Color::Red)) -/// .value_style(Style::default().fg(Color::Red).add_modifier(Modifier::BOLD)) -/// .label_style(Style::default().fg(Color::White)) -/// .data(&[("B0", 0), ("B1", 2), ("B2", 4), ("B3", 3)]) -/// .max(4); -/// ``` -#[derive(Debug, Clone)] -pub struct BarChart<'a> { - /// Block to wrap the widget in - block: Option<Block<'a>>, - /// The width of each bar - bar_width: u16, - /// The gap between each bar - bar_gap: u16, - /// Set of symbols used to display the data - bar_set: symbols::bar::Set, - /// Style of the bars - bar_style: Style, - /// Style of the values printed at the bottom of each bar - value_style: Style, - /// Style of the labels printed under each bar - label_style: Style, - /// Style for the widget - style: Style, - /// Slice of (label, value) pair to plot on the chart - data: &'a [(&'a str, u64)], - /// Value necessary for a bar to reach the maximum height (if no value is specified, - /// the maximum value in the data is taken as reference) - max: Option<u64>, - /// Values to display on the bar (computed when the data is passed to the widget) - values: Vec<String>, -} - -impl<'a> Default for BarChart<'a> { - fn default() -> BarChart<'a> { - BarChart { - block: None, - max: None, - data: &[], - values: Vec::new(), - bar_style: Style::default(), - bar_width: 1, - bar_gap: 1, - bar_set: symbols::bar::NINE_LEVELS, - value_style: Default::default(), - label_style: Default::default(), - style: Default::default(), - } - } -} - -impl<'a> BarChart<'a> { - pub fn data(mut self, data: &'a [(&'a str, u64)]) -> BarChart<'a> { - self.data = data; - self.values = Vec::with_capacity(self.data.len()); - for &(_, v) in self.data { - self.values.push(format!("{}", v)); - } - self - } - - pub fn block(mut self, block: Block<'a>) -> BarChart<'a> { - self.block = Some(block); - self - } - - pub fn max(mut self, max: u64) -> BarChart<'a> { - self.max = Some(max); - self - } - - pub fn bar_style(mut self, style: Style) -> BarChart<'a> { - self.bar_style = style; - self - } - - pub fn bar_width(mut self, width: u16) -> BarChart<'a> { - self.bar_width = width; - self - } - - pub fn bar_gap(mut self, gap: u16) -> BarChart<'a> { - self.bar_gap = gap; - self - } - - pub fn bar_set(mut self, bar_set: symbols::bar::Set) -> BarChart<'a> { - self.bar_set = bar_set; - self - } - - pub fn value_style(mut self, style: Style) -> BarChart<'a> { - self.value_style = style; - self - } - - pub fn label_style(mut self, style: Style) -> BarChart<'a> { - self.label_style = style; - self - } - - pub fn style(mut self, style: Style) -> BarChart<'a> { - self.style = style; - self - } -} - -impl<'a> Widget for BarChart<'a> { - fn render(mut self, area: Rect, buf: &mut Buffer) { - buf.set_style(area, self.style); - - let chart_area = match self.block.take() { - Some(b) => { - let inner_area = b.inner(area); - b.render(area, buf); - inner_area - } - None => area, - }; - - if chart_area.height < 2 { - return; - } - - let max = self - .max - .unwrap_or_else(|| self.data.iter().map(|t| t.1).max().unwrap_or_default()); - let max_index = min( - (chart_area.width / (self.bar_width + self.bar_gap)) as usize, - self.data.len(), - ); - let mut data = self - .data - .iter() - .take(max_index) - .map(|&(l, v)| { - ( - l, - v * u64::from(chart_area.height - 1) * 8 / std::cmp::max(max, 1), - ) - }) - .collect::<Vec<(&str, u64)>>(); - for j in (0..chart_area.height - 1).rev() { - for (i, d) in data.iter_mut().enumerate() { - let symbol = match d.1 { - 0 => self.bar_set.empty, - 1 => self.bar_set.one_eighth, - 2 => self.bar_set.one_quarter, - 3 => self.bar_set.three_eighths, - 4 => self.bar_set.half, - 5 => self.bar_set.five_eighths, - 6 => self.bar_set.three_quarters, - 7 => self.bar_set.seven_eighths, - _ => self.bar_set.full, - }; - - for x in 0..self.bar_width { - buf.get_mut( - chart_area.left() + i as u16 * (self.bar_width + self.bar_gap) + x, - chart_area.top() + j, - ) - .set_symbol(symbol) - .set_style(self.bar_style); - } - - if d.1 > 8 { - d.1 -= 8; - } else { - d.1 = 0; - } - } - } - - for (i, &(label, value)) in self.data.iter().take(max_index).enumerate() { - if value != 0 { - let value_label = &self.values[i]; - let width = value_label.width() as u16; - if width < self.bar_width { - buf.set_string( - chart_area.left() - + i as u16 * (self.bar_width + self.bar_gap) - + (self.bar_width - width) / 2, - chart_area.bottom() - 2, - value_label, - self.value_style, - ); - } - } - buf.set_stringn( - chart_area.left() + i as u16 * (self.bar_width + self.bar_gap), - chart_area.bottom() - 1, - label, - self.bar_width as usize, - self.label_style, - ); - } - } -} |
