Use Borrow for both options and selected in PickList
This commit is contained in:
parent
52e207b89b
commit
f53cfb8efa
5 changed files with 46 additions and 48 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue