From 79ec5aa1ef3e2ba9d3c0e810a06fc8e9186805ff Mon Sep 17 00:00:00 2001 From: MrDulfin Date: Mon, 26 Feb 2024 20:17:37 -0500 Subject: [PATCH] Added function to add items to the queue. currently does not work with songs that have the `Played` State --- src/music_controller/controller.rs | 24 ++++---- src/music_controller/queue.rs | 97 +++++++++++++++++++++++++++--- src/music_player.rs | 1 + 3 files changed, 102 insertions(+), 20 deletions(-) diff --git a/src/music_controller/controller.rs b/src/music_controller/controller.rs index 42f8f0e..8d7f08e 100644 --- a/src/music_controller/controller.rs +++ b/src/music_controller/controller.rs @@ -27,6 +27,8 @@ use crate::{ music_controller::queue::Queue, }; +use super::queue::{QueueItem, QueueState}; + pub struct Controller { // queues: Vec, config: Arc>, @@ -74,7 +76,7 @@ enum QueueCmd { Test, Play, Pause, - SetSongs(Vec), + // SetSongs(Vec>), // SetLocation(URI), Enqueue(URI), SetVolume(f64), @@ -248,10 +250,10 @@ impl Controller { Err(_) => todo!() } }, - SetSongs(songs) => { - queue.set_tracks(songs); - in_thread.send(QueueResponse::Default).unwrap(); - }, + // SetSongs(songs) => { + // queue.set_tracks(songs); + // in_thread.send(QueueResponse::Default).unwrap(); + // }, Enqueue(uri) => { queue.player.enqueue_next(&uri).unwrap(); @@ -287,12 +289,12 @@ impl Controller { Ok(()) } - fn q_set_songs(&self, index: usize, songs: Vec) -> Result<(), Box> { - let mail = &self.queue_mail[index]; - mail.send(QueueCmd::SetSongs(songs))?; - dbg!(mail.recv()?); - Ok(()) - } + // fn q_set_songs(&self, index: usize, songs: Vec>) -> Result<(), Box> { + // let mail = &self.queue_mail[index]; + // mail.send(QueueCmd::SetSongs(songs))?; + // dbg!(mail.recv()?); + // Ok(()) + // } fn q_enqueue(&self, index: usize, uri: URI) -> Result<(), Box> { let mail = &self.queue_mail[index]; diff --git a/src/music_controller/queue.rs b/src/music_controller/queue.rs index 7eaace7..7785d4d 100644 --- a/src/music_controller/queue.rs +++ b/src/music_controller/queue.rs @@ -1,25 +1,104 @@ -use crate::{music_player::Player, music_storage::library::Song}; -use std::error::Error; +use uuid::Uuid; -pub struct Queue { +use crate::{music_player::Player, music_storage::library::{Album, Song}}; +use std::{error::Error, path::Path}; + +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum QueueState { + Played, + Current, + AddHere, + None, +} +#[derive(Debug, Clone)] +pub enum QueueItemType<'a> { + Song(Uuid), + Album(Album<'a>) +} +#[derive(Debug, Clone)] +#[non_exhaustive] +pub struct QueueItem<'a> { + item: QueueItemType<'a>, + state: QueueState +} + + +#[derive(Debug)] +pub struct Queue<'a> { pub player: Player, pub name: String, - pub songs: Vec, + pub items: Vec>, } -impl Queue { + +impl<'a> Queue<'a> { pub fn new() -> Result> { Ok( Queue { player: Player::new()?, name: String::new(), - songs: Vec::new() + items: Vec::new() } ) } - pub fn set_tracks(&mut self, tracks: Vec) { + pub fn set_items(&mut self, tracks: Vec>) { let mut tracks = tracks; - self.songs.clear(); - self.songs.append(&mut tracks); + self.items.clear(); + self.items.append(&mut tracks); + } + + pub fn current_index(&self) -> i16 { + let e = self.items.iter().filter(|song| song.state == QueueState::Played ).collect::>().len(); + dbg!(&e); + e as i16 - 1 + } + + pub fn add_item(&mut self, item: QueueItemType<'a>) -> Result<(), Box> { + use QueueState::*; + let ind = self.current_index(); + let mut i: i16 = 1; + self.items = self.items.iter().enumerate().map(|(j, item_)| { + let mut item_ = item_.to_owned(); + if item_.state == AddHere { + i = j as i16 + 2; + item_.state = None; + } + if item_.state == Current { + i = j as i16 + 2; + } + item_ + }).collect::>(); + let pos = (ind + i) as usize; + dbg!(&pos); + self.items.insert( + pos, + QueueItem { + item: item.clone(), + state: if pos == self.items.len() && i == 1 { + Current + }else { + AddHere + } + } + ); + Ok(()) } } + + +#[test] +fn itemaddtest() { + let mut q = Queue::new().unwrap(); + q.add_item(QueueItemType::Song(Uuid::new_v4())).unwrap(); + dbg!(&q.items); + q.add_item(QueueItemType::Song(Uuid::new_v4())).unwrap(); + dbg!(&q.items); + q.add_item(QueueItemType::Song(Uuid::new_v4())).unwrap(); + dbg!(&q.items); + q.add_item(QueueItemType::Song(Uuid::new_v4())).unwrap(); + dbg!(&q.items); + q.add_item(QueueItemType::Song(Uuid::new_v4())).unwrap(); + dbg!(&q.items); + q.add_item(QueueItemType::Song(Uuid::new_v4())).unwrap(); + dbg!(&q.items); +} \ No newline at end of file diff --git a/src/music_player.rs b/src/music_player.rs index 12af300..9893088 100644 --- a/src/music_player.rs +++ b/src/music_player.rs @@ -90,6 +90,7 @@ enum PlaybackStats { } /// An instance of a music player with a GStreamer backend +#[derive(Debug)] pub struct Player { source: Option, //pub message_tx: Sender,