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> {
+8 -8
View File
@@ -19,7 +19,7 @@ pub struct SystemStatus {
pub start_time: DateTime<Utc>,
}
#[derive(Derivative, Deserialize, Debug, Clone)]
#[derive(Derivative, Deserialize, Debug, Clone, PartialEq, Eq)]
#[derivative(Default)]
#[serde(rename_all = "camelCase")]
pub struct Movie {
@@ -48,7 +48,7 @@ pub struct Movie {
pub collection: Option<Collection>,
}
#[derive(Derivative, Deserialize, Debug, Clone)]
#[derive(Derivative, Deserialize, Debug, Clone, PartialEq, Eq)]
#[derivative(Default)]
#[serde(rename_all = "camelCase")]
pub struct CollectionMovie {
@@ -62,7 +62,7 @@ pub struct CollectionMovie {
pub ratings: RatingsList,
}
#[derive(Deserialize, Derivative, Clone, Debug)]
#[derive(Deserialize, Derivative, Clone, Debug, PartialEq, Eq)]
#[derivative(Default)]
#[serde(rename_all = "camelCase")]
pub struct Collection {
@@ -75,7 +75,7 @@ pub struct Collection {
pub movies: Option<Vec<CollectionMovie>>,
}
#[derive(Deserialize, Derivative, Debug, Clone)]
#[derive(Deserialize, Derivative, Debug, Clone, PartialEq, Eq)]
#[derivative(Default)]
#[serde(rename_all = "camelCase")]
pub struct MovieFile {
@@ -85,7 +85,7 @@ pub struct MovieFile {
pub media_info: MediaInfo,
}
#[derive(Deserialize, Derivative, Debug, Clone)]
#[derive(Deserialize, Derivative, Debug, Clone, PartialEq, Eq)]
#[derivative(Default)]
#[serde(rename_all = "camelCase")]
pub struct MediaInfo {
@@ -109,7 +109,7 @@ pub struct MediaInfo {
pub scan_type: String,
}
#[derive(Default, Deserialize, Debug, Clone)]
#[derive(Default, Deserialize, Debug, Clone, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RatingsList {
pub imdb: Option<Rating>,
@@ -117,7 +117,7 @@ pub struct RatingsList {
pub rotten_tomatoes: Option<Rating>,
}
#[derive(Derivative, Deserialize, Debug, Clone)]
#[derive(Derivative, Deserialize, Debug, Clone, PartialEq, Eq)]
#[derivative(Default)]
pub struct Rating {
#[derivative(Default(value = "Number::from(0)"))]
@@ -189,7 +189,7 @@ pub enum CreditType {
Crew,
}
#[derive(Deserialize, Clone, Debug)]
#[derive(Deserialize, Clone, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Credit {
pub person_name: String,