summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClement Tsang <34804052+ClementTsang@users.noreply.github.com>2020-09-26 20:04:34 -0400
committerClementTsang <cjhtsang@uwaterloo.ca>2020-09-26 20:21:59 -0400
commit750d8f3cb747103cca7a2a4afe8ff41ff1318b6f (patch)
treeac34a6a538c1f94cb395b20a23c9186b749ca6e6
parent6db76029e2419d53c81cb2111e487f83ee248a2f (diff)
refactor: tui-rs 0.11.0 refactor (#253)
Refactors tui-rs usage to the new 0.11.0 release. This release also fixes the highlighting bug from #249, and now, expanding a widget no longer overrides the widget title colour. This commit also introduces #255, but that seems to be easy to bandaid so hopefully it will get fixed soon?
-rw-r--r--CHANGELOG.md6
-rw-r--r--Cargo.lock6
-rw-r--r--Cargo.toml3
-rw-r--r--src/app.rs1
-rw-r--r--src/canvas.rs15
-rw-r--r--src/canvas/dialogs/dd_dialog.rs106
-rw-r--r--src/canvas/dialogs/help_dialog.rs36
-rw-r--r--src/canvas/screens/config_screen.rs6
-rw-r--r--src/canvas/widgets/basic_table_arrows.rs22
-rw-r--r--src/canvas/widgets/battery_display.rs154
-rw-r--r--src/canvas/widgets/cpu_basic.rs20
-rw-r--r--src/canvas/widgets/cpu_graph.rs64
-rw-r--r--src/canvas/widgets/disk_table.rs67
-rw-r--r--src/canvas/widgets/mem_basic.rs12
-rw-r--r--src/canvas/widgets/mem_graph.rs68
-rw-r--r--src/canvas/widgets/network_basic.rs26
-rw-r--r--src/canvas/widgets/network_graph.rs65
-rw-r--r--src/canvas/widgets/process_table.rs120
-rw-r--r--src/canvas/widgets/temp_table.rs39
-rw-r--r--src/constants.rs198
20 files changed, 487 insertions, 547 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ebdd407..0d1bb1df 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,8 +19,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#223](https://github.com/ClementTsang/bottom/pull/223): Add tree mode for processes.
-- [](): Add in-app configuration.
-
### Changes
- [#213](https://github.com/ClementTsang/bottom/pull/213), [#214](https://github.com/ClementTsang/bottom/pull/214): Updated help descriptions, added auto-complete generation.
@@ -33,6 +31,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#224](https://github.com/ClementTsang/bottom/pull/224): Implements sorting by count. It previously did absolutely nothing.
+- [#253](https://github.com/ClementTsang/bottom/pull/253): Fix highlighted entries being stuck in another colour when the widget is not selected.
+
+- [#253](https://github.com/ClementTsang/bottom/pull/253): Expanding a widget no longer overrides the widget title colour.
+
## [0.4.7] - 2020-08-26
### Bug Fixes
diff --git a/Cargo.lock b/Cargo.lock
index 7893cdbb..ebef0f0a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1363,15 +1363,13 @@ checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41"
[[package]]
name = "tui"
-version = "0.9.5"
+version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9533d39bef0ae8f510e8a99d78702e68d1bbf0b98a78ec9740509d287010ae1e"
+checksum = "36626dee5ede9fd34015e9fb4fd7eedf3f3d05bdf1436aaef15b7d0a24233778"
dependencies = [
"bitflags",
"cassowary",
"crossterm",
- "either",
- "itertools",
"unicode-segmentation",
"unicode-width",
]
diff --git a/Cargo.toml b/Cargo.toml
index d019a7ba..90a877a5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -42,7 +42,8 @@ serde = {version = "1.0", features = ["derive"] }
sysinfo = "0.15.1"
thiserror = "1.0.20"
toml = "0.5.6"
-tui = {version = "0.9.5", features = ["crossterm"], default-features = false }
+tui = {version = "0.11.0", features = ["crossterm"], default-features = false }
+# tui = {version = "0.11.0", features = ["crossterm"], default-features = false, path="../tui-rs" }
typed-builder = "0.7.0"
unicode-segmentation = "1.6.0"
unicode-width = "0.1"
diff --git a/src/app.rs b/src/app.rs
index 33c11ebd..3eda03ad 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -1276,6 +1276,7 @@ impl App {
}
/// Call this whenever the config value is updated!
+ #[allow(dead_code)] //FIXME: Remove this
fn update_config_file(&mut self) -> anyhow::Result<()> {
if self.app_config_fields.no_write {
// Don't write!
diff --git a/src/canvas.rs b/src/canvas.rs
index f4707507..bc142194 100644
--- a/src/canvas.rs
+++ b/src/canvas.rs
@@ -5,7 +5,7 @@ use std::collections::HashMap;
use tui::{
backend::Backend,
layout::{Constraint, Direction, Layout, Rect},
- widgets::Text,
+ text::{Span, Spans},
Frame, Terminal,
};
@@ -63,7 +63,7 @@ pub struct Painter {
pub colours: CanvasColours,
height: u16,
width: u16,
- styled_help_text: Vec<Text<'static>>,
+ styled_help_text: Vec<Spans<'static>>,
is_mac_os: bool,
row_constraints: Vec<Constraint>,
col_constraints: Vec<Vec<Constraint>>,
@@ -289,28 +289,27 @@ impl Painter {
styled_help_spans.extend(
section
.iter()
- .map(|&text| Text::styled(text, self.colours.text_style))
+ .map(|&text| Span::styled(text, self.colours.text_style))
.collect::<Vec<_>>(),
);
} else {
// Not required check but it runs only a few times... so whatever ig, prevents me from
// being dumb and leaving a help text section only one line long.
if section.len() > 1 {
- styled_help_spans.push(Text::raw("\n\n"));
+ styled_help_spans.push(Span::raw(""));
styled_help_spans
- .push(Text::styled(section[0], self.colours.table_header_style));
+ .push(Span::styled(section[0], self.colours.table_header_style));
styled_help_spans.extend(
section[1..]
.iter()
- .map(|&text| Text::styled(text, self.colours.text_style))
+ .map(|&text| Span::styled(text, self.colours.text_style))
.collect::<Vec<_>>(),
);
}
}
});
- // self.styled_help_text = styled_help_spans.into_iter().map(Spans::from).collect();
- self.styled_help_text = styled_help_spans;
+ self.styled_help_text = styled_help_spans.into_iter().map(Spans::from).collect();
}
// FIXME: [CONFIG] write this, should call painter init and any changed colour functions...
diff --git a/src/canvas/dialogs/dd_dialog.rs b/src/canvas/dialogs/dd_dialog.rs
index 11d0df5f..50dbc7ef 100644
--- a/src/canvas/dialogs/dd_dialog.rs
+++ b/src/canvas/dialogs/dd_dialog.rs
@@ -2,7 +2,8 @@ use tui::{
backend::Backend,
layout::{Alignment, Constraint, Direction, Layout, Rect},
terminal::Frame,
- widgets::{Block, Borders, Paragraph, Text},
+ text::{Span, Spans, Text},
+ widgets::{Block, Borders, Paragraph, Wrap},
};
use crate::{app::App, canvas::Painter};
@@ -11,46 +12,46 @@ const DD_BASE: &str = " Confirm Kill Process ── Esc to close ";
const DD_ERROR_BASE: &str = " Error ── Esc to close ";
pub trait KillDialog {
- fn get_dd_spans(&self, app_state: &App) -> Option<Vec<Text<'_>>>;
+ fn get_dd_spans(&self, app_state: &App) -> Option<Text<'_>>;
fn draw_dd_dialog<B: Backend>(
- &self, f: &mut Frame<'_, B>, dd_text: Option<Vec<Text<'_>>>, app_state: &mut App,
- draw_loc: Rect,
+ &self, f: &mut Frame<'_, B>, dd_text: Option<Text<'_>>, app_state: &mut App, draw_loc: Rect,
) -> bool;
}
impl KillDialog for Painter {
- fn get_dd_spans(&self, app_state: &App) -> Option<Vec<Text<'_>>> {
+ fn get_dd_spans(&self, app_state: &App) -> Option<Text<'_>> {
if let Some(dd_err) = &app_state.dd_err {
- return Some(vec![
- Text::raw("\n"),
- Text::raw(format!("Failed to kill process.\n{}\n", dd_err)),
- Text::raw("Please press ENTER or ESC to close this dialog."),
- ]);
+ 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."),
+ ]));
} 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(vec![
- Text::raw("\n"),
+ return Some(Text::from(vec![
+ Spans::from(""),
if app_state.is_grouped(app_state.current_widget.widget_id) {
if to_kill_processes.1.len() != 1 {
- Text::raw(format!(
+ Spans::from(format!(
"Kill {} processes with the name \"{}\"? Press ENTER to confirm.",
to_kill_processes.1.len(),
to_kill_processes.0
))
} else {
- Text::raw(format!(
+ Spans::from(format!(
"Kill 1 process with the name \"{}\"? Press ENTER to confirm.",
to_kill_processes.0
))
}
} else {
- Text::raw(format!(
+ Spans::from(format!(
"Kill process \"{}\" with PID {}? Press ENTER to confirm.",
to_kill_processes.0, first_pid
))
},
- ]);
+ ]));
}
}
@@ -58,63 +59,44 @@ impl KillDialog for Painter {
}
fn draw_dd_dialog<B: Backend>(
- &self, f: &mut Frame<'_, B>, dd_text: Option<Vec<Text<'_>>>, app_state: &mut App,
- draw_loc: Rect,
+ &self, f: &mut Frame<'_, B>, dd_text: Option<Text<'_>>, app_state: &mut App, draw_loc: Rect,
) -> bool {
if let Some(dd_text) = dd_text {
- // let dd_title = if app_state.dd_err.is_some() {
- // Text::styled(
- // format!(
- // " Error ─{}─ Esc to close ",
- // "─".repeat(
- // usize::from(draw_loc.width)
- // .saturating_sub(DD_ERROR_BASE.chars().count() + 2)
- // )
- // ),
- // self.colours.border_style,
- // )
- // } else {
- // Text::styled(
- // format!(
- // " Confirm Kill Process ─{}─ Esc to close ",
- // "─".repeat(
- // usize::from(draw_loc.width).saturating_sub(DD_BASE.chars().count() + 2)
- // )
- // ),
- // self.colours.border_style,
- // )
- // };
-
let dd_title = if app_state.dd_err.is_some() {
- format!(
- " Error ─{}─ Esc to close ",
- "─".repeat(
- usize::from(draw_loc.width)
- .saturating_sub(DD_ERROR_BASE.chars().count() + 2)
- )
+ Span::styled(
+ format!(
+ " Error ─{}─ Esc to close ",
+ "─".repeat(
+ usize::from(draw_loc.width)
+ .saturating_sub(DD_ERROR_BASE.chars().count() + 2)
+ )
+ ),
+ self.colours.border_style,
)
} else {
- format!(
- " Confirm Kill Process ─{}─ Esc to close ",
- "─".repeat(
- usize::from(draw_loc.width).saturating_sub(DD_BASE.chars().count() + 2)
- )
+ Span::styled(
+ format!(
+ " Confirm Kill Process ─{}─ Esc to close ",
+ "─".repeat(
+ usize::from(draw_loc.width).saturating_sub(DD_BASE.chars().count() + 2)
+ )
+ ),
+ self.colours.border_style,
)
};
f.render_widget(
- Paragraph::new(dd_text.iter())
+ Paragraph::new(dd_text)
.block(
Block::default()
- .title(&dd_title)
- .title_style(self.colours.border_style)
+ .title(dd_title)
.style(self.colours.border_style)
.borders(Borders::ALL)
.border_style(self.colours.border_style),
)
.style(self.colours.text_style)
.alignment(Alignment::Center)
- .wrap(true),
+ .wrap(Wrap { trim: true }),
draw_loc,
);
@@ -135,13 +117,13 @@ impl KillDialog for Painter {
if let Some(button_draw_loc) = split_draw_loc.get(1) {
let (yes_button, no_button) = if app_state.delete_dialog_state.is_on_yes {
(
- Text::styled("Yes", self.colours.currently_selected_text_style),
- Text::raw("No"),
+ Span::styled("Yes", self.colours.currently_selected_text_style),
+ Span::raw("No"),
)
} else {
(
- Text::raw("Yes"),
- Text::styled("No", self.colours.currently_selected_text_style),
+ Span::raw("Yes"),
+ Span::styled("No", self.colours.currently_selected_text_style),
)
};
@@ -158,13 +140,13 @@ impl KillDialog for Painter {
.split(*button_draw_loc);
f.render_widget(
- Paragraph::new([yes_button].iter())
+ Paragraph::new(yes_button)
.block(Block::default())
.alignment(Alignment::Right),
button_layout[0],
);
f.render_widget(
- Paragraph::new([no_button].iter())
+ Paragraph::new(no_button)
.block(Block::default())
.alignment(Alignment::Left),
button_layout[2],
diff --git a/src/canvas/dialogs/help_dialog.rs b/src/canvas/dialogs/help_dialog.rs
index fe0f1c52..752dc858 100644
--- a/src/canvas/dialogs/help_dialog.rs
+++ b/src/canvas/dialogs/help_dialog.rs
@@ -5,7 +5,8 @@ use tui::{
backend::Backend,
layout::{Alignment, Rect},
terminal::Frame,
- widgets::{Block, Borders, Paragraph},
+ text::Span,
+ widgets::{Block, Borders, Paragraph, Wrap},
};
const HELP_BASE: &str = " Help ── Esc to close ";
@@ -21,19 +22,14 @@ impl HelpDialog for Painter {
fn draw_help_dialog<B: Backend>(
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect,
) {
- // let help_title = Text::styled(
- // format!(
- // " Help ─{}─ Esc to close ",
- // "─".repeat(
- // usize::from(draw_loc.width).saturating_sub(HELP_BASE.chars().count() + 2)
- // )
- // ),
- // self.colours.border_style,
- // );
-
- let help_title = format!(
- " Help ─{}─ Esc to close ",
- "─".repeat(usize::from(draw_loc.width).saturating_sub(HELP_BASE.chars().count() + 2))
+ let help_title = Span::styled(
+ format!(
+ " Help ─{}─ Esc to close ",
+ "─".repeat(
+ usize::from(draw_loc.width).saturating_sub(HELP_BASE.chars().count() + 2)
+ )
+ ),
+ self.colours.border_style,
);
if app_state.should_get_widget_bounds() {
@@ -99,24 +95,24 @@ impl HelpDialog for Painter {
}
f.render_widget(
- Paragraph::new(self.styled_help_text.iter())
+ Paragraph::new(self.styled_help_text.clone())
.block(
Block::default()
- .title(&help_title)
- .title_style(self.colours.border_style)
+ .title(help_title)
.style(self.colours.border_style)
.borders(Borders::ALL)
.border_style(self.colours.border_style),
)
.style(self.colours.text_style)
.alignment(Alignment::Left)
- .wrap(true)
- .scroll(
+ .wrap(Wrap { trim: true })
+ .scroll((
app_state
.help_dialog_state
.scroll_state
.current_scroll_index,
- ),
+ 0,
+ )),
draw_loc,
);
}
diff --git a/src/canvas/screens/config_screen.rs b/src/canvas/screens/config_screen.rs
index 6aa22493..161e6ca6 100644
--- a/src/canvas/screens/config_screen.rs
+++ b/src/canvas/screens/config_screen.rs
@@ -1,3 +1,5 @@
+#![allow(unused_variables)] //FIXME: Remove this
+#![allow(unused_imports)] //FIXME: Remove this
use crate::{app::App, canvas::Painter, constants};
use tui::{
backend::Backend,
@@ -6,6 +8,7 @@ use tui::{
layout::Layout,
layout::{Alignment, Rect},
terminal::Frame,
+ text::Span,
widgets::{Block, Borders, Paragraph},
};
@@ -20,8 +23,7 @@ impl ConfigScreen for Painter {
&self, f: &mut Frame<'_, B>, app_state: &mut App, draw_loc: Rect,
) {
let config_block = Block::default()
- .title(&" Config ")
- .title_style(self.colours.border_style)
+ .title(" Config ") // FIXME: [Config] missing title styling
.style(self.colours.border_style)
.borders(Borders::ALL)
.border_style(self.colours.border_style);
diff --git a/src/canvas/widgets/basic_table_arrows.rs b/src/canvas/widgets/basic_table_arrows.rs
index fd64e8dc..bce169e1 100644
--- a/src/canvas/widgets/basic_table_arrows.rs
+++ b/src/canvas/widgets/basic_table_arrows.rs
@@ -7,7 +7,9 @@ use tui::{
backend::Backend,
layout::{Alignment, Constraint, Direction, Layout, Rect},
terminal::Frame,
- widgets::{Block, Paragraph, Text},
+ text::Span,
+ text::Spans,
+ widgets::{Block, Paragraph},
};
pub trait BasicTableArrows {
@@ -97,13 +99,19 @@ impl BasicTableArrows for Painter {
usize::from(draw_loc.width).saturating_sub(6 + left_name.len() + right_name.len());
let left_arrow_text = vec![
- Text::raw("\n"),
- Text::styled(format!("◄ {}", left_name), self.colours.text_style),
+ Spans::default(),
+ Spans::from(Span::styled(
+ format!("◄ {}", left_name),
+ self.colours.text_style,
+ )),
];
let right_arrow_text = vec![
- Text::raw("\n"),
- Text::styled(format!("{} ►", right_name), self.colours.text_style),
+ Spans::default(),
+ Spans::from(Span::styled(
+ format!("{} ►", right_name),
+ self.colours.text_style,
+ )),
];
let margined_draw_loc = Layout::default()
@@ -120,11 +128,11 @@ impl BasicTableArrows for Painter {
.split(draw_loc);
f.render_widget(
- Paragraph::new(left_arrow_text.iter()).block(Block::default()),
+ Paragraph::new(left_arrow_text).block(Block::default()),
margined_draw_loc[0],
);
f.render_widget(
- Paragraph::new(right_arrow_text.iter())
+ Paragraph::new(right_arrow_text)
.block(Block::default())
.alignment(Alignment::Right),
margined_draw_loc[2],
diff --git a/src/canvas/widgets/battery_display.rs b/src/canvas/widgets/battery_display.rs
index e50ed515..7364044b 100644
--- a/src/canvas/widgets/battery_display.rs
+++ b/src/canvas/widgets/battery_display.rs
@@ -8,8 +8,10 @@ use tui::{
backend::Backend,
layout::{Constraint, Direction, Layout, Rect},
terminal::Frame,
- widgets::{Block, Borders, Paragraph, Row, Table, Tabs, Text},
+ text::{Span, Spans},
+ widgets::{Block, Borders, Paragraph, Row, Table, Tabs},
};
+use unicode_segmentation::UnicodeSegmentation;
pub trait BatteryDisplayWidget {
fn draw_battery_display<B: Backend>(
@@ -28,53 +30,38 @@ impl BatteryDisplayWidget for Painter {
app_state.battery_state.widget_states.get_mut(&widget_id)
{
let is_on_widget = widget_id == app_state.current_widget.widget_id;
- let border_and_title_style = if is_on_widget {
+ let border_style = if is_on_widget {
self.colours.highlighted_border_style
} else {
self.colours.border_style
};
- // let title = if app_state.is_expanded {
- // const TITLE_BASE: &str = " Battery ── Esc to go back ";
- // Span::styled(
- // format!(
- // " Battery ─{}─ Esc to go back ",
- // "─".repeat(
- // usize::from(draw_loc.width)
- // .saturating_sub(TITLE_BASE.chars().count() + 2)
- // )
- // ),
- // border_and_title_style,
- // )
- // } else {
- // Span::styled(" Battery ".to_string(), self.colours.widget_title_style)
- // };
-
let title = if app_state.is_expanded {
const TITLE_BASE: &str = " Battery ── Esc to go back ";
-
- format!(
- " Battery ─{}─ Esc to go back ",
- "─".repeat(
- usize::from(draw_loc.width).saturating_sub(TITLE_BASE.chars().count() + 2)
- )
- )
+ Spans::from(vec![
+ Span::styled(" Battery ".to_string(), self.colours.widget_title_style),
+ Span::styled(
+ format!(
+ "─{}─ Esc to go back ",
+ "─".repeat(usize::from(draw_loc.width).saturating_sub(
+ UnicodeSegmentation::graphemes(TITLE_BASE, true).count() + 2
+ ))
+ ),
+ border_style,
+ ),
+ ])
} else {
- " Battery ".to_string()
- };
-
- let title_style = if app_state.is_expanded {
- border_and_title_style
- } else {
- self.colours.widget_title_style
+ Spans::from(Span::styled(
+ " Battery ".to_string(),
+ self.colours.widget_title_style,
+ ))
};
let battery_block = if draw_border {
Block::default()
- .title(&title)
- .title_style(title_style)
+ .title(title)
.borders(Borders::ALL)
- .border_style(border_and_title_style)
+ .border_style(border_style)
} else if is_on_widget {
Block::default()
.borders(*SIDE_BORDERS)
@@ -83,38 +70,12 @@ impl BatteryDisplayWidget for Painter {
Block::default().borders(Borders::NONE)
};
- // f.render_widget(
- // // Tabs::new(
- // // (app_state
- // // .canvas_data
- // // .battery_data
- // // .iter()
- // // .map(|battery| Spans::from(battery.battery_name.clone())))
- // // .collect::<Vec<_>>(),
- // // )
- // Tabs::default()
- // .titles(
- // app_state
- // .canvas_data
- // .battery_data
- // .iter()
- // .map(|battery| &battery.battery_name)
- // .collect::<Vec<_>>()
- // .as_ref(),
- // )
- // .block(battery_block)
- // .divider(tui::symbols::line::VERTICAL)
- // .style(self.colours.text_style)
- // .highlight_style(self.colours.currently_selected_text_style)
- // .select(battery_widget_state.currently_selected_battery_index),
- // draw_loc,
- // );
-
- let margined_draw_loc = Layout::default()
- .constraints([Constraint::Percentage(100)].as_ref())
- .horizontal_margin(if is_on_widget || draw_border { 0 } else { 1 })
- .direction(Direction::Horizontal)
- .split(draw_loc)[0];
+ let battery_names = app_state
+ .canvas_data
+ .battery_data
+ .iter()
+ .map(|battery| &battery.battery_name)
+ .collect::<Vec<_>>();
let tab_draw_loc = Layout::default()
.constraints(
@@ -128,6 +89,27 @@ impl BatteryDisplayWidget for Painter {
.direction(Direction::Vertical)
.split(draw_loc)[1];
+ f.render_widget(
+ Tabs::new(
+ battery_names
+ .iter()
+ .map(|name| Spans::from((*name).clone()))
+ .collect::<Vec<_>>(),
+ )
+ .block(Block::default())
+ .divider(tui::symbols::line::VERTICAL)
+ .style(self.colours.text_style)
+ .highlight_style(self.colours.currently_selected_text_style)
+ .select(battery_widget_state.currently_selected_battery_index),
+ tab_draw_loc,
+ );
+
+ let margined_draw_loc = Layout::default()
+ .constraints([Constraint::Percentage(100)].as_ref())
+ .horizontal_margin(if is_on_widget || draw_border { 0 } else { 1 })
+ .direction(Direction::Horizontal)
+ .split(draw_loc)[0];
+
if let Some(battery_details) = app_state
.canvas_data
.battery_data
@@ -189,45 +171,15 @@ impl BatteryDisplayWidget for Painter {
);
} else {
f.render_widget(
- Paragraph::new(
- [Text::styled(
- "No data found for this battery",
- self.colours.text_style,
- )]
- .iter(),
- )
+ Paragraph::new(Span::styled(
+ "No data found for this battery",
+ self.colours.text_style,
+ ))
.block(battery_block),
margined_draw_loc,
);
}
- let battery_names = app_state
- .canvas_data
- .battery_data
- .iter()
- .map(|battery| &battery.battery_name)
- .collect::<Vec<_>>();
-
- // Has to be placed AFTER for tui 0.9, place BEFORE for 0.10.
- f.render_widget(
- // Tabs::new(
- // (app_state
- // .canvas_data
- // .battery_data
- // .iter()
- // .map(|battery| Spans::from(battery.battery_name.clone())))
- // .collect::<Vec<_>>(),
- // )
- Tabs::default()
- .titles(battery_names.as_ref())
- .block(Block::default())
- .divider(tui::symbols::line::VERTICAL)
- .style(self.colours.text_style)
- .highlight_style(self.colours.currently_selected_text_style) //FIXME: [HIGHLIGHT] THIS IS BROKEN ON TUI's SIDE, override this with your own style...
- .select(battery_widget_state.currently_selected_battery_index),
- tab_draw_loc,
- );
-
if should_get_widget_bounds {
// Tab wizardry
if !battery_names.is_empty() {
diff --git a/src/canvas/widgets/cpu_basic.rs b/src/canvas/widgets/cpu_basic.rs
index 7f9381f9..2f7574b6 100644
--- a/src/canvas/widgets/cpu_basic.rs
+++ b/src/canvas/widgets/cpu_basic.rs
@@ -11,7 +11,8 @@ use tui::{
backend::Backend,
layout::{Constraint, Direction, Layout, Rect},
terminal::Frame,
- widgets::{Block, Paragraph, Text},
+ text::{Span, Spans},
+ widgets::{Block, Paragraph},
};
pub trait CpuBasicWidget {
@@ -76,7 +77,7 @@ impl CpuBasicWidget for Painter {
let num_bars = calculate_basic_use_bars(use_percentage, bar_length);
format!(
- "{:3}[{}{}{:3.0}%]\n",
+ "{:3}[{}{}{:3.0}%]",
if app_state.app_config_fields.show_average_cpu {
if cpu_index == 0 {
"AVG".to_string()
@@ -108,16 +109,11 @@ impl CpuBasicWidget for Painter {
let end_index = min(start_index + how_many_cpus, num_cpus);
let cpu_column = (start_index..end_index)
.map(|cpu_index| {
- // Spans::from(Span {
- // content: (&cpu_bars[cpu_index]).into(),
- // style: self.colours.cpu_colour_styles
- // [cpu_index % self.colours.cpu_colour_styles.len()],
- // })
- Text::styled(
- &cpu_bars[cpu_index],
- self.colours.cpu_colour_styles
+ Spans::from(Span {
+ content: (&cpu_bars[cpu_index]).into(),
+ style: self.colours.cpu_colour_styles
[cpu_index % self.colours.cpu_colour_styles.len()],
- )
+ })
})
.collect::<Vec<_>>();
@@ -130,7 +126,7 @@ impl CpuBasicWidget for Painter {
.split(*chunk)[0];
f.render_widget(
- Paragraph::new(cpu_column.iter()).block(Block::default()),
+ Paragraph::new(cpu_column).block(Block::default()),
margined_loc,
);
}
diff --git a/src/canvas/widgets/cpu_graph.rs b/src/canvas/widgets/cpu_graph.rs
index 97ba064d..07fdfaf0 100644
--- a/src/canvas/widgets/cpu_graph.rs
+++ b/src/canvas/widgets/cpu_graph.rs
@@ -1,5 +1,6 @@
use lazy_static::lazy_static;
use std::borrow::Cow;
+use unicode_segmentation::UnicodeSegmentation;
use crate::{
app::{layout_manager::WidgetDirection, App},
@@ -16,6 +17,8 @@ use tui::{
layout::{Constraint, Direction, Layout, Rect},
symbols::Marker,
terminal::Frame,
+ text::Span,