Use Borrow to avoid clone in ComboBox::overlay

This commit is contained in:
Héctor Ramón Jiménez 2020-07-08 06:14:57 +02:00
parent 9fa0b4da5d
commit 7a105ade27
2 changed files with 15 additions and 22 deletions

View File

@ -3,7 +3,7 @@ use crate::{
Element, Event, Hasher, Layout, Length, Point, Rectangle, Scrollable, Size, Element, Event, Hasher, Layout, Length, Point, Rectangle, Scrollable, Size,
Vector, Widget, Vector, Widget,
}; };
use std::borrow::Cow; use std::borrow::Borrow;
pub struct Menu<'a, Message, Renderer: self::Renderer> { pub struct Menu<'a, Message, Renderer: self::Renderer> {
container: Container<'a, Message, Renderer>, container: Container<'a, Message, Renderer>,
@ -36,9 +36,9 @@ where
Message: 'static, Message: 'static,
Renderer: 'a, Renderer: 'a,
{ {
pub fn new<T: 'a>( pub fn new<T>(
state: &'a mut State, state: &'a mut State,
options: impl Into<Cow<'a, [T]>>, options: &'a dyn Borrow<[T]>,
on_selected: &'a dyn Fn(T) -> Message, on_selected: &'a dyn Fn(T) -> Message,
width: u16, width: u16,
target_height: f32, target_height: f32,
@ -48,7 +48,7 @@ where
) -> Self ) -> Self
where where
T: Clone + ToString, T: Clone + ToString,
[T]: ToOwned<Owned = Vec<T>>, [T]: ToOwned,
{ {
let container = Container::new( let container = Container::new(
Scrollable::new(&mut state.scrollable).push(List::new( Scrollable::new(&mut state.scrollable).push(List::new(
@ -173,25 +173,19 @@ where
} }
} }
struct List<'a, T, Message, Renderer: self::Renderer> struct List<'a, T, Message, Renderer: self::Renderer> {
where
[T]: ToOwned,
{
hovered_option: &'a mut Option<usize>, hovered_option: &'a mut Option<usize>,
options: Cow<'a, [T]>, options: &'a dyn Borrow<[T]>,
on_selected: &'a dyn Fn(T) -> Message, on_selected: &'a dyn Fn(T) -> Message,
text_size: Option<u16>, text_size: Option<u16>,
padding: u16, padding: u16,
style: <Renderer as self::Renderer>::Style, style: <Renderer as self::Renderer>::Style,
} }
impl<'a, T, Message, Renderer: self::Renderer> List<'a, T, Message, Renderer> impl<'a, T, Message, Renderer: self::Renderer> List<'a, T, Message, Renderer> {
where
[T]: ToOwned,
{
pub fn new( pub fn new(
hovered_option: &'a mut Option<usize>, hovered_option: &'a mut Option<usize>,
options: impl Into<Cow<'a, [T]>>, options: &'a dyn Borrow<[T]>,
on_selected: &'a dyn Fn(T) -> Message, on_selected: &'a dyn Fn(T) -> Message,
text_size: Option<u16>, text_size: Option<u16>,
padding: u16, padding: u16,
@ -199,7 +193,7 @@ where
) -> Self { ) -> Self {
List { List {
hovered_option, hovered_option,
options: options.into(), options,
on_selected, on_selected,
text_size, text_size,
padding, padding,
@ -211,8 +205,7 @@ where
impl<'a, T, Message, Renderer: self::Renderer> Widget<'a, Message, Renderer> impl<'a, T, Message, Renderer: self::Renderer> Widget<'a, Message, Renderer>
for List<'a, T, Message, Renderer> for List<'a, T, Message, Renderer>
where where
T: ToString + Clone, T: Clone + ToString,
[T]: ToOwned,
Renderer: self::Renderer, Renderer: self::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
@ -237,7 +230,7 @@ where
let intrinsic = Size::new( let intrinsic = Size::new(
0.0, 0.0,
f32::from(text_size + self.padding * 2) f32::from(text_size + self.padding * 2)
* self.options.len() as f32, * self.options.borrow().len() as f32,
); );
limits.resolve(intrinsic) limits.resolve(intrinsic)
@ -252,7 +245,7 @@ where
struct Marker; struct Marker;
std::any::TypeId::of::<Marker>().hash(state); std::any::TypeId::of::<Marker>().hash(state);
self.options.len().hash(state); self.options.borrow().len().hash(state);
self.text_size.hash(state); self.text_size.hash(state);
self.padding.hash(state); self.padding.hash(state);
} }
@ -272,7 +265,7 @@ where
if bounds.contains(cursor_position) { if bounds.contains(cursor_position) {
if let Some(index) = *self.hovered_option { 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())); messages.push((self.on_selected)(option.clone()));
} }
} }
@ -306,7 +299,7 @@ where
renderer, renderer,
layout.bounds(), layout.bounds(),
cursor_position, cursor_position,
&self.options, self.options.borrow(),
*self.hovered_option, *self.hovered_option,
self.text_size.unwrap_or(renderer.default_size()), self.text_size.unwrap_or(renderer.default_size()),
self.padding, self.padding,

View File

@ -223,7 +223,7 @@ where
layout.position(), layout.position(),
Box::new(Menu::new( Box::new(Menu::new(
self.internal.menu, self.internal.menu,
self.options.clone(), &self.options,
&self.internal.on_selected, &self.internal.on_selected,
bounds.width.round() as u16, bounds.width.round() as u16,
bounds.height, bounds.height,