Partially working filtering logic

This commit is contained in:
2023-08-08 10:50:04 -06:00
parent afeb333100
commit 25730a3324
13 changed files with 362 additions and 48 deletions
+50 -1
View File
@@ -40,7 +40,7 @@ impl<T> Default for StatefulTable<T> {
}
}
impl<T: Clone> StatefulTable<T> {
impl<T: Clone + PartialEq + Eq> StatefulTable<T> {
pub fn set_items(&mut self, items: Vec<T>) {
let items_len = items.len();
self.items = items;
@@ -69,6 +69,55 @@ impl<T: Clone> StatefulTable<T> {
pub fn select_index(&mut self, index: Option<usize>) {
self.state.select(index);
}
pub fn scroll_up_with_filter<F>(&mut self, filter: F)
where
F: FnMut(&&T) -> bool,
{
let filtered_list: Vec<&T> = self.items.iter().filter(filter).collect();
let element_position = filtered_list
.iter()
.position(|&item| item == self.current_selection())
.unwrap();
if element_position == 0 {
let selected_index = self
.items
.iter()
.position(|item| item == filtered_list[filtered_list.len()]);
self.select_index(selected_index);
} else {
let selected_index = self
.items
.iter()
.position(|item| item == filtered_list[element_position - 1]);
self.select_index(selected_index)
}
}
pub fn scroll_down_with_filter<F>(&mut self, filter: F)
where
F: FnMut(&&T) -> bool,
{
let filtered_list: Vec<&T> = self.items.iter().filter(filter).collect();
let element_position = filtered_list
.iter()
.position(|&item| item == self.current_selection())
.unwrap();
if element_position + 1 > filtered_list.len() {
let selected_index = self.items.iter().position(|item| item == filtered_list[0]);
self.select_index(selected_index);
} else {
let selected_index = self
.items
.iter()
.position(|item| item == filtered_list[element_position + 1]);
self.select_index(selected_index)
}
}
}
impl<T> Scrollable for StatefulTable<T> {