From c42c144ccf6fa9eb8cdbbc98912e31f8d9d4db18 Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Sun, 31 Mar 2019 21:53:33 +0200 Subject: [PATCH] Use seperate threads for search --- src/ui/search.rs | 67 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 17 deletions(-) diff --git a/src/ui/search.rs b/src/ui/search.rs index e9a1a10..2fa524b 100644 --- a/src/ui/search.rs +++ b/src/ui/search.rs @@ -66,36 +66,69 @@ impl SearchView { }); } - pub fn run_search>(&mut self, query: S) { - let query = query.into(); - let q = query.clone(); - self.edit - .call_on(&Selector::Id(EDIT_ID), |v: &mut EditView| { - v.set_content(q); - }); - - if let Some(results) = self.spotify.search_track(&query, 50, 0) { - let tracks = results + fn search_track( + spotify: Arc, + tracks: Arc>>, + query: String, + ) { + if let Some(results) = spotify.search_track(&query, 50, 0) { + let t = results .tracks .items .iter() .map(|ft| Track::new(ft)) .collect(); - let mut r = self.results_tracks.write().unwrap(); - *r = tracks; - self.edit_focused = false; + let mut r = tracks.write().unwrap(); + *r = t; } + } - if let Some(results) = self.spotify.search_playlist(&query, 50, 0) { + fn search_playlist( + spotify: Arc, + playlists: Arc>>, + query: String, + ) { + if let Some(results) = spotify.search_playlist(&query, 50, 0) { let pls = results .playlists .items .iter() - .map(|sp| Playlists::process_playlist(sp, &&self.spotify)) + .map(|sp| Playlists::process_playlist(sp, &&spotify)) .collect(); - let mut r = self.results_playlists.write().unwrap(); + let mut r = playlists.write().unwrap(); *r = pls; - self.edit_focused = false; + } + } + + pub fn run_search>(&mut self, query: S) { + let query = query.into(); + + self.edit_focused = false; + + { + let query = query.clone(); + self.edit + .call_on(&Selector::Id(EDIT_ID), |v: &mut EditView| { + v.set_content(query); + }); + } + + { + let spotify = self.spotify.clone(); + let results = self.results_tracks.clone(); + let query = query.clone(); + std::thread::spawn(|| { + Self::search_track(spotify, results, query); + }); + } + + { + let spotify = self.spotify.clone(); + let results = self.results_playlists.clone(); + let query = query.clone(); + std::thread::spawn(|| { + Self::search_playlist(spotify, results, query); + }); } } }