list: Improve the selection method to support more scenarios (#925)
This commit is contained in:
parent
d598e58666
commit
01197769df
1 changed files with 19 additions and 8 deletions
|
|
@ -256,7 +256,7 @@ where
|
|||
}
|
||||
|
||||
/// Set the selected index of the list, this will also scroll to the selected item.
|
||||
pub fn set_selected_index(
|
||||
fn _set_selected_index(
|
||||
&mut self,
|
||||
ix: Option<usize>,
|
||||
window: &mut Window,
|
||||
|
|
@ -267,6 +267,17 @@ where
|
|||
self.scroll_to_selected_item(window, cx);
|
||||
}
|
||||
|
||||
/// Set the selected index of the list, this method will not scroll to the selected item.
|
||||
pub fn set_selected_index(
|
||||
&mut self,
|
||||
ix: Option<usize>,
|
||||
window: &mut Window,
|
||||
cx: &mut Context<Self>,
|
||||
) {
|
||||
self.selected_index = ix;
|
||||
self.delegate.set_selected_index(ix, window, cx);
|
||||
}
|
||||
|
||||
pub fn selected_index(&self) -> Option<usize> {
|
||||
self.selected_index
|
||||
}
|
||||
|
|
@ -295,7 +306,7 @@ where
|
|||
&self.vertical_scroll_handle
|
||||
}
|
||||
|
||||
fn scroll_to_selected_item(&mut self, _window: &mut Window, _cx: &mut Context<Self>) {
|
||||
pub fn scroll_to_selected_item(&mut self, _window: &mut Window, _cx: &mut Context<Self>) {
|
||||
if let Some(ix) = self.selected_index {
|
||||
self.vertical_scroll_handle
|
||||
.scroll_to_item(ix, ScrollStrategy::Top);
|
||||
|
|
@ -320,9 +331,9 @@ where
|
|||
let search = self.delegate.perform_search(&text, window, cx);
|
||||
|
||||
if self.delegate.items_count(cx) > 0 {
|
||||
self.set_selected_index(Some(0), window, cx);
|
||||
self._set_selected_index(Some(0), window, cx);
|
||||
} else {
|
||||
self.set_selected_index(None, window, cx);
|
||||
self._set_selected_index(None, window, cx);
|
||||
}
|
||||
|
||||
self._search_task = cx.spawn_in(window, async move |this, window| {
|
||||
|
|
@ -394,7 +405,7 @@ where
|
|||
}
|
||||
|
||||
if self.reset_on_cancel {
|
||||
self.set_selected_index(None, window, cx);
|
||||
self._set_selected_index(None, window, cx);
|
||||
}
|
||||
|
||||
self.delegate.cancel(window, cx);
|
||||
|
|
@ -444,9 +455,9 @@ where
|
|||
|
||||
let mut selected_index = self.selected_index.unwrap_or(0);
|
||||
if selected_index > 0 {
|
||||
selected_index = selected_index - 1;
|
||||
selected_index = selected_index.saturating_sub(1);
|
||||
} else {
|
||||
selected_index = items_count - 1;
|
||||
selected_index = items_count.saturating_sub(1);
|
||||
}
|
||||
self.select_item(selected_index, window, cx);
|
||||
}
|
||||
|
|
@ -464,7 +475,7 @@ where
|
|||
|
||||
let selected_index;
|
||||
if let Some(ix) = self.selected_index {
|
||||
if ix < items_count - 1 {
|
||||
if ix < items_count.saturating_sub(1) {
|
||||
selected_index = ix + 1;
|
||||
} else {
|
||||
// When the last item is selected, select the first item.
|
||||
|
|
|
|||
Loading…
Reference in a new issue