From d93302a63f8a4fb448594c8eaa8844397da9dd56 Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Thu, 18 Apr 2019 13:31:27 +0200 Subject: [PATCH] Restore playlist deletion --- src/library.rs | 13 +++++++-- src/ui/library.rs | 46 ++++------------------------- src/ui/mod.rs | 1 + src/ui/playlists.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 87 insertions(+), 43 deletions(-) create mode 100644 src/ui/playlists.rs diff --git a/src/library.rs b/src/library.rs index 034733b..dfc1ade 100644 --- a/src/library.rs +++ b/src/library.rs @@ -190,10 +190,17 @@ impl Library { } pub fn delete_playlist(&self, id: &str) { - let mut store = self.playlists.write().expect("can't writelock playlists"); - if let Some(position) = store.iter().position(|ref i| i.id == id) { + let pos = { + let store = self.playlists.read().expect("can't readlock playlists"); + store.iter().position(|ref i| i.id == id) + }; + + if let Some(position) = pos { if self.spotify.delete_playlist(id) { - store.remove(position); + { + let mut store = self.playlists.write().expect("can't writelock playlists"); + store.remove(position); + } self.save_cache(config::cache_path(CACHE_PLAYLISTS), self.playlists.clone()); } } diff --git a/src/ui/library.rs b/src/ui/library.rs index dd68b75..c2605c7 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use cursive::view::ViewWrapper; -use cursive::views::Dialog; use cursive::Cursive; use commands::CommandResult; @@ -9,12 +8,11 @@ use library::Library; use queue::Queue; use traits::ViewExt; use ui::listview::ListView; -use ui::modal::Modal; +use ui::playlists::PlaylistsView; use ui::tabview::TabView; pub struct LibraryView { - list: TabView, - library: Arc, + tabs: TabView, } impl LibraryView { @@ -23,41 +21,16 @@ impl LibraryView { .tab("tracks", "Tracks", ListView::new(library.tracks.clone(), queue.clone())) .tab("albums", "Albums", ListView::new(library.albums.clone(), queue.clone())) .tab("artists", "Artists", ListView::new(library.artists.clone(), queue.clone())) - .tab("playlists", "Playlists", ListView::new(library.playlists.clone(), queue.clone())); + .tab("playlists", "Playlists", PlaylistsView::new(queue.clone(), library.clone())); Self { - list: tabs, - library, + tabs } } - - pub fn delete_dialog(&mut self) -> Option> { - return None; - - // TODO - //let store = self.library.items(); - //let current = store.get(self.list.get_selected_index()); - - //if let Some(playlist) = current { - // let library = self.library.clone(); - // let id = playlist.id.clone(); - // let dialog = Dialog::text("Are you sure you want to delete this playlist?") - // .padding((1, 1, 1, 0)) - // .title("Delete playlist") - // .dismiss_button("No") - // .button("Yes", move |s: &mut Cursive| { - // library.delete_playlist(&id); - // s.pop_layer(); - // }); - // Some(Modal::new(dialog)) - //} else { - // None - //} - } } impl ViewWrapper for LibraryView { - wrap_impl!(self.list: TabView); + wrap_impl!(self.tabs: TabView); } impl ViewExt for LibraryView { @@ -67,13 +40,6 @@ impl ViewExt for LibraryView { cmd: &str, args: &[String], ) -> Result { - if cmd == "delete" { - if let Some(dialog) = self.delete_dialog() { - s.add_layer(dialog); - } - return Ok(CommandResult::Consumed(None)); - } - - self.list.on_command(s, cmd, args) + self.tabs.on_command(s, cmd, args) } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index e0f3563..b6088d3 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -2,6 +2,7 @@ pub mod layout; pub mod library; pub mod listview; pub mod modal; +pub mod playlists; pub mod queue; pub mod search; pub mod statusbar; diff --git a/src/ui/playlists.rs b/src/ui/playlists.rs new file mode 100644 index 0000000..afbb27e --- /dev/null +++ b/src/ui/playlists.rs @@ -0,0 +1,70 @@ +use std::sync::Arc; + +use cursive::view::ViewWrapper; +use cursive::views::Dialog; +use cursive::Cursive; + +use commands::CommandResult; +use library::Library; +use playlist::Playlist; +use queue::Queue; +use traits::ViewExt; +use ui::listview::ListView; +use ui::modal::Modal; + +pub struct PlaylistsView { + list: ListView, + library: Arc, +} + +impl PlaylistsView { + pub fn new(queue: Arc, library: Arc) -> Self { + Self { + list: ListView::new(library.playlists.clone(), queue.clone()), + library, + } + } + + pub fn delete_dialog(&mut self) -> Option> { + let store = self.library.items(); + let current = store.get(self.list.get_selected_index()); + + if let Some(playlist) = current { + let library = self.library.clone(); + let id = playlist.id.clone(); + let dialog = Dialog::text("Are you sure you want to delete this playlist?") + .padding((1, 1, 1, 0)) + .title("Delete playlist") + .dismiss_button("No") + .button("Yes", move |s: &mut Cursive| { + library.delete_playlist(&id); + s.pop_layer(); + }); + Some(Modal::new(dialog)) + } else { + None + } + } +} + +impl ViewWrapper for PlaylistsView { + wrap_impl!(self.list: ListView); +} + +impl ViewExt for PlaylistsView { + fn on_command( + &mut self, + s: &mut Cursive, + cmd: &str, + args: &[String], + ) -> Result { + if cmd == "delete" { + if let Some(dialog) = self.delete_dialog() { + s.add_layer(dialog); + } + return Ok(CommandResult::Consumed(None)); + } + + self.list.on_command(s, cmd, args) + } +}