From 625979b6652a8a14a0eaf6bd62f1e9a8da0ae421 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 5 Jul 2020 05:44:10 +0200 Subject: Draft `Widget::overlay` idempotency --- native/src/overlay/menu.rs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'native/src/overlay/menu.rs') 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( state: &'a mut State, options: impl Into>, - on_selected: Box Message>, + on_selected: &'a dyn Fn(T) -> Message, width: u16, target_height: f32, - text_size: u16, + text_size: Option, padding: u16, style: ::Style, ) -> Self @@ -175,8 +175,8 @@ where { hovered_option: &'a mut Option, options: Cow<'a, [T]>, - on_selected: Box Message>, - text_size: u16, + on_selected: &'a dyn Fn(T) -> Message, + text_size: Option, padding: u16, style: ::Style, } @@ -188,8 +188,8 @@ where pub fn new( hovered_option: &'a mut Option, options: impl Into>, - on_selected: Box Message>, - text_size: u16, + on_selected: &'a dyn Fn(T) -> Message, + text_size: Option, padding: u16, style: ::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, - _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( -- cgit