Add add command for adding song to playlist (#1232)

* Add command for adding song to playlist

* edits for code style

* Return playlist dialog via `CommandResult::Modal`

---------

Co-authored-by: Henrik Friedrichsen <henrik@affekt.org>
This commit is contained in:
Flynn Duniho
2023-07-22 07:03:21 -07:00
committed by GitHub
parent 92cd4f1c8b
commit 924296ac52
3 changed files with 47 additions and 0 deletions

View File

@@ -134,6 +134,8 @@ pub enum Command {
Save, Save,
SaveCurrent, SaveCurrent,
SaveQueue, SaveQueue,
Add,
AddCurrent,
Delete, Delete,
Focus(String), Focus(String),
Seek(SeekDirection), Seek(SeekDirection),
@@ -216,6 +218,8 @@ impl fmt::Display for Command {
| Command::Save | Command::Save
| Command::SaveCurrent | Command::SaveCurrent
| Command::SaveQueue | Command::SaveQueue
| Command::Add
| Command::AddCurrent
| Command::Delete | Command::Delete
| Command::Back | Command::Back
| Command::Help | Command::Help
@@ -246,6 +250,8 @@ impl Command {
Command::Save => "save", Command::Save => "save",
Command::SaveCurrent => "save current", Command::SaveCurrent => "save current",
Command::SaveQueue => "save queue", Command::SaveQueue => "save queue",
Command::Add => "add",
Command::AddCurrent => "add current",
Command::Delete => "delete", Command::Delete => "delete",
Command::Focus(_) => "focus", Command::Focus(_) => "focus",
Command::Seek(_) => "seek", Command::Seek(_) => "seek",
@@ -389,6 +395,14 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
"playnext" => Command::PlayNext, "playnext" => Command::PlayNext,
"play" => Command::Play, "play" => Command::Play,
"update" => Command::UpdateLibrary, "update" => Command::UpdateLibrary,
"add" => match args.first().cloned() {
Some("current") => Ok(Command::AddCurrent),
Some(arg) => Err(BadEnumArg {
arg: arg.into(),
accept: vec!["**omit**".into(), "queue".into()],
}),
None => Ok(Command::Add),
}?,
"save" => match args.first().cloned() { "save" => match args.first().cloned() {
Some("queue") => Ok(Command::SaveQueue), Some("queue") => Ok(Command::SaveQueue),
Some("current") => Ok(Command::SaveCurrent), Some("current") => Ok(Command::SaveCurrent),

View File

@@ -272,6 +272,19 @@ impl CommandManager {
self.spotify.shutdown(); self.spotify.shutdown();
Ok(None) Ok(None)
} }
Command::AddCurrent => {
if let Some(track) = self.queue.get_current() {
if let Some(track) = track.track() {
let dialog = ContextMenu::add_track_dialog(
self.library.clone(),
self.queue.get_spotify(),
track,
);
s.add_layer(dialog);
}
}
Ok(None)
}
Command::SaveCurrent => { Command::SaveCurrent => {
if let Some(mut track) = self.queue.get_current() { if let Some(mut track) = self.queue.get_current() {
track.save(&self.library); track.save(&self.library);
@@ -284,6 +297,7 @@ impl CommandManager {
| Command::Play | Command::Play
| Command::Save | Command::Save
| Command::SaveQueue | Command::SaveQueue
| Command::Add
| Command::Delete | Command::Delete
| Command::Focus(_) | Command::Focus(_)
| Command::Back | Command::Back

View File

@@ -520,6 +520,25 @@ impl<I: ListItem + Clone> ViewExt for ListView<I> {
return Ok(CommandResult::Consumed(None)); return Ok(CommandResult::Consumed(None));
} }
Command::Add => {
let item = {
let content = self.content.read().unwrap();
content.get(self.selected).cloned()
};
if let Some(track) = item {
if let Some(track) = track.track() {
let dialog = ContextMenu::add_track_dialog(
self.library.clone(),
self.queue.get_spotify(),
track,
);
return Ok(CommandResult::Modal(Box::new(dialog)));
}
}
return Ok(CommandResult::Consumed(None));
}
Command::Delete => { Command::Delete => {
let mut item = { let mut item = {
let content = self.content.read().unwrap(); let content = self.content.read().unwrap();