Abstract and improve scroll logic in PickList

This commit is contained in:
Héctor Ramón Jiménez 2021-07-22 21:15:35 +07:00
parent fbfb28b8d4
commit 6069e90c9b
No known key found for this signature in database
GPG key ID: 140CC052C94F138E

View file

@ -256,37 +256,33 @@ where
| mouse::ScrollDelta::Pixels { y, .. } => y, | mouse::ScrollDelta::Pixels { y, .. } => y,
}; };
if y.is_sign_negative() { fn find_next<'a, T: PartialEq>(
let mut options_iter = self.options.iter(); selected: &'a T,
mut options: impl Iterator<Item = &'a T>,
) -> Option<&'a T> {
let _ = options.find(|&option| option == selected);
options.next()
}
let next_option = if y < 0.0 {
if let Some(selected) = self.selected.as_ref() { if let Some(selected) = self.selected.as_ref() {
if let Some(_) = find_next(selected, self.options.iter())
options_iter.position(|o| o == selected)
{
if let Some(prev_val) = options_iter.next() {
messages
.push((self.on_selected)(prev_val.clone()));
}
}
} else { } else {
messages self.options.first()
.push((self.on_selected)(self.options[0].clone())); }
} else if y > 0.0 {
if let Some(selected) = self.selected.as_ref() {
find_next(selected, self.options.iter().rev())
} else {
self.options.last()
} }
} else { } else {
let mut options_iter = self.options.iter().rev(); None
if let Some(selected) = self.selected.as_ref() { };
if let Some(_) =
options_iter.position(|o| o == selected) if let Some(next_option) = next_option {
{ messages.push((self.on_selected)(next_option.clone()));
if let Some(next_val) = options_iter.next() {
messages
.push((self.on_selected)(next_val.clone()));
}
}
} else {
messages.push((self.on_selected)(
self.options[self.options.len() - 1].clone(),
));
}
} }
return event::Status::Captured; return event::Status::Captured;