initial track queue implementation
This commit is contained in:
@@ -21,6 +21,8 @@ use std::io::prelude::*;
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use std::cell::RefCell;
|
||||||
|
|
||||||
use cursive::views::*;
|
use cursive::views::*;
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
@@ -30,6 +32,7 @@ mod config;
|
|||||||
mod spotify;
|
mod spotify;
|
||||||
mod theme;
|
mod theme;
|
||||||
mod ui;
|
mod ui;
|
||||||
|
mod queue;
|
||||||
|
|
||||||
fn init_logger(content: TextContent) {
|
fn init_logger(content: TextContent) {
|
||||||
let mut builder = env_logger::Builder::from_default_env();
|
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 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(
|
let spotify = Arc::new(spotify::Spotify::new(
|
||||||
cfg.username,
|
cfg.username,
|
||||||
@@ -84,7 +88,7 @@ fn main() {
|
|||||||
));
|
));
|
||||||
|
|
||||||
let searchscreen = cursive.active_screen();
|
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);
|
cursive.add_fullscreen_layer(search.view);
|
||||||
|
|
||||||
let logscreen = cursive.add_active_screen();
|
let logscreen = cursive.add_active_screen();
|
||||||
|
|||||||
22
src/queue.rs
Normal file
22
src/queue.rs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
|
use rspotify::spotify::model::track::FullTrack;
|
||||||
|
|
||||||
|
pub struct Queue {
|
||||||
|
queue: VecDeque<FullTrack>,
|
||||||
|
}
|
||||||
|
|
||||||
|
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<FullTrack> {
|
||||||
|
self.queue.pop_front()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,17 +4,21 @@ use cursive::traits::Identifiable;
|
|||||||
use cursive::views::*;
|
use cursive::views::*;
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::rc::Rc;
|
||||||
|
use std::cell::RefCell;
|
||||||
|
|
||||||
use librespot::core::spotify_id::SpotifyId;
|
use librespot::core::spotify_id::SpotifyId;
|
||||||
|
|
||||||
use spotify::Spotify;
|
use spotify::Spotify;
|
||||||
|
use queue::Queue;
|
||||||
|
|
||||||
pub struct SearchView {
|
pub struct SearchView {
|
||||||
pub view: Panel<LinearLayout>,
|
pub view: Panel<LinearLayout>,
|
||||||
|
queue: Rc<RefCell<Queue>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SearchView {
|
impl SearchView {
|
||||||
pub fn search_handler(s: &mut Cursive, input: &str, spotify: Arc<Spotify>) {
|
fn search_handler(s: &mut Cursive, input: &str, spotify: Arc<Spotify>, queue: Rc<RefCell<Queue>>) {
|
||||||
let mut results: ViewRef<ListView> = s.find_id("search_results").unwrap();
|
let mut results: ViewRef<ListView> = s.find_id("search_results").unwrap();
|
||||||
let tracks = spotify.search(input, 50, 0);
|
let tracks = spotify.search(input, 50, 0);
|
||||||
|
|
||||||
@@ -33,16 +37,23 @@ impl SearchView {
|
|||||||
s.load(trackid);
|
s.load(trackid);
|
||||||
s.play();
|
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<Spotify>) -> SearchView {
|
pub fn new(spotify: Arc<Spotify>, queue: Rc<RefCell<Queue>>) -> SearchView {
|
||||||
let spotify_ref = spotify.clone();
|
let spotify_ref = spotify.clone();
|
||||||
|
let queue_ref = queue.clone();
|
||||||
let searchfield = EditView::new()
|
let searchfield = EditView::new()
|
||||||
.on_submit(move |s, input| {
|
.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")
|
.with_id("search_edit")
|
||||||
.full_width()
|
.full_width()
|
||||||
@@ -53,6 +64,9 @@ impl SearchView {
|
|||||||
.child(searchfield)
|
.child(searchfield)
|
||||||
.child(scrollable);
|
.child(scrollable);
|
||||||
let rootpanel = Panel::new(layout).title("Search");
|
let rootpanel = Panel::new(layout).title("Search");
|
||||||
return SearchView { view: rootpanel };
|
return SearchView {
|
||||||
|
view: rootpanel,
|
||||||
|
queue: queue,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user