From 0b26c5411ce34deb067d79274a5541ada5ddf6ec Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Sat, 9 Feb 2019 16:05:33 +0100 Subject: [PATCH] initial track queue implementation --- src/main.rs | 6 +++++- src/queue.rs | 22 ++++++++++++++++++++++ src/ui/search.rs | 24 +++++++++++++++++++----- 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 src/queue.rs diff --git a/src/main.rs b/src/main.rs index 485609e..43801a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,8 @@ use std::io::prelude::*; use std::path::PathBuf; use std::process; use std::sync::Arc; +use std::rc::Rc; +use std::cell::RefCell; use cursive::views::*; use cursive::Cursive; @@ -30,6 +32,7 @@ mod config; mod spotify; mod theme; mod ui; +mod queue; fn init_logger(content: TextContent) { let mut builder = env_logger::Builder::from_default_env(); @@ -76,6 +79,7 @@ fn main() { }; let cfg = config::load(path.to_str().unwrap()).expect("could not load configuration file"); + let queue = Rc::new(RefCell::new(queue::Queue::new())); let spotify = Arc::new(spotify::Spotify::new( cfg.username, @@ -84,7 +88,7 @@ fn main() { )); let searchscreen = cursive.active_screen(); - let search = ui::search::SearchView::new(spotify.clone()); + let search = ui::search::SearchView::new(spotify.clone(), queue.clone()); cursive.add_fullscreen_layer(search.view); let logscreen = cursive.add_active_screen(); diff --git a/src/queue.rs b/src/queue.rs new file mode 100644 index 0000000..f702c68 --- /dev/null +++ b/src/queue.rs @@ -0,0 +1,22 @@ +use std::collections::VecDeque; + +use rspotify::spotify::model::track::FullTrack; + +pub struct Queue { + queue: VecDeque, +} + +impl Queue { + pub fn new() -> Queue { + Queue { + queue: VecDeque::new() + } + } + pub fn enqueue(&mut self, track: FullTrack) { + self.queue.push_back(track); + } + + pub fn dequeue(&mut self) -> Option { + self.queue.pop_front() + } +} diff --git a/src/ui/search.rs b/src/ui/search.rs index 8794913..a5e1989 100644 --- a/src/ui/search.rs +++ b/src/ui/search.rs @@ -4,17 +4,21 @@ use cursive::traits::Identifiable; use cursive::views::*; use cursive::Cursive; use std::sync::Arc; +use std::rc::Rc; +use std::cell::RefCell; use librespot::core::spotify_id::SpotifyId; use spotify::Spotify; +use queue::Queue; pub struct SearchView { pub view: Panel, + queue: Rc>, } impl SearchView { - pub fn search_handler(s: &mut Cursive, input: &str, spotify: Arc) { + fn search_handler(s: &mut Cursive, input: &str, spotify: Arc, queue: Rc>) { let mut results: ViewRef = s.find_id("search_results").unwrap(); let tracks = spotify.search(input, 50, 0); @@ -33,16 +37,23 @@ impl SearchView { s.load(trackid); s.play(); }); - results.add_child("", button); + let p = queue.clone(); + let button_queue = OnEventView::new(button) + .on_event(' ', move |_cursive| { + p.borrow_mut().enqueue(track.clone()); + debug!("Added to queue: {}", track.name); + }); + results.add_child("", button_queue); } } } - pub fn new(spotify: Arc) -> SearchView { + pub fn new(spotify: Arc, queue: Rc>) -> SearchView { let spotify_ref = spotify.clone(); + let queue_ref = queue.clone(); let searchfield = EditView::new() .on_submit(move |s, input| { - SearchView::search_handler(s, input, spotify_ref.clone()); + SearchView::search_handler(s, input, spotify_ref.clone(), queue_ref.clone()); }) .with_id("search_edit") .full_width() @@ -53,6 +64,9 @@ impl SearchView { .child(searchfield) .child(scrollable); let rootpanel = Panel::new(layout).title("Search"); - return SearchView { view: rootpanel }; + return SearchView { + view: rootpanel, + queue: queue, + }; } }