diff options
author | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-06-19 21:19:11 -0400 |
---|---|---|
committer | Jeff Zhao <jeff.no.zhao@gmail.com> | 2021-06-19 21:19:11 -0400 |
commit | 4896bdfc3fc11f3a83a0c2a66fc6afc54fa3fcd1 (patch) | |
tree | a5dd4335cf315c8ba0cbf2c676213731da7e181e | |
parent | e6359a599e804031189eb9bc067c4eff9b01a1a8 (diff) |
fix crash if menu is larger than screen
-rw-r--r-- | src/ui/views/tui_command_menu.rs | 18 | ||||
-rw-r--r-- | src/ui/widgets/tui_menu.rs | 10 |
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); } } } |