summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Zhao <jeff.no.zhao@gmail.com>2021-06-19 21:19:11 -0400
committerJeff Zhao <jeff.no.zhao@gmail.com>2021-06-19 21:19:11 -0400
commit4896bdfc3fc11f3a83a0c2a66fc6afc54fa3fcd1 (patch)
treea5dd4335cf315c8ba0cbf2c676213731da7e181e
parente6359a599e804031189eb9bc067c4eff9b01a1a8 (diff)
fix crash if menu is larger than screen
-rw-r--r--src/ui/views/tui_command_menu.rs18
-rw-r--r--src/ui/widgets/tui_menu.rs10
2 files changed, 17 insertions, 11 deletions
diff --git a/src/ui/views/tui_command_menu.rs b/src/ui/views/tui_command_menu.rs
index 434d15e..c1bc627 100644
--- a/src/ui/views/tui_command_menu.rs
+++ b/src/ui/views/tui_command_menu.rs
@@ -36,11 +36,11 @@ impl TuiCommandMenu {
loop {
let _ = terminal.draw(|frame| {
- let f_size: Rect = frame.size();
+ let area = frame.size();
{
let view = TuiView::new(&context);
- frame.render_widget(view, f_size);
+ frame.render_widget(view, area);
}
{
@@ -54,21 +54,27 @@ impl TuiCommandMenu {
let display_str: Vec<&str> = display_vec.iter().map(|v| v.as_str()).collect();
let display_str_len = display_str.len();
- let y = if (f_size.height as usize)
+ let y = if (area.height as usize)
< display_str_len + BORDER_HEIGHT + BOTTOM_MARGIN
{
0
} else {
- f_size.height
+ area.height
- (BORDER_HEIGHT + BOTTOM_MARGIN) as u16
- display_str_len as u16
};
+ let menu_height = if display_str_len + BORDER_HEIGHT > area.height as usize {
+ area.height
+ } else {
+ (display_str_len + BORDER_HEIGHT) as u16
+ };
+
let menu_rect = Rect {
x: 0,
y,
- width: f_size.width,
- height: (display_str_len + BORDER_HEIGHT) as u16,
+ width: area.width,
+ height: menu_height,
};
frame.render_widget(Clear, menu_rect);
diff --git a/src/ui/widgets/tui_menu.rs b/src/ui/widgets/tui_menu.rs
index 2634662..66fa38d 100644
--- a/src/ui/widgets/tui_menu.rs
+++ b/src/ui/widgets/tui_menu.rs
@@ -19,18 +19,18 @@ impl<'a> TuiMenu<'a> {
impl<'a> Widget for TuiMenu<'a> {
fn render(self, area: Rect, buf: &mut Buffer) {
- let text_iter = self.options.iter().chain(&[" "]);
let style = Style::default().fg(Color::Reset).bg(Color::Reset);
- let area_x = area.x + 1;
- let area_y = area.y + 1;
Block::default()
.style(style)
.borders(Borders::TOP)
.render(area, buf);
- for (i, text) in text_iter.enumerate() {
- buf.set_string(area_x, area_y + i as u16, text, style);
+ let text_iter = self.options.iter().chain(&[" "]);
+ let area_x = area.x + 1;
+
+ for (y, text) in (1..area.height).zip(text_iter) {
+ buf.set_string(area_x, y, text, style);
}
}
}