mirror of
https://github.com/ClementTsang/bottom.git
synced 2026-09-23 19:15:36 +00:00
bug: fix scrollbar not drawing if the height was 2 or less (#2261)
This commit is contained in:
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Bug Fixes
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
## Changes
|
## Changes
|
||||||
|
|
||||||
|
## Bug Fixes
|
||||||
|
|
||||||
## Other
|
## Other
|
||||||
|
|
||||||
## Internal Changes
|
## Internal Changes
|
||||||
|
|||||||
+11
-4
@@ -18,14 +18,12 @@ Versioning for this project is based on [Semantic Versioning](https://semver.org
|
|||||||
|
|
||||||
That said, these are more guidelines rather than hard rules, though the project will generally try to follow them.
|
That said, these are more guidelines rather than hard rules, though the project will generally try to follow them.
|
||||||
|
|
||||||
|
<!--TODO: Make the changelog order standardized with features, changes, bugs, other -->
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 0.15.0 - Unreleased
|
## 0.15.0 - Unreleased
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
- [#2225](https://github.com/ClementTsang/bottom/pull/2225): Fix waking up NVIDIA GPUs when getting stats on Linux.
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- [#2239](https://github.com/ClementTsang/bottom/pull/2239): Initial Intel GPU support for Linux to get process GPU usage.
|
- [#2239](https://github.com/ClementTsang/bottom/pull/2239): Initial Intel GPU support for Linux to get process GPU usage.
|
||||||
@@ -34,6 +32,15 @@ That said, these are more guidelines rather than hard rules, though the project
|
|||||||
- [#2251](https://github.com/ClementTsang/bottom/pull/2251): Add configurable binary disk capacity units for disk widget I/O.
|
- [#2251](https://github.com/ClementTsang/bottom/pull/2251): Add configurable binary disk capacity units for disk widget I/O.
|
||||||
- [#2224](https://github.com/ClementTsang/bottom/pull/2224): Add swap column for processes for Linux.
|
- [#2224](https://github.com/ClementTsang/bottom/pull/2224): Add swap column for processes for Linux.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- [#2260](https://github.com/ClementTsang/bottom/pull/2260): Enable scrollbars by default.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
- [#2225](https://github.com/ClementTsang/bottom/pull/2225): Fix waking up NVIDIA GPUs when getting stats on Linux.
|
||||||
|
- [#2261](https://github.com/ClementTsang/bottom/pull/2261): Fix scrollbars not drawing when height of bar was 2 or less.
|
||||||
|
|
||||||
### Other
|
### Other
|
||||||
|
|
||||||
- [#2227](https://github.com/ClementTsang/bottom/pull/2227): Add missing documentation around disk I/O graph.
|
- [#2227](https://github.com/ClementTsang/bottom/pull/2227): Add missing documentation around disk I/O graph.
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ mod test {
|
|||||||
left_to_right: false,
|
left_to_right: false,
|
||||||
is_basic: false,
|
is_basic: false,
|
||||||
show_table_scroll_position: true,
|
show_table_scroll_position: true,
|
||||||
show_table_scroll_bar: false,
|
show_table_scroll_bar: true,
|
||||||
show_current_entry_when_unfocused: false,
|
show_current_entry_when_unfocused: false,
|
||||||
};
|
};
|
||||||
let styling = DataTableStyling::default();
|
let styling = DataTableStyling::default();
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a [`PipeGauge`] and return what it would have rendered.
|
/// Create a [`PipeGauge`] and return what it would have rendered.
|
||||||
fn render_gauge(
|
fn render_test_gauge(
|
||||||
ratio: f64, bar_type: BarType, start_label: Option<&str>, inner_label: Option<&str>,
|
ratio: f64, bar_type: BarType, start_label: Option<&str>, inner_label: Option<&str>,
|
||||||
) -> String {
|
) -> String {
|
||||||
const WIDTH: u16 = 12;
|
const WIDTH: u16 = 12;
|
||||||
@@ -339,35 +339,44 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_pipe_bars() {
|
fn test_pipe_bars() {
|
||||||
assert_eq!(render_gauge(0.0, BarType::Pipe, None, None), "[ ]");
|
|
||||||
assert_eq!(render_gauge(0.5, BarType::Pipe, None, None), "[||||| ]");
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.95, BarType::Pipe, None, None),
|
render_test_gauge(0.0, BarType::Pipe, None, None),
|
||||||
|
"[ ]"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
render_test_gauge(0.5, BarType::Pipe, None, None),
|
||||||
|
"[||||| ]"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
render_test_gauge(0.95, BarType::Pipe, None, None),
|
||||||
"[||||||||| ]"
|
"[||||||||| ]"
|
||||||
);
|
);
|
||||||
assert_eq!(render_gauge(1.0, BarType::Pipe, None, None), "[||||||||||]");
|
assert_eq!(
|
||||||
|
render_test_gauge(1.0, BarType::Pipe, None, None),
|
||||||
|
"[||||||||||]"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_solid_bars() {
|
fn test_solid_bars() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.0, BarType::Block, None, None),
|
render_test_gauge(0.0, BarType::Block, None, None),
|
||||||
"[ ]"
|
"[ ]"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.5, BarType::Block, None, None),
|
render_test_gauge(0.5, BarType::Block, None, None),
|
||||||
"[█████ ]"
|
"[█████ ]"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.55, BarType::Block, None, None),
|
render_test_gauge(0.55, BarType::Block, None, None),
|
||||||
"[█████▌ ]"
|
"[█████▌ ]"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.9, BarType::Block, None, None),
|
render_test_gauge(0.9, BarType::Block, None, None),
|
||||||
"[█████████ ]"
|
"[█████████ ]"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(1.0, BarType::Block, None, None),
|
render_test_gauge(1.0, BarType::Block, None, None),
|
||||||
"[██████████]"
|
"[██████████]"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -375,15 +384,15 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_labelled_bars() {
|
fn test_labelled_bars() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.5, BarType::Pipe, Some("CPU"), Some(" 50%")),
|
render_test_gauge(0.5, BarType::Pipe, Some("CPU"), Some(" 50%")),
|
||||||
"CPU[||| 50%]"
|
"CPU[||| 50%]"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(0.5, BarType::Block, Some("CPU"), Some(" 50%")),
|
render_test_gauge(0.5, BarType::Block, Some("CPU"), Some(" 50%")),
|
||||||
"CPU[███ 50%]"
|
"CPU[███ 50%]"
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
render_gauge(1.0, BarType::Block, Some("CPU"), Some("100%")),
|
render_test_gauge(1.0, BarType::Block, Some("CPU"), Some("100%")),
|
||||||
"CPU[███100%]"
|
"CPU[███100%]"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,20 @@ pub fn draw_scroll_bar(f: &mut Frame<'_>, area: Rect, args: ScrollBarArgs) {
|
|||||||
end: "▼",
|
end: "▼",
|
||||||
};
|
};
|
||||||
|
|
||||||
let scrollbar = Scrollbar::new(ScrollbarOrientation::VerticalRight)
|
// If the height is only 2, then there's no room for the thumb,
|
||||||
.style(args.style)
|
// so instead we just draw a track with no arrows.
|
||||||
.symbols(SYMBOLS);
|
let scrollbar = {
|
||||||
|
let tmp = Scrollbar::new(ScrollbarOrientation::VerticalRight).style(args.style);
|
||||||
|
|
||||||
|
if area.height > 2 {
|
||||||
|
tmp.symbols(SYMBOLS)
|
||||||
|
} else {
|
||||||
|
tmp.track_symbol(Some(SYMBOLS.track))
|
||||||
|
.thumb_symbol(SYMBOLS.thumb)
|
||||||
|
.begin_symbol(None)
|
||||||
|
.end_symbol(None)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let mut state = ScrollbarState::new(args.content_length)
|
let mut state = ScrollbarState::new(args.content_length)
|
||||||
.position(args.position)
|
.position(args.position)
|
||||||
@@ -54,3 +65,53 @@ pub fn draw_scroll_bar(f: &mut Frame<'_>, area: Rect, args: ScrollBarArgs) {
|
|||||||
|
|
||||||
f.render_stateful_widget(scrollbar, area, &mut state);
|
f.render_stateful_widget(scrollbar, area, &mut state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
use ratatui::{Terminal, backend::TestBackend};
|
||||||
|
|
||||||
|
fn render_test_bar(height: u16, content_length: usize, position: usize) -> Vec<String> {
|
||||||
|
let mut terminal = Terminal::new(TestBackend::new(1, height)).unwrap();
|
||||||
|
terminal
|
||||||
|
.draw(|f| {
|
||||||
|
draw_scroll_bar(
|
||||||
|
f,
|
||||||
|
Rect::new(0, 0, 1, height),
|
||||||
|
ScrollBarArgs {
|
||||||
|
content_length,
|
||||||
|
viewport_length: 2,
|
||||||
|
position,
|
||||||
|
style: Style::default(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let buf = terminal.backend().buffer().clone();
|
||||||
|
(0..height)
|
||||||
|
.map(|y| buf[(0, y)].symbol().to_string())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Make sure that a short scrollbar (height <= 2) is still drawn, just without the head/tail arrows.
|
||||||
|
#[test]
|
||||||
|
fn test_small_height_scroll_still_drawn() {
|
||||||
|
assert_eq!(render_test_bar(1, 3, 0), ["█"]);
|
||||||
|
assert_eq!(render_test_bar(2, 3, 0), ["█", " "]);
|
||||||
|
assert_eq!(render_test_bar(2, 3, 2), [" ", "█"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_normal_height_scroll_all_drawn() {
|
||||||
|
assert_eq!(render_test_bar(3, 3, 0), ["▲", "█", "▼"]);
|
||||||
|
assert_eq!(render_test_bar(4, 3, 0), ["▲", "█", " ", "▼"]);
|
||||||
|
assert_eq!(render_test_bar(4, 3, 2), ["▲", " ", "█", "▼"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_no_scroll_bar_when_list_fits() {
|
||||||
|
assert_eq!(render_test_bar(4, 2, 0), [" ", " ", " ", " "]);
|
||||||
|
assert_eq!(render_test_bar(2, 1, 0), [" ", " "]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user