From 77e6e111e0f655487076ce0e4605fd3b143e0320 Mon Sep 17 00:00:00 2001 From: 13r0ck Date: Mon, 10 May 2021 14:29:35 -0600 Subject: add scrolling to pick_lists --- native/src/widget/pick_list.rs | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index 046d5779..eba15253 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -25,6 +25,7 @@ where on_selected: Box Message>, options: Cow<'a, [T]>, selected: Option, + on_change: Option, width: Length, padding: u16, text_size: Option, @@ -82,6 +83,7 @@ where on_selected: Box::new(on_selected), options: options.into(), selected, + on_change: None, width: Length::Shrink, text_size: None, padding: Renderer::DEFAULT_PADDING, @@ -114,6 +116,12 @@ where 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`]. pub fn style( mut self, @@ -247,6 +255,66 @@ where 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, } } -- cgit