diff options
author | 2020-10-29 02:00:56 +0100 | |
---|---|---|
committer | 2020-10-29 02:00:56 +0100 | |
commit | b40775fb7414b44307e343921ef015c65a916dab (patch) | |
tree | 06a3fad05b14d3b0f97687bf410fa8bbc04c9526 /graphics/src/overlay/menu.rs | |
parent | 8a3ce90959e281cd73a7486d800df8d65478a698 (diff) | |
parent | 91b1886968b498b913984bdfa4bee840e8821ec6 (diff) | |
download | iced-b40775fb7414b44307e343921ef015c65a916dab.tar.gz iced-b40775fb7414b44307e343921ef015c65a916dab.tar.bz2 iced-b40775fb7414b44307e343921ef015c65a916dab.zip |
Merge pull request #584 from hecrj/improvement/viewport-aware-drawing
Viewport aware drawing
Diffstat (limited to '')
-rw-r--r-- | graphics/src/overlay/menu.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/graphics/src/overlay/menu.rs b/graphics/src/overlay/menu.rs index a952f065..f42c5e3c 100644 --- a/graphics/src/overlay/menu.rs +++ b/graphics/src/overlay/menu.rs @@ -42,6 +42,7 @@ where &mut self, bounds: Rectangle, cursor_position: Point, + viewport: &Rectangle, options: &[T], hovered_option: Option<usize>, padding: u16, @@ -52,16 +53,24 @@ where use std::f32; let is_mouse_over = bounds.contains(cursor_position); + let option_height = text_size as usize + padding as usize * 2; let mut primitives = Vec::new(); - for (i, option) in options.iter().enumerate() { + let offset = viewport.y - bounds.y; + let start = (offset / option_height as f32) as usize; + let end = + ((offset + viewport.height) / option_height as f32).ceil() as usize; + + let visible_options = &options[start..end.min(options.len())]; + + for (i, option) in visible_options.iter().enumerate() { + let i = start + i; let is_selected = hovered_option == Some(i); let bounds = Rectangle { x: bounds.x, - y: bounds.y - + ((text_size as usize + padding as usize * 2) * i) as f32, + y: bounds.y + (option_height * i) as f32, width: bounds.width, height: f32::from(text_size + padding * 2), }; |