Restore playlist deletion
This commit is contained in:
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
70
src/ui/playlists.rs
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user