summaryrefslogtreecommitdiffstats
path: root/graphics/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-08-18 04:12:23 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-10-28 06:21:07 +0100
commit7f0276521447c36a3a6026fccc9abdb6e064132c (patch)
treea921d7eb80f592ea21cd888f09187d00a13d0056 /graphics/src
parentd328b07b3937c968fc8139f0b5c61903ebb893e7 (diff)
downloadiced-7f0276521447c36a3a6026fccc9abdb6e064132c.tar.gz
iced-7f0276521447c36a3a6026fccc9abdb6e064132c.tar.bz2
iced-7f0276521447c36a3a6026fccc9abdb6e064132c.zip
Draw only visible options in `overlay::Menu`
Diffstat (limited to 'graphics/src')
-rw-r--r--graphics/src/overlay/menu.rs15
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),
};