diff --git a/src/rust/image_model.rs b/src/rust/image_model.rs index 3549017..039eef0 100644 --- a/src/rust/image_model.rs +++ b/src/rust/image_model.rs @@ -75,6 +75,8 @@ mod image_model { self: Pin<&mut ImageModel>, index: i32, ) -> QMap_QString_QVariant; + #[qinvokable] + fn search(self: Pin<&mut ImageModel>, search_term: QString); } impl cxx_qt::Threading for ImageModel {} @@ -161,6 +163,7 @@ use diesel::sqlite::SqliteConnection; use diesel::{delete, insert_into, prelude::*, update}; use std::path::PathBuf; use std::pin::Pin; +use tracing::debug; use self::image_model::{ ImageRoles, QHash_i32_QByteArray, QMap_QString_QVariant, @@ -171,8 +174,8 @@ use self::image_model::{ /// Idk what this is but it's cool pub struct Image { id: i32, - title: QString, - path: QString, + title: String, + path: String, } #[derive(Default, Debug)] @@ -180,6 +183,7 @@ pub struct ImageModelRust { count: i32, highest_id: i32, images: Vec, + inner_images: Vec, } impl image_model::ImageModel { @@ -211,8 +215,8 @@ impl image_model::ImageModel { let img = self::Image { id: image.id, - title: QString::from(&image.title), - path: QString::from(&image.path), + title: image.title, + path: image.path, }; self.as_mut().add_image(img); @@ -245,6 +249,10 @@ impl image_model::ImageModel { .rust_mut() .images .remove(index as usize); + self.as_mut() + .rust_mut() + .inner_images + .remove(index as usize); self.as_mut().end_remove_rows(); } println!("removed-item-at-index: {:?}", image_id); @@ -297,8 +305,8 @@ impl image_model::ImageModel { // println!("{:?}", db); let image = self::Image { id: image_id, - title: image_title.clone(), - path: image_path.clone(), + title: image_title.clone().to_string(), + path: image_path.clone().to_string(), }; println!("{:?}", image); @@ -335,7 +343,8 @@ impl image_model::ImageModel { index, index, ); - self.as_mut().rust_mut().images.push(image); + self.as_mut().rust_mut().images.push(image.clone()); + self.as_mut().rust_mut().inner_images.push(image); self.as_mut().end_insert_rows(); } } @@ -364,7 +373,7 @@ impl image_model::ImageModel { .iter_mut() .filter(|x| x.id == index) { - image.title = updated_title.clone(); + image.title = updated_title.clone().to_string(); println!("rust-title: {:?}", image.title); } self.as_mut().data_changed( @@ -402,7 +411,8 @@ impl image_model::ImageModel { .iter_mut() .filter(|x| x.id == index) { - image.path = updated_file_path.clone(); + image.path = + updated_file_path.clone().to_string(); println!("rust-title: {:?}", image.path); } self.as_mut().data_changed( @@ -439,6 +449,25 @@ impl image_model::ImageModel { qvariantmap } + fn search(mut self: Pin<&mut Self>, search_term: QString) { + let search_term = search_term.to_string().to_lowercase(); + debug!(search_term); + let searched_images: Vec = self + .inner_images + .iter() + .filter(|image| { + image.title.to_lowercase().contains(&search_term) + }) + .cloned() + .collect(); + debug!(search = ?&searched_images); + unsafe { + self.as_mut().begin_reset_model(); + self.as_mut().rust_mut().images = searched_images; + self.as_mut().end_reset_model(); + } + } + fn get_role_id(&self, role: ImageRoles) -> i32 { match role { ImageRoles::Id => 0, @@ -456,8 +485,12 @@ impl image_model::ImageModel { if let Some(image) = self.images.get(index.row() as usize) { return match role { ImageRoles::Id => QVariant::from(&image.id), - ImageRoles::Title => QVariant::from(&image.title), - ImageRoles::Path => QVariant::from(&image.path), + ImageRoles::Title => { + QVariant::from(&QString::from(&image.title)) + } + ImageRoles::Path => { + QVariant::from(&QString::from(&image.path)) + } _ => QVariant::default(), }; } diff --git a/src/rust/presentation_model.rs b/src/rust/presentation_model.rs index 5a27a0d..db477d6 100644 --- a/src/rust/presentation_model.rs +++ b/src/rust/presentation_model.rs @@ -90,6 +90,11 @@ mod presentation_model { index: i32, updated_page_count: i32, ) -> bool; + #[qinvokable] + fn search( + self: Pin<&mut PresentationModel>, + search_term: QString, + ); } impl cxx_qt::Threading for PresentationModel {} @@ -205,6 +210,7 @@ pub struct PresentationModelRust { count: i32, highest_id: i32, presentations: Vec, + inner_presentations: Vec, } impl presentation_model::PresentationModel { @@ -279,6 +285,10 @@ impl presentation_model::PresentationModel { .rust_mut() .presentations .remove(index as usize); + self.as_mut() + .rust_mut() + .inner_presentations + .remove(index as usize); self.as_mut().end_remove_rows(); } println!( @@ -410,7 +420,14 @@ impl presentation_model::PresentationModel { index, index, ); - self.as_mut().rust_mut().presentations.push(presentation); + self.as_mut() + .rust_mut() + .presentations + .push(presentation.clone()); + self.as_mut() + .rust_mut() + .inner_presentations + .push(presentation); self.as_mut().end_insert_rows(); } } @@ -568,6 +585,29 @@ impl presentation_model::PresentationModel { } } + fn search(mut self: Pin<&mut Self>, search_term: QString) { + let search_term = search_term.to_string().to_lowercase(); + debug!(search_term); + let searched_presentations: Vec = self + .inner_presentations + .iter() + .filter(|presentation| { + presentation + .title + .to_lowercase() + .contains(&search_term) + }) + .cloned() + .collect(); + debug!(search = ?&searched_presentations); + unsafe { + self.as_mut().begin_reset_model(); + self.as_mut().rust_mut().presentations = + searched_presentations; + self.as_mut().end_reset_model(); + } + } + fn get_role(&self, role: PresRoles) -> i32 { match role { PresRoles::Id => 0, diff --git a/src/rust/songs/song_model.rs b/src/rust/songs/song_model.rs index 319f40d..646daf8 100644 --- a/src/rust/songs/song_model.rs +++ b/src/rust/songs/song_model.rs @@ -355,7 +355,6 @@ impl song_model::SongModel { println!("--------------------------------------"); println!("{:?}", self.as_mut().songs); println!("--------------------------------------"); - self.as_mut().rust_mut().inner_songs = self.songs.clone(); } pub fn remove_item(mut self: Pin<&mut Self>, index: i32) -> bool { @@ -380,6 +379,10 @@ impl song_model::SongModel { .rust_mut() .songs .remove(index as usize); + self.as_mut() + .rust_mut() + .inner_songs + .remove(index as usize); self.as_mut().end_remove_rows(); } println!("removed-item-at-index: {:?}", song_id); @@ -464,7 +467,8 @@ impl song_model::SongModel { index, index, ); - self.as_mut().rust_mut().songs.push(song); + self.as_mut().rust_mut().songs.push(song.clone()); + self.as_mut().rust_mut().inner_songs.push(song); self.as_mut().end_insert_rows(); } } diff --git a/src/rust/video_model.rs b/src/rust/video_model.rs index 01b9da2..714b1ac 100644 --- a/src/rust/video_model.rs +++ b/src/rust/video_model.rs @@ -96,6 +96,8 @@ mod video_model { index: i32, updated_end_time: f32, ) -> bool; + #[qinvokable] + fn search(self: Pin<&mut VideoModel>, search_term: QString); } impl cxx_qt::Threading for VideoModel {} @@ -185,6 +187,7 @@ use diesel::sqlite::SqliteConnection; use diesel::{delete, insert_into, prelude::*, update}; use std::path::PathBuf; use std::pin::Pin; +use tracing::debug; use self::video_model::{ QHash_i32_QByteArray, QMap_QString_QVariant, QVector_i32, @@ -206,6 +209,7 @@ pub struct VideoModelRust { count: i32, highest_id: i32, videos: Vec, + inner_videos: Vec, } impl video_model::VideoModel { @@ -275,6 +279,10 @@ impl video_model::VideoModel { .rust_mut() .videos .remove(index as usize); + self.as_mut() + .rust_mut() + .inner_videos + .remove(index as usize); self.as_mut().end_remove_rows(); } println!("removed-item-at-index: {:?}", video_id); @@ -373,7 +381,8 @@ impl video_model::VideoModel { index, index, ); - self.as_mut().rust_mut().videos.push(video); + self.as_mut().rust_mut().videos.push(video.clone()); + self.as_mut().rust_mut().inner_videos.push(video); self.as_mut().end_insert_rows(); } } @@ -608,6 +617,25 @@ impl video_model::VideoModel { Err(_e) => false, } } + + fn search(mut self: Pin<&mut Self>, search_term: QString) { + let search_term = search_term.to_string().to_lowercase(); + debug!(search_term); + let searched_videos: Vec