Restore playlist deletion

This commit is contained in:
KoffeinFlummi
2019-04-18 13:31:27 +02:00
parent ab0d3eb9e7
commit d93302a63f
4 changed files with 87 additions and 43 deletions

View File

@@ -190,10 +190,17 @@ impl Library {
} }
pub fn delete_playlist(&self, id: &str) { pub fn delete_playlist(&self, id: &str) {
let mut store = self.playlists.write().expect("can't writelock playlists"); let pos = {
if let Some(position) = store.iter().position(|ref i| i.id == id) { 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) { 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()); self.save_cache(config::cache_path(CACHE_PLAYLISTS), self.playlists.clone());
} }
} }

View File

@@ -1,7 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use cursive::view::ViewWrapper; use cursive::view::ViewWrapper;
use cursive::views::Dialog;
use cursive::Cursive; use cursive::Cursive;
use commands::CommandResult; use commands::CommandResult;
@@ -9,12 +8,11 @@ use library::Library;
use queue::Queue; use queue::Queue;
use traits::ViewExt; use traits::ViewExt;
use ui::listview::ListView; use ui::listview::ListView;
use ui::modal::Modal; use ui::playlists::PlaylistsView;
use ui::tabview::TabView; use ui::tabview::TabView;
pub struct LibraryView { pub struct LibraryView {
list: TabView, tabs: TabView,
library: Arc<Library>,
} }
impl LibraryView { impl LibraryView {
@@ -23,41 +21,16 @@ impl LibraryView {
.tab("tracks", "Tracks", ListView::new(library.tracks.clone(), queue.clone())) .tab("tracks", "Tracks", ListView::new(library.tracks.clone(), queue.clone()))
.tab("albums", "Albums", ListView::new(library.albums.clone(), queue.clone())) .tab("albums", "Albums", ListView::new(library.albums.clone(), queue.clone()))
.tab("artists", "Artists", ListView::new(library.artists.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 { Self {
list: tabs, tabs
library,
} }
} }
pub fn delete_dialog(&mut self) -> Option<Modal<Dialog>> {
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 { impl ViewWrapper for LibraryView {
wrap_impl!(self.list: TabView); wrap_impl!(self.tabs: TabView);
} }
impl ViewExt for LibraryView { impl ViewExt for LibraryView {
@@ -67,13 +40,6 @@ impl ViewExt for LibraryView {
cmd: &str, cmd: &str,
args: &[String], args: &[String],
) -> Result<CommandResult, String> { ) -> Result<CommandResult, String> {
if cmd == "delete" { self.tabs.on_command(s, cmd, args)
if let Some(dialog) = self.delete_dialog() {
s.add_layer(dialog);
}
return Ok(CommandResult::Consumed(None));
}
self.list.on_command(s, cmd, args)
} }
} }

View File

@@ -2,6 +2,7 @@ pub mod layout;
pub mod library; pub mod library;
pub mod listview; pub mod listview;
pub mod modal; pub mod modal;
pub mod playlists;
pub mod queue; pub mod queue;
pub mod search; pub mod search;
pub mod statusbar; pub mod statusbar;

70
src/ui/playlists.rs Normal file
View File

@@ -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<Playlist>,
library: Arc<Library>,
}
impl PlaylistsView {
pub fn new(queue: Arc<Queue>, library: Arc<Library>) -> Self {
Self {
list: ListView::new(library.playlists.clone(), queue.clone()),
library,
}
}
pub fn delete_dialog(&mut self) -> Option<Modal<Dialog>> {
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<Playlist>);
}
impl ViewExt for PlaylistsView {
fn on_command(
&mut self,
s: &mut Cursive,
cmd: &str,
args: &[String],
) -> Result<CommandResult, String> {
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)
}
}