Use Borrow for both options and selected in PickList

This commit is contained in:
Héctor Ramón Jiménez 2024-02-14 03:54:40 +01:00
parent 52e207b89b
commit f53cfb8efa
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
5 changed files with 46 additions and 48 deletions

View file

@ -88,11 +88,7 @@ impl Application for Layout {
horizontal_space(Length::Fill), horizontal_space(Length::Fill),
checkbox("Explain", self.explain) checkbox("Explain", self.explain)
.on_toggle(Message::ExplainToggled), .on_toggle(Message::ExplainToggled),
pick_list( pick_list(Theme::ALL, Some(&self.theme), Message::ThemeSelected),
Theme::ALL,
Some(self.theme.clone()),
Message::ThemeSelected
),
] ]
.spacing(20) .spacing(20)
.align_items(Alignment::Center); .align_items(Alignment::Center);

View file

@ -60,11 +60,7 @@ impl Sandbox for QRGenerator {
let choose_theme = row![ let choose_theme = row![
text("Theme:"), text("Theme:"),
pick_list( pick_list(Theme::ALL, Some(&self.theme), Message::ThemeChanged,)
Theme::ALL,
Some(self.theme.clone()),
Message::ThemeChanged,
)
] ]
.spacing(10) .spacing(10)
.align_items(Alignment::Center); .align_items(Alignment::Center);

View file

@ -55,12 +55,8 @@ impl Sandbox for Styling {
fn view(&self) -> Element<Message> { fn view(&self) -> Element<Message> {
let choose_theme = column![ let choose_theme = column![
text("Theme:"), text("Theme:"),
pick_list( pick_list(Theme::ALL, Some(&self.theme), Message::ThemeChanged)
Theme::ALL, .width(Length::Fill),
Some(self.theme.clone()),
Message::ThemeChanged
)
.width(Length::Fill),
] ]
.spacing(10); .spacing(10);

View file

@ -22,7 +22,7 @@ use crate::toggler::{self, Toggler};
use crate::tooltip::{self, Tooltip}; use crate::tooltip::{self, Tooltip};
use crate::{Column, MouseArea, Row, Space, Themer, VerticalSlider}; use crate::{Column, MouseArea, Row, Space, Themer, VerticalSlider};
use std::borrow::Cow; use std::borrow::Borrow;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
/// Creates a [`Column`] with the given children. /// Creates a [`Column`] with the given children.
@ -264,14 +264,15 @@ where
/// Creates a new [`PickList`]. /// Creates a new [`PickList`].
/// ///
/// [`PickList`]: crate::PickList /// [`PickList`]: crate::PickList
pub fn pick_list<'a, Message, Theme, Renderer, T>( pub fn pick_list<'a, T, L, V, Message, Theme, Renderer>(
options: impl Into<Cow<'a, [T]>>, options: L,
selected: Option<T>, selected: Option<V>,
on_selected: impl Fn(T) -> Message + 'a, on_selected: impl Fn(T) -> Message + 'a,
) -> PickList<'a, T, Message, Theme, Renderer> ) -> PickList<'a, T, L, V, Message, Theme, Renderer>
where where
T: ToString + PartialEq + 'static, T: ToString + PartialEq + Clone + 'a,
[T]: ToOwned<Owned = Vec<T>>, L: Borrow<[T]> + 'a,
V: Borrow<T> + 'a,
Message: Clone, Message: Clone,
Renderer: core::text::Renderer, Renderer: core::text::Renderer,
Theme: pick_list::StyleSheet Theme: pick_list::StyleSheet

View file

@ -17,7 +17,7 @@ use crate::core::{
use crate::overlay::menu::{self, Menu}; use crate::overlay::menu::{self, Menu};
use crate::scrollable; use crate::scrollable;
use std::borrow::Cow; use std::borrow::Borrow;
pub use crate::style::pick_list::{Appearance, StyleSheet}; pub use crate::style::pick_list::{Appearance, StyleSheet};
@ -26,20 +26,24 @@ pub use crate::style::pick_list::{Appearance, StyleSheet};
pub struct PickList< pub struct PickList<
'a, 'a,
T, T,
L,
V,
Message, Message,
Theme = crate::Theme, Theme = crate::Theme,
Renderer = crate::Renderer, Renderer = crate::Renderer,
> where > where
[T]: ToOwned<Owned = Vec<T>>, T: ToString + PartialEq + Clone,
L: Borrow<[T]> + 'a,
V: Borrow<T> + 'a,
Theme: StyleSheet, Theme: StyleSheet,
Renderer: text::Renderer, Renderer: text::Renderer,
{ {
on_select: Box<dyn Fn(T) -> Message + 'a>, on_select: Box<dyn Fn(T) -> Message + 'a>,
on_open: Option<Message>, on_open: Option<Message>,
on_close: Option<Message>, on_close: Option<Message>,
options: Cow<'a, [T]>, options: L,
placeholder: Option<String>, placeholder: Option<String>,
selected: Option<T>, selected: Option<V>,
width: Length, width: Length,
padding: Padding, padding: Padding,
text_size: Option<Pixels>, text_size: Option<Pixels>,
@ -50,11 +54,12 @@ pub struct PickList<
style: Theme::Style, style: Theme::Style,
} }
impl<'a, T: 'a, Message, Theme, Renderer> impl<'a, T, L, V, Message, Theme, Renderer>
PickList<'a, T, Message, Theme, Renderer> PickList<'a, T, L, V, Message, Theme, Renderer>
where where
T: ToString + PartialEq, T: ToString + PartialEq + Clone,
[T]: ToOwned<Owned = Vec<T>>, L: Borrow<[T]> + 'a,
V: Borrow<T> + 'a,
Message: Clone, Message: Clone,
Theme: StyleSheet Theme: StyleSheet
+ scrollable::StyleSheet + scrollable::StyleSheet
@ -69,15 +74,15 @@ where
/// Creates a new [`PickList`] with the given list of options, the current /// Creates a new [`PickList`] with the given list of options, the current
/// selected value, and the message to produce when an option is selected. /// selected value, and the message to produce when an option is selected.
pub fn new( pub fn new(
options: impl Into<Cow<'a, [T]>>, options: L,
selected: Option<T>, selected: Option<V>,
on_select: impl Fn(T) -> Message + 'a, on_select: impl Fn(T) -> Message + 'a,
) -> Self { ) -> Self {
Self { Self {
on_select: Box::new(on_select), on_select: Box::new(on_select),
on_open: None, on_open: None,
on_close: None, on_close: None,
options: options.into(), options,
placeholder: None, placeholder: None,
selected, selected,
width: Length::Shrink, width: Length::Shrink,
@ -164,11 +169,12 @@ where
} }
} }
impl<'a, T: 'a, Message, Theme, Renderer> Widget<Message, Theme, Renderer> impl<'a, T, L, V, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for PickList<'a, T, Message, Theme, Renderer> for PickList<'a, T, L, V, Message, Theme, Renderer>
where where
T: Clone + ToString + PartialEq + 'static, T: Clone + ToString + PartialEq + 'a,
[T]: ToOwned<Owned = Vec<T>>, L: Borrow<[T]>,
V: Borrow<T>,
Message: Clone + 'a, Message: Clone + 'a,
Theme: StyleSheet Theme: StyleSheet
+ scrollable::StyleSheet + scrollable::StyleSheet
@ -209,7 +215,7 @@ where
self.text_shaping, self.text_shaping,
self.font, self.font,
self.placeholder.as_deref(), self.placeholder.as_deref(),
&self.options, self.options.borrow(),
) )
} }
@ -232,8 +238,8 @@ where
self.on_select.as_ref(), self.on_select.as_ref(),
self.on_open.as_ref(), self.on_open.as_ref(),
self.on_close.as_ref(), self.on_close.as_ref(),
self.selected.as_ref(), self.selected.as_ref().map(Borrow::borrow),
&self.options, self.options.borrow(),
|| tree.state.downcast_mut::<State<Renderer::Paragraph>>(), || tree.state.downcast_mut::<State<Renderer::Paragraph>>(),
) )
} }
@ -271,7 +277,7 @@ where
self.text_shaping, self.text_shaping,
font, font,
self.placeholder.as_deref(), self.placeholder.as_deref(),
self.selected.as_ref(), self.selected.as_ref().map(Borrow::borrow),
&self.handle, &self.handle,
&self.style, &self.style,
|| tree.state.downcast_ref::<State<Renderer::Paragraph>>(), || tree.state.downcast_ref::<State<Renderer::Paragraph>>(),
@ -296,19 +302,20 @@ where
self.text_size, self.text_size,
self.text_shaping, self.text_shaping,
self.font.unwrap_or_else(|| renderer.default_font()), self.font.unwrap_or_else(|| renderer.default_font()),
&self.options, self.options.borrow(),
&self.on_select, &self.on_select,
self.style.clone(), self.style.clone(),
) )
} }
} }
impl<'a, T: 'a, Message, Theme, Renderer> impl<'a, T, L, V, Message, Theme, Renderer>
From<PickList<'a, T, Message, Theme, Renderer>> From<PickList<'a, T, L, V, Message, Theme, Renderer>>
for Element<'a, Message, Theme, Renderer> for Element<'a, Message, Theme, Renderer>
where where
T: Clone + ToString + PartialEq + 'static, T: Clone + ToString + PartialEq + 'a,
[T]: ToOwned<Owned = Vec<T>>, L: Borrow<[T]> + 'a,
V: Borrow<T> + 'a,
Message: Clone + 'a, Message: Clone + 'a,
Theme: StyleSheet Theme: StyleSheet
+ scrollable::StyleSheet + scrollable::StyleSheet
@ -318,7 +325,9 @@ where
<Theme as menu::StyleSheet>::Style: From<<Theme as StyleSheet>::Style>, <Theme as menu::StyleSheet>::Style: From<<Theme as StyleSheet>::Style>,
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
{ {
fn from(pick_list: PickList<'a, T, Message, Theme, Renderer>) -> Self { fn from(
pick_list: PickList<'a, T, L, V, Message, Theme, Renderer>,
) -> Self {
Self::new(pick_list) Self::new(pick_list)
} }
} }