add scrolling to pick_lists
This commit is contained in:
parent
08f5591148
commit
77e6e111e0
1 changed files with 68 additions and 0 deletions
|
|
@ -25,6 +25,7 @@ where
|
||||||
on_selected: Box<dyn Fn(T) -> Message>,
|
on_selected: Box<dyn Fn(T) -> Message>,
|
||||||
options: Cow<'a, [T]>,
|
options: Cow<'a, [T]>,
|
||||||
selected: Option<T>,
|
selected: Option<T>,
|
||||||
|
on_change: Option<Message>,
|
||||||
width: Length,
|
width: Length,
|
||||||
padding: u16,
|
padding: u16,
|
||||||
text_size: Option<u16>,
|
text_size: Option<u16>,
|
||||||
|
|
@ -82,6 +83,7 @@ where
|
||||||
on_selected: Box::new(on_selected),
|
on_selected: Box::new(on_selected),
|
||||||
options: options.into(),
|
options: options.into(),
|
||||||
selected,
|
selected,
|
||||||
|
on_change: None,
|
||||||
width: Length::Shrink,
|
width: Length::Shrink,
|
||||||
text_size: None,
|
text_size: None,
|
||||||
padding: Renderer::DEFAULT_PADDING,
|
padding: Renderer::DEFAULT_PADDING,
|
||||||
|
|
@ -114,6 +116,12 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the message sent when [`PickList`] selection changes
|
||||||
|
pub fn on_change(mut self, msg: Message) -> Self {
|
||||||
|
self.on_change = Some(msg);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the style of the [`PickList`].
|
/// Sets the style of the [`PickList`].
|
||||||
pub fn style(
|
pub fn style(
|
||||||
mut self,
|
mut self,
|
||||||
|
|
@ -247,6 +255,66 @@ where
|
||||||
event_status
|
event_status
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Event::Mouse(mouse::Event::WheelScrolled { delta })
|
||||||
|
if layout.bounds().contains(cursor_position)
|
||||||
|
&& !*self.is_open =>
|
||||||
|
{
|
||||||
|
let y = match delta {
|
||||||
|
mouse::ScrollDelta::Lines { y, .. }
|
||||||
|
| mouse::ScrollDelta::Pixels { y, .. } => y,
|
||||||
|
};
|
||||||
|
|
||||||
|
if y.is_sign_negative() {
|
||||||
|
if let Some(selected) = self.selected.as_ref() {
|
||||||
|
let i = self
|
||||||
|
.options
|
||||||
|
.iter()
|
||||||
|
.position(|option| option == selected)
|
||||||
|
.unwrap_or(0)
|
||||||
|
+ 1;
|
||||||
|
if i < self.options.len() {
|
||||||
|
messages.push((self.on_selected)(
|
||||||
|
self.options[i].clone(),
|
||||||
|
));
|
||||||
|
if let Some(msg) = self.on_change.take() {
|
||||||
|
messages.push(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
messages
|
||||||
|
.push((self.on_selected)(self.options[0].clone()));
|
||||||
|
if let Some(msg) = self.on_change.take() {
|
||||||
|
messages.push(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if let Some(selected) = self.selected.as_ref() {
|
||||||
|
let i = self
|
||||||
|
.options
|
||||||
|
.iter()
|
||||||
|
.position(|option| option == selected)
|
||||||
|
.unwrap_or(0);
|
||||||
|
if i != 0 {
|
||||||
|
messages.push((self.on_selected)(
|
||||||
|
self.options[i - 1].clone(),
|
||||||
|
));
|
||||||
|
if let Some(msg) = self.on_change.take() {
|
||||||
|
messages.push(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
messages.push((self.on_selected)(
|
||||||
|
self.options[self.options.len() - 1].clone(),
|
||||||
|
));
|
||||||
|
if let Some(msg) = self.on_change.take() {
|
||||||
|
messages.push(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return event::Status::Captured;
|
||||||
|
}
|
||||||
|
|
||||||
_ => event::Status::Ignored,
|
_ => event::Status::Ignored,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue