diff options
author | 2020-07-08 06:14:57 +0200 | |
---|---|---|
committer | 2020-07-08 11:29:20 +0200 | |
commit | 7a105ade27c7f33397e3050280e9faef928bdc1b (patch) | |
tree | 24e6a2b895457dafee0a284cde1419256f3d1e36 /native | |
parent | 9fa0b4da5d5356cb8bd4e79911a939fee0104790 (diff) | |
download | iced-7a105ade27c7f33397e3050280e9faef928bdc1b.tar.gz iced-7a105ade27c7f33397e3050280e9faef928bdc1b.tar.bz2 iced-7a105ade27c7f33397e3050280e9faef928bdc1b.zip |
Use `Borrow` to avoid clone in `ComboBox::overlay`
Diffstat (limited to 'native')
-rw-r--r-- | native/src/overlay/menu.rs | 35 | ||||
-rw-r--r-- | native/src/widget/combo_box.rs | 2 |
2 files changed, 15 insertions, 22 deletions
diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index 32cbacce..ffa3b14c 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -3,7 +3,7 @@ use crate::{ Element, Event, Hasher, Layout, Length, Point, Rectangle, Scrollable, Size, Vector, Widget, }; -use std::borrow::Cow; +use std::borrow::Borrow; pub struct Menu<'a, Message, Renderer: self::Renderer> { container: Container<'a, Message, Renderer>, @@ -36,9 +36,9 @@ where Message: 'static, Renderer: 'a, { - pub fn new<T: 'a>( + pub fn new<T>( state: &'a mut State, - options: impl Into<Cow<'a, [T]>>, + options: &'a dyn Borrow<[T]>, on_selected: &'a dyn Fn(T) -> Message, width: u16, target_height: f32, @@ -48,7 +48,7 @@ where ) -> Self where T: Clone + ToString, - [T]: ToOwned<Owned = Vec<T>>, + [T]: ToOwned, { let container = Container::new( Scrollable::new(&mut state.scrollable).push(List::new( @@ -173,25 +173,19 @@ where } } -struct List<'a, T, Message, Renderer: self::Renderer> -where - [T]: ToOwned, -{ +struct List<'a, T, Message, Renderer: self::Renderer> { hovered_option: &'a mut Option<usize>, - options: Cow<'a, [T]>, + options: &'a dyn Borrow<[T]>, on_selected: &'a dyn Fn(T) -> Message, text_size: Option<u16>, padding: u16, style: <Renderer as self::Renderer>::Style, } -impl<'a, T, Message, Renderer: self::Renderer> List<'a, T, Message, Renderer> -where - [T]: ToOwned, -{ +impl<'a, T, Message, Renderer: self::Renderer> List<'a, T, Message, Renderer> { pub fn new( hovered_option: &'a mut Option<usize>, - options: impl Into<Cow<'a, [T]>>, + options: &'a dyn Borrow<[T]>, on_selected: &'a dyn Fn(T) -> Message, text_size: Option<u16>, padding: u16, @@ -199,7 +193,7 @@ where ) -> Self { List { hovered_option, - options: options.into(), + options, on_selected, text_size, padding, @@ -211,8 +205,7 @@ where impl<'a, T, Message, Renderer: self::Renderer> Widget<'a, Message, Renderer> for List<'a, T, Message, Renderer> where - T: ToString + Clone, - [T]: ToOwned, + T: Clone + ToString, Renderer: self::Renderer, { fn width(&self) -> Length { @@ -237,7 +230,7 @@ where let intrinsic = Size::new( 0.0, f32::from(text_size + self.padding * 2) - * self.options.len() as f32, + * self.options.borrow().len() as f32, ); limits.resolve(intrinsic) @@ -252,7 +245,7 @@ where struct Marker; std::any::TypeId::of::<Marker>().hash(state); - self.options.len().hash(state); + self.options.borrow().len().hash(state); self.text_size.hash(state); self.padding.hash(state); } @@ -272,7 +265,7 @@ where if bounds.contains(cursor_position) { if let Some(index) = *self.hovered_option { - if let Some(option) = self.options.get(index) { + if let Some(option) = self.options.borrow().get(index) { messages.push((self.on_selected)(option.clone())); } } @@ -306,7 +299,7 @@ where renderer, layout.bounds(), cursor_position, - &self.options, + self.options.borrow(), *self.hovered_option, self.text_size.unwrap_or(renderer.default_size()), self.padding, diff --git a/native/src/widget/combo_box.rs b/native/src/widget/combo_box.rs index 4a509354..f2dc86e8 100644 --- a/native/src/widget/combo_box.rs +++ b/native/src/widget/combo_box.rs @@ -223,7 +223,7 @@ where layout.position(), Box::new(Menu::new( self.internal.menu, - self.options.clone(), + &self.options, &self.internal.on_selected, bounds.width.round() as u16, bounds.height, |