From 980f6eb5288bda393c468ed36f5cb6673d1e0200 Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Tue, 13 Aug 2019 21:59:11 +0200 Subject: [PATCH] move to a separate save/delete binding approach this is to address accidental deletions of playlists/tracks that some users faced closes #75 related #15 --- src/album.rs | 8 ++++++++ src/artist.rs | 8 ++++++++ src/playlist.rs | 8 ++++++++ src/track.rs | 8 ++++++++ src/traits.rs | 2 ++ src/ui/listview.rs | 11 ++++++++++- 6 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/album.rs b/src/album.rs index fe6d6c7..3114a47 100644 --- a/src/album.rs +++ b/src/album.rs @@ -191,6 +191,14 @@ impl ListItem for Album { } } + fn save(&mut self, library: Arc) { + library.save_album(self); + } + + fn unsave(&mut self, library: Arc) { + library.unsave_album(self); + } + fn toggle_saved(&mut self, library: Arc) { if library.is_saved_album(self) { library.unsave_album(self); diff --git a/src/artist.rs b/src/artist.rs index 010f16c..ea0d9c7 100644 --- a/src/artist.rs +++ b/src/artist.rs @@ -186,6 +186,14 @@ impl ListItem for Artist { } } + fn save(&mut self, library: Arc) { + library.follow_artist(self); + } + + fn unsave(&mut self, library: Arc) { + library.unfollow_artist(self); + } + fn toggle_saved(&mut self, library: Arc) { if library.is_followed_artist(self) { library.unfollow_artist(self); diff --git a/src/playlist.rs b/src/playlist.rs index 74edbf3..c8fe079 100644 --- a/src/playlist.rs +++ b/src/playlist.rs @@ -154,6 +154,14 @@ impl ListItem for Playlist { } } + fn save(&mut self, library: Arc) { + library.follow_playlist(self); + } + + fn unsave(&mut self, library: Arc) { + library.delete_playlist(&self.id); + } + fn toggle_saved(&mut self, library: Arc) { // Don't allow users to unsave their own playlists with one keypress if !library.is_followed_playlist(self) { diff --git a/src/track.rs b/src/track.rs index d0008e3..d1d262a 100644 --- a/src/track.rs +++ b/src/track.rs @@ -181,6 +181,14 @@ impl ListItem for Track { queue.append(self); } + fn save(&mut self, library: Arc) { + library.save_tracks(vec![self], true); + } + + fn unsave(&mut self, library: Arc) { + library.unsave_tracks(vec![self], true); + } + fn toggle_saved(&mut self, library: Arc) { if library.is_saved_track(self) { library.unsave_tracks(vec![self], true); diff --git a/src/traits.rs b/src/traits.rs index 7fc23ec..49861be 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -18,6 +18,8 @@ pub trait ListItem: Sync + Send + 'static { fn play(&mut self, queue: Arc); fn queue(&mut self, queue: Arc); fn toggle_saved(&mut self, library: Arc); + fn save(&mut self, library: Arc); + fn unsave(&mut self, library: Arc); fn open(&self, queue: Arc, library: Arc) -> Option>; fn share_url(&self) -> Option; diff --git a/src/ui/listview.rs b/src/ui/listview.rs index 3641acb..9bdb72d 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -309,10 +309,19 @@ impl ViewExt for ListView { }; if let Some(item) = item.as_mut() { - item.toggle_saved(self.library.clone()); + item.save(self.library.clone()); } } + Command::Delete => { + let mut item = { + let content = self.content.read().unwrap(); + content.get(self.selected).cloned() + }; + if let Some(item) = item.as_mut() { + item.unsave(self.library.clone()); + } + } Command::Share(mode) => { let url = match mode { TargetMode::Selected => self.content.read().ok().and_then(|content| {