summaryrefslogtreecommitdiffstats
path: root/native/src/overlay/menu.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-07-05 05:44:10 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-07-08 11:29:19 +0200
commit625979b6652a8a14a0eaf6bd62f1e9a8da0ae421 (patch)
tree0ed6994fc2ff0a8671bb6ec26bdae21af2b6fb23 /native/src/overlay/menu.rs
parent61f22b1db23f3495145a9a4f7255311fe8381998 (diff)
downloadiced-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.rs31
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(