diff --git a/Cargo.lock b/Cargo.lock index 339ea4f6..8e4888e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -906,9 +906,9 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcc0d032bccba900ee32151ec0265667535c230169f5a011154cdcd984e16829" +checksum = "ce841e0486e7c2412c3740168ede33adeba8e154a15107b879d8162d77c7174e" dependencies = [ "bitflags", "cassowary", diff --git a/Cargo.toml b/Cargo.toml index 86b8778d..2ae3efae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -101,7 +101,7 @@ sysinfo = "=0.29.0" thiserror = "1.0.40" time = { version = "0.3.21", features = ["formatting", "macros"] } toml_edit = { version = "0.19.10", features = ["serde"] } -tui = { version = "0.20.1", package = "ratatui" } +tui = { version = "0.21.0", package = "ratatui" } typed-builder = "0.14.0" unicode-segmentation = "1.10.1" unicode-width = "0.1.10" diff --git a/src/canvas.rs b/src/canvas.rs index 26d9e7e4..efc7383d 100644 --- a/src/canvas.rs +++ b/src/canvas.rs @@ -5,7 +5,7 @@ use itertools::izip; use tui::{ backend::Backend, layout::{Constraint, Direction, Layout, Rect}, - text::{Span, Spans}, + text::{Line, Span}, widgets::Paragraph, Frame, Terminal, }; @@ -62,7 +62,7 @@ pub struct Painter { pub colours: CanvasStyling, height: u16, width: u16, - styled_help_text: Vec>, + styled_help_text: Vec>, is_mac_os: bool, // TODO: This feels out of place... // TODO: Redo this entire thing. @@ -212,7 +212,7 @@ impl Painter { } }); - self.styled_help_text = styled_help_spans.into_iter().map(Spans::from).collect(); + self.styled_help_text = styled_help_spans.into_iter().map(Line::from).collect(); } fn draw_frozen_indicator(&self, f: &mut Frame<'_, B>, draw_loc: Rect) { diff --git a/src/canvas/dialogs/dd_dialog.rs b/src/canvas/dialogs/dd_dialog.rs index 63f19fc1..2ad5cf3e 100644 --- a/src/canvas/dialogs/dd_dialog.rs +++ b/src/canvas/dialogs/dd_dialog.rs @@ -5,7 +5,7 @@ use tui::{ backend::Backend, layout::{Alignment, Constraint, Direction, Layout, Rect}, terminal::Frame, - text::{Span, Spans, Text}, + text::{Line, Span, Text}, widgets::{Block, Borders, Paragraph, Wrap}, }; @@ -22,15 +22,15 @@ impl Painter { pub fn get_dd_spans(&self, app_state: &App) -> Option> { if let Some(dd_err) = &app_state.dd_err { return Some(Text::from(vec![ - Spans::default(), - Spans::from("Failed to kill process."), - Spans::from(dd_err.clone()), - Spans::from("Please press ENTER or ESC to close this dialog."), + Line::default(), + Line::from("Failed to kill process."), + Line::from(dd_err.clone()), + Line::from("Please press ENTER or ESC to close this dialog."), ])); } else if let Some(to_kill_processes) = app_state.get_to_delete_processes() { if let Some(first_pid) = to_kill_processes.1.first() { return Some(Text::from(vec![ - Spans::from(""), + Line::from(""), if app_state .states .proc_state @@ -40,19 +40,19 @@ impl Painter { .unwrap_or(false) { if to_kill_processes.1.len() != 1 { - Spans::from(format!( + Line::from(format!( "Kill {} processes with the name \"{}\"? Press ENTER to confirm.", to_kill_processes.1.len(), to_kill_processes.0 )) } else { - Spans::from(format!( + Line::from(format!( "Kill 1 process with the name \"{}\"? Press ENTER to confirm.", to_kill_processes.0 )) } } else { - Spans::from(format!( + Line::from(format!( "Kill process \"{}\" with PID {}? Press ENTER to confirm.", to_kill_processes.0, first_pid )) @@ -358,7 +358,7 @@ impl Painter { ) -> bool { if let Some(dd_text) = dd_text { let dd_title = if app_state.dd_err.is_some() { - Spans::from(vec![ + Line::from(vec![ Span::styled(" Error ", self.colours.widget_title_style), Span::styled( format!( @@ -372,7 +372,7 @@ impl Painter { ), ]) } else { - Spans::from(vec![ + Line::from(vec![ Span::styled(" Confirm Kill Process ", self.colours.widget_title_style), Span::styled( format!( diff --git a/src/canvas/dialogs/help_dialog.rs b/src/canvas/dialogs/help_dialog.rs index 66741223..061405d0 100644 --- a/src/canvas/dialogs/help_dialog.rs +++ b/src/canvas/dialogs/help_dialog.rs @@ -4,8 +4,8 @@ use tui::{ backend::Backend, layout::{Alignment, Rect}, terminal::Frame, + text::Line, text::Span, - text::Spans, widgets::{Block, Borders, Paragraph, Wrap}, }; use unicode_width::UnicodeWidthStr; @@ -19,7 +19,7 @@ impl Painter { pub fn draw_help_dialog( &self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect, ) { - let help_title = Spans::from(vec![ + let help_title = Line::from(vec![ Span::styled(" Help ", self.colours.widget_title_style), Span::styled( format!( diff --git a/src/canvas/widgets/basic_table_arrows.rs b/src/canvas/widgets/basic_table_arrows.rs index 85f37e89..029a6e12 100644 --- a/src/canvas/widgets/basic_table_arrows.rs +++ b/src/canvas/widgets/basic_table_arrows.rs @@ -2,8 +2,8 @@ use tui::{ backend::Backend, layout::{Alignment, Constraint, Direction, Layout, Rect}, terminal::Frame, + text::Line, text::Span, - text::Spans, widgets::{Block, Paragraph}, }; @@ -93,16 +93,16 @@ impl Painter { usize::from(draw_loc.width).saturating_sub(6 + left_name.len() + right_name.len()); let left_arrow_text = vec![ - Spans::default(), - Spans::from(Span::styled( + Line::default(), + Line::from(Span::styled( format!("◄ {}", left_name), self.colours.text_style, )), ]; let right_arrow_text = vec![ - Spans::default(), - Spans::from(Span::styled( + Line::default(), + Line::from(Span::styled( format!("{} ►", right_name), self.colours.text_style, )), diff --git a/src/canvas/widgets/battery_display.rs b/src/canvas/widgets/battery_display.rs index 635eebc5..6c175d39 100644 --- a/src/canvas/widgets/battery_display.rs +++ b/src/canvas/widgets/battery_display.rs @@ -2,7 +2,7 @@ use tui::{ backend::Backend, layout::{Constraint, Direction, Layout, Rect}, terminal::Frame, - text::{Span, Spans}, + text::{Line, Span}, widgets::{Block, Borders, Cell, Paragraph, Row, Table, Tabs}, }; use unicode_segmentation::UnicodeSegmentation; @@ -40,7 +40,7 @@ impl Painter { let title = if app_state.is_expanded { const TITLE_BASE: &str = " Battery ── Esc to go back "; - Spans::from(vec![ + Line::from(vec![ Span::styled(" Battery ", self.colours.widget_title_style), Span::styled( format!( @@ -53,7 +53,7 @@ impl Painter { ), ]) } else { - Spans::from(Span::styled(" Battery ", self.colours.widget_title_style)) + Line::from(Span::styled(" Battery ", self.colours.widget_title_style)) }; let battery_block = if draw_border { @@ -89,7 +89,7 @@ impl Painter { Tabs::new( battery_names .iter() - .map(|name| Spans::from((*name).clone())) + .map(|name| Line::from((*name).clone())) .collect::>(), ) .block(Block::default()) @@ -227,9 +227,9 @@ impl Painter { margined_draw_loc, ); } else { - let mut contents = vec![Spans::default(); table_gap.into()]; + let mut contents = vec![Line::default(); table_gap.into()]; - contents.push(Spans::from(Span::styled( + contents.push(Line::from(Span::styled( "No data found for this battery", self.colours.text_style, ))); diff --git a/src/canvas/widgets/network_basic.rs b/src/canvas/widgets/network_basic.rs index 4dd98295..5d7e2597 100644 --- a/src/canvas/widgets/network_basic.rs +++ b/src/canvas/widgets/network_basic.rs @@ -2,7 +2,7 @@ use tui::{ backend::Backend, layout::{Constraint, Direction, Layout, Rect}, terminal::Frame, - text::{Span, Spans}, + text::{Line, Span}, widgets::{Block, Paragraph}, }; @@ -44,13 +44,13 @@ impl Painter { let total_tx_label = format!("Total TX: {}", &app_state.converted_data.total_tx_display); let net_text = vec![ - Spans::from(Span::styled(rx_label, self.colours.rx_style)), - Spans::from(Span::styled(tx_label, self.colours.tx_style)), + Line::from(Span::styled(rx_label, self.colours.rx_style)), + Line::from(Span::styled(tx_label, self.colours.tx_style)), ]; let total_net_text = vec![ - Spans::from(Span::styled(total_rx_label, self.colours.total_rx_style)), - Spans::from(Span::styled(total_tx_label, self.colours.total_tx_style)), + Line::from(Span::styled(total_rx_label, self.colours.total_rx_style)), + Line::from(Span::styled(total_tx_label, self.colours.total_tx_style)), ]; f.render_widget(Paragraph::new(net_text).block(Block::default()), net_loc[0]); diff --git a/src/canvas/widgets/process_table.rs b/src/canvas/widgets/process_table.rs index 1be7730f..44cb5b2f 100644 --- a/src/canvas/widgets/process_table.rs +++ b/src/canvas/widgets/process_table.rs @@ -3,7 +3,7 @@ use tui::{ layout::{Alignment, Constraint, Direction, Layout, Rect}, style::Style, terminal::Frame, - text::{Span, Spans}, + text::{Line, Span}, widgets::{Block, Borders, Paragraph}, }; use unicode_segmentation::UnicodeSegmentation; @@ -185,7 +185,7 @@ impl Painter { self.colours.text_style, ); - let mut search_text = vec![Spans::from({ + let mut search_text = vec![Line::from({ let mut search_vec = vec![Span::styled( SEARCH_TITLE, if is_on_widget { @@ -225,7 +225,7 @@ impl Painter { } else { ("Case(Alt+C)", "Whole(Alt+W)", "Regex(Alt+R)") }; - let option_text = Spans::from(vec![ + let option_text = Line::from(vec![ Span::styled(case, case_style), Span::raw(" "), Span::styled(whole, whole_word_style), @@ -233,7 +233,7 @@ impl Painter { Span::styled(regex, regex_style), ]); - search_text.push(Spans::from(Span::styled( + search_text.push(Line::from(Span::styled( if let Some(err) = &proc_widget_state.proc_search.search_state.error_message { err.as_str() } else { diff --git a/src/components/data_table/draw.rs b/src/components/data_table/draw.rs index 3531d3d9..3903f381 100644 --- a/src/components/data_table/draw.rs +++ b/src/components/data_table/draw.rs @@ -7,7 +7,7 @@ use concat_string::concat_string; use tui::{ backend::Backend, layout::{Constraint, Direction, Layout, Rect}, - text::{Span, Spans, Text}, + text::{Line, Span, Text}, widgets::{Block, Borders, Row, Table}, Frame, }; @@ -98,7 +98,7 @@ where /// Generates a title, given the available space. pub fn generate_title<'a>( &self, draw_info: &'a DrawInfo, total_items: usize, - ) -> Option> { + ) -> Option> { self.props.title.as_ref().map(|title| { let current_index = self.state.current_index.saturating_add(1); let draw_loc = draw_info.loc; @@ -129,12 +129,12 @@ where UnicodeSegmentation::graphemes(title_base.as_str(), true).count() + 2, )); let esc = concat_string!("─", lines, "─ Esc to go back "); - Spans::from(vec![ + Line::from(vec![ Span::styled(title, title_style), Span::styled(esc, border_style), ]) } else { - Spans::from(Span::styled(title, title_style)) + Line::from(Span::styled(title, title_style)) } }) } diff --git a/src/components/time_graph.rs b/src/components/time_graph.rs index 6c0ff82e..94192bb4 100644 --- a/src/components/time_graph.rs +++ b/src/components/time_graph.rs @@ -6,7 +6,7 @@ use tui::{ layout::{Constraint, Rect}, style::Style, symbols::Marker, - text::{Span, Spans}, + text::{Line, Span}, widgets::{Block, Borders, GraphType}, Frame, }; @@ -96,10 +96,10 @@ impl<'a> TimeGraph<'a> { } /// Generates a title for the [`TimeGraph`] widget, given the available space. - fn generate_title(&self, draw_loc: Rect) -> Spans<'_> { + fn generate_title(&self, draw_loc: Rect) -> Line<'_> { if self.is_expanded { let title_base = concat_string!(self.title, "── Esc to go back "); - Spans::from(vec![ + Line::from(vec![ Span::styled(self.title.as_ref(), self.title_style), Span::styled( concat_string!( @@ -113,7 +113,7 @@ impl<'a> TimeGraph<'a> { ), ]) } else { - Spans::from(Span::styled(self.title.as_ref(), self.title_style)) + Line::from(Span::styled(self.title.as_ref(), self.title_style)) } } @@ -182,7 +182,7 @@ mod test { layout::Rect, style::{Color, Style}, symbols::Marker, - text::{Span, Spans}, + text::{Line, Span}, }; use super::TimeGraph; @@ -253,14 +253,14 @@ mod test { let title = time_graph.generate_title(draw_loc); assert_eq!( title, - Spans::from(Span::styled(" Network ", Style::default().fg(Color::Cyan))) + Line::from(Span::styled(" Network ", Style::default().fg(Color::Cyan))) ); time_graph.is_expanded = true; let title = time_graph.generate_title(draw_loc); assert_eq!( title, - Spans::from(vec![ + Line::from(vec![ Span::styled(" Network ", Style::default().fg(Color::Cyan)), Span::styled("───── Esc to go back ", Style::default().fg(Color::Blue)) ]) diff --git a/src/components/tui_widget/pipe_gauge.rs b/src/components/tui_widget/pipe_gauge.rs index aa933185..3fb543dc 100644 --- a/src/components/tui_widget/pipe_gauge.rs +++ b/src/components/tui_widget/pipe_gauge.rs @@ -2,7 +2,7 @@ use tui::{ buffer::Buffer, layout::Rect, style::Style, - text::Spans, + text::Line, widgets::{Block, Widget}, }; @@ -25,8 +25,8 @@ impl Default for LabelLimit { pub struct PipeGauge<'a> { block: Option>, ratio: f64, - start_label: Option>, - inner_label: Option>, + start_label: Option>, + inner_label: Option>, label_style: Style, gauge_style: Style, hide_parts: LabelLimit, @@ -60,7 +60,7 @@ impl<'a> PipeGauge<'a> { /// The label displayed before the bar. pub fn start_label(mut self, start_label: T) -> Self where - T: Into>, + T: Into>, { self.start_label = Some(start_label.into()); self @@ -69,7 +69,7 @@ impl<'a> PipeGauge<'a> { /// The label displayed inside the bar. pub fn inner_label(mut self, inner_label: T) -> Self where - T: Into>, + T: Into>, { self.inner_label = Some(inner_label.into()); self @@ -125,8 +125,8 @@ impl<'a> Widget for PipeGauge<'a> { match self.hide_parts { LabelLimit::StartLabel => { - let inner_label = self.inner_label.unwrap_or_else(|| Spans::from("")); - let _ = buf.set_spans( + let inner_label = self.inner_label.unwrap_or_else(|| Line::from("")); + let _ = buf.set_line( gauge_area.left(), gauge_area.top(), &inner_label, @@ -139,8 +139,8 @@ impl<'a> Widget for PipeGauge<'a> { LabelLimit::Auto(_) if gauge_area.width < (inner_label_width + start_label_width + 1) as u16 => { - let inner_label = self.inner_label.unwrap_or_else(|| Spans::from("")); - let _ = buf.set_spans( + let inner_label = self.inner_label.unwrap_or_else(|| Line::from("")); + let _ = buf.set_line( gauge_area.left(), gauge_area.top(), &inner_label, @@ -151,8 +151,8 @@ impl<'a> Widget for PipeGauge<'a> { return; } _ => { - let start_label = self.start_label.unwrap_or_else(|| Spans::from("")); - buf.set_spans( + let start_label = self.start_label.unwrap_or_else(|| Line::from("")); + buf.set_line( gauge_area.left(), gauge_area.top(), &start_label, @@ -162,10 +162,10 @@ impl<'a> Widget for PipeGauge<'a> { } }; - let end_label = self.inner_label.unwrap_or_else(|| Spans::from("")); + let end_label = self.inner_label.unwrap_or_else(|| Line::from("")); match self.hide_parts { LabelLimit::Bars => { - let _ = buf.set_spans( + let _ = buf.set_line( gauge_area .right() .saturating_sub(end_label.width() as u16 + 1), @@ -177,7 +177,7 @@ impl<'a> Widget for PipeGauge<'a> { LabelLimit::Auto(width_limit) if gauge_area.right().saturating_sub(col) < width_limit => { - let _ = buf.set_spans( + let _ = buf.set_line( gauge_area .right() .saturating_sub(end_label.width() as u16 + 1), @@ -187,15 +187,15 @@ impl<'a> Widget for PipeGauge<'a> { ); } LabelLimit::Auto(_) | LabelLimit::None => { - let (start, _) = buf.set_spans(col, row, &Spans::from("["), gauge_area.width); + let (start, _) = buf.set_line(col, row, &Line::from("["), gauge_area.width); if start >= gauge_area.right() { return; } - let (end, _) = buf.set_spans( + let (end, _) = buf.set_line( (gauge_area.x + gauge_area.width).saturating_sub(1), row, - &Spans::from("]"), + &Line::from("]"), gauge_area.width, ); @@ -214,7 +214,7 @@ impl<'a> Widget for PipeGauge<'a> { let gauge_end = gauge_area .right() .saturating_sub(end_label.width() as u16 + 1); - buf.set_spans(gauge_end, row, &end_label, end_label.width() as u16); + buf.set_line(gauge_end, row, &end_label, end_label.width() as u16); } } LabelLimit::StartLabel => unreachable!(), diff --git a/src/components/tui_widget/time_chart.rs b/src/components/tui_widget/time_chart.rs index 9369263f..e433bc16 100644 --- a/src/components/tui_widget/time_chart.rs +++ b/src/components/tui_widget/time_chart.rs @@ -8,9 +8,9 @@ use tui::{ layout::{Constraint, Rect}, style::{Color, Style}, symbols::{self, Marker}, - text::{Span, Spans}, + text::{Line, Span}, widgets::{ - canvas::{Line, Points}, + canvas::{Line as CanvasLine, Points}, Block, Borders, GraphType, Widget, }, }; @@ -25,7 +25,7 @@ pub type Point = (f64, f64); #[derive(Debug, Clone)] pub struct Axis<'a> { /// Title displayed next to axis end - pub title: Option>, + pub title: Option>, /// Bounds for the axis (all data points outside these limits will not be represented) pub bounds: [f64; 2], /// A list of labels to put to the left or below the axis @@ -49,7 +49,7 @@ impl<'a> Default for Axis<'a> { impl<'a> Axis<'a> { pub fn title(mut self, title: T) -> Axis<'a> where - T: Into>, + T: Into>, { self.title = Some(title.into()); self @@ -460,7 +460,7 @@ impl<'a> Widget for TimeChart<'a> { ); if let GraphType::Line = dataset.graph_type { - ctx.draw(&Line { + ctx.draw(&CanvasLine { x1: interpolated_point.0, y1: interpolated_point.1, x2: newer_point.0, @@ -478,7 +478,7 @@ impl<'a> Widget for TimeChart<'a> { if let GraphType::Line = dataset.graph_type { for data in data_slice.windows(2) { - ctx.draw(&Line { + ctx.draw(&CanvasLine { x1: data[0].0, y1: data[0].1, x2: data[1].0, @@ -504,7 +504,7 @@ impl<'a> Widget for TimeChart<'a> { ); if let GraphType::Line = dataset.graph_type { - ctx.draw(&Line { + ctx.draw(&CanvasLine { x1: older_point.0, y1: older_point.1, x2: interpolated_point.0, @@ -551,7 +551,7 @@ impl<'a> Widget for TimeChart<'a> { }, original_style, ); - buf.set_spans(x, y, &title, width); + buf.set_line(x, y, &title, width); } if let Some((x, y)) = layout.title_y { @@ -566,7 +566,7 @@ impl<'a> Widget for TimeChart<'a> { }, original_style, ); - buf.set_spans(x, y, &title, width); + buf.set_line(x, y, &title, width); } } } diff --git a/src/components/tui_widget/time_chart/canvas.rs b/src/components/tui_widget/time_chart/canvas.rs index a864d89e..fc921cb4 100644 --- a/src/components/tui_widget/time_chart/canvas.rs +++ b/src/components/tui_widget/time_chart/canvas.rs @@ -10,9 +10,9 @@ use tui::{ layout::Rect, style::{Color, Style}, symbols, - text::Spans, + text::Line, widgets::{ - canvas::{Line, Points}, + canvas::{Line as CanvasLine, Points}, Block, Widget, }, }; @@ -22,7 +22,7 @@ pub trait Shape { fn draw(&self, painter: &mut Painter<'_, '_>); } -impl Shape for Line { +impl Shape for CanvasLine { fn draw(&self, painter: &mut Painter<'_, '_>) { let (x1, y1) = match painter.get_point(self.x1, self.y1) { Some(c) => c, @@ -122,7 +122,7 @@ impl Shape for Points<'_> { pub struct Label<'a> { x: f64, y: f64, - spans: Spans<'a>, + spans: Line<'a>, } #[derive(Debug, Clone)] @@ -365,6 +365,7 @@ impl<'a> Context<'a> { symbols::Marker::Dot => Box::new(CharGrid::new(width, height, '•')), symbols::Marker::Block => Box::new(CharGrid::new(width, height, '▄')), symbols::Marker::Braille => Box::new(BrailleGrid::new(width, height)), + symbols::Marker::Bar => Box::new(CharGrid::new(width, height, '▄')), }; Context { x_bounds, @@ -542,7 +543,7 @@ where { let x = ((label.x - left) * resolution.0 / width) as u16 + canvas_area.left(); let y = ((top - label.y) * resolution.1 / height) as u16 + canvas_area.top(); - buf.set_spans(x, y, &label.spans, canvas_area.right() - x); + buf.set_line(x, y, &label.spans, canvas_area.right() - x); } } } diff --git a/src/utils/gen_util.rs b/src/utils/gen_util.rs index 28cb558e..946cb3cd 100644 --- a/src/utils/gen_util.rs +++ b/src/utils/gen_util.rs @@ -1,6 +1,6 @@ use std::cmp::Ordering; -use tui::text::{Span, Spans, Text}; +use tui::text::{Line, Span, Text}; use unicode_segmentation::UnicodeSegmentation; use unicode_width::UnicodeWidthStr; @@ -99,7 +99,7 @@ pub fn get_decimal_prefix(quantity: u64, unit: &str) -> (f64, String) { /// Truncates text if it is too long, and adds an ellipsis at the end if needed. pub fn truncate_to_text<'a, U: Into>(content: &str, width: U) -> Text<'a> { Text { - lines: vec![Spans(vec![Span::raw(truncate_str(content, width))])], + lines: vec![Line::from(vec![Span::raw(truncate_str(content, width))])], } }