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.
|
/// 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,
|
&mut self,
|
||||||
ix: Option<usize>,
|
ix: Option<usize>,
|
||||||
window: &mut Window,
|
window: &mut Window,
|
||||||
|
|
@ -267,6 +267,17 @@ where
|
||||||
self.scroll_to_selected_item(window, cx);
|
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> {
|
pub fn selected_index(&self) -> Option<usize> {
|
||||||
self.selected_index
|
self.selected_index
|
||||||
}
|
}
|
||||||
|
|
@ -295,7 +306,7 @@ where
|
||||||
&self.vertical_scroll_handle
|
&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 {
|
if let Some(ix) = self.selected_index {
|
||||||
self.vertical_scroll_handle
|
self.vertical_scroll_handle
|
||||||
.scroll_to_item(ix, ScrollStrategy::Top);
|
.scroll_to_item(ix, ScrollStrategy::Top);
|
||||||
|
|
@ -320,9 +331,9 @@ where
|
||||||
let search = self.delegate.perform_search(&text, window, cx);
|
let search = self.delegate.perform_search(&text, window, cx);
|
||||||
|
|
||||||
if self.delegate.items_count(cx) > 0 {
|
if self.delegate.items_count(cx) > 0 {
|
||||||
self.set_selected_index(Some(0), window, cx);
|
self._set_selected_index(Some(0), window, cx);
|
||||||
} else {
|
} 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| {
|
self._search_task = cx.spawn_in(window, async move |this, window| {
|
||||||
|
|
@ -394,7 +405,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.reset_on_cancel {
|
if self.reset_on_cancel {
|
||||||
self.set_selected_index(None, window, cx);
|
self._set_selected_index(None, window, cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.delegate.cancel(window, cx);
|
self.delegate.cancel(window, cx);
|
||||||
|
|
@ -444,9 +455,9 @@ where
|
||||||
|
|
||||||
let mut selected_index = self.selected_index.unwrap_or(0);
|
let mut selected_index = self.selected_index.unwrap_or(0);
|
||||||
if selected_index > 0 {
|
if selected_index > 0 {
|
||||||
selected_index = selected_index - 1;
|
selected_index = selected_index.saturating_sub(1);
|
||||||
} else {
|
} else {
|
||||||
selected_index = items_count - 1;
|
selected_index = items_count.saturating_sub(1);
|
||||||
}
|
}
|
||||||
self.select_item(selected_index, window, cx);
|
self.select_item(selected_index, window, cx);
|
||||||
}
|
}
|
||||||
|
|
@ -464,7 +475,7 @@ where
|
||||||
|
|
||||||
let selected_index;
|
let selected_index;
|
||||||
if let Some(ix) = self.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;
|
selected_index = ix + 1;
|
||||||
} else {
|
} else {
|
||||||
// When the last item is selected, select the first item.
|
// When the last item is selected, select the first item.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue