diff options
author | 2020-07-05 05:44:10 +0200 | |
---|---|---|
committer | 2020-07-08 11:29:19 +0200 | |
commit | 625979b6652a8a14a0eaf6bd62f1e9a8da0ae421 (patch) | |
tree | 0ed6994fc2ff0a8671bb6ec26bdae21af2b6fb23 /native/src/overlay/menu.rs | |
parent | 61f22b1db23f3495145a9a4f7255311fe8381998 (diff) | |
download | iced-625979b6652a8a14a0eaf6bd62f1e9a8da0ae421.tar.gz iced-625979b6652a8a14a0eaf6bd62f1e9a8da0ae421.tar.bz2 iced-625979b6652a8a14a0eaf6bd62f1e9a8da0ae421.zip |
Draft `Widget::overlay` idempotency
Diffstat (limited to 'native/src/overlay/menu.rs')
-rw-r--r-- | native/src/overlay/menu.rs | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 9c180671..2a19e286 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -1,5 +1,5 @@ use crate::{ - container, layout, mouse, overlay, scrollable, Clipboard, Container, + container, layout, mouse, overlay, scrollable, text, Clipboard, Container, Element, Event, Hasher, Layout, Length, Point, Rectangle, Scrollable, Size, Vector, Widget, }; @@ -39,10 +39,10 @@ where pub fn new<T: 'a>( state: &'a mut State, options: impl Into<Cow<'a, [T]>>, - on_selected: Box<dyn Fn(T) -> Message>, + on_selected: &'a dyn Fn(T) -> Message, width: u16, target_height: f32, - text_size: u16, + text_size: Option<u16>, padding: u16, style: <Renderer as self::Renderer>::Style, ) -> Self @@ -175,8 +175,8 @@ where { hovered_option: &'a mut Option<usize>, options: Cow<'a, [T]>, - on_selected: Box<dyn Fn(T) -> Message>, - text_size: u16, + on_selected: &'a dyn Fn(T) -> Message, + text_size: Option<u16>, padding: u16, style: <Renderer as self::Renderer>::Style, } @@ -188,8 +188,8 @@ where pub fn new( hovered_option: &'a mut Option<usize>, options: impl Into<Cow<'a, [T]>>, - on_selected: Box<dyn Fn(T) -> Message>, - text_size: u16, + on_selected: &'a dyn Fn(T) -> Message, + text_size: Option<u16>, padding: u16, style: <Renderer as self::Renderer>::Style, ) -> Self { @@ -221,17 +221,18 @@ where fn layout( &self, - _renderer: &Renderer, + renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { use std::f32; let limits = limits.width(Length::Fill).height(Length::Shrink); + let text_size = self.text_size.unwrap_or(renderer.default_size()); let size = { let intrinsic = Size::new( 0.0, - f32::from(self.text_size + self.padding * 2) + f32::from(text_size + self.padding * 2) * self.options.len() as f32, ); @@ -253,7 +254,7 @@ where layout: Layout<'_>, cursor_position: Point, messages: &mut Vec<Message>, - _renderer: &Renderer, + renderer: &Renderer, _clipboard: Option<&dyn Clipboard>, ) { match event { @@ -270,11 +271,13 @@ where } Event::Mouse(mouse::Event::CursorMoved { .. }) => { let bounds = layout.bounds(); + let text_size = + self.text_size.unwrap_or(renderer.default_size()); if bounds.contains(cursor_position) { *self.hovered_option = Some( ((cursor_position.y - bounds.y) - / f32::from(self.text_size + self.padding * 2)) + / f32::from(text_size + self.padding * 2)) as usize, ); } @@ -296,14 +299,16 @@ where cursor_position, &self.options, *self.hovered_option, - self.text_size, + self.text_size.unwrap_or(renderer.default_size()), self.padding, &self.style, ) } } -pub trait Renderer: scrollable::Renderer + container::Renderer { +pub trait Renderer: + scrollable::Renderer + container::Renderer + text::Renderer +{ type Style: Default + Clone; fn decorate( |