Refactor command handling
This commit is contained in:
@@ -1,34 +1,34 @@
|
||||
use cursive::event::{Callback, Event, EventResult};
|
||||
use cursive::traits::{Boxable, Identifiable, View};
|
||||
use cursive::view::ViewWrapper;
|
||||
use cursive::views::{Dialog, EditView, IdView, ScrollView, SelectView};
|
||||
use cursive::views::{Dialog, EditView, ScrollView, SelectView};
|
||||
use cursive::Cursive;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use commands::CommandResult;
|
||||
use playlists::Playlists;
|
||||
use queue::Queue;
|
||||
use track::Track;
|
||||
use traits::ViewExt;
|
||||
use ui::listview::ListView;
|
||||
use ui::modal::Modal;
|
||||
|
||||
pub struct QueueView {
|
||||
list: IdView<ListView<Track>>,
|
||||
list: ListView<Track>,
|
||||
playlists: Arc<Playlists>,
|
||||
queue: Arc<Queue>,
|
||||
}
|
||||
|
||||
pub const LIST_ID: &str = "queue_list";
|
||||
impl QueueView {
|
||||
pub fn new(queue: Arc<Queue>, playlists: Arc<Playlists>) -> QueueView {
|
||||
let list = ListView::new(queue.queue.clone(), queue.clone()).with_id(LIST_ID);
|
||||
let list = ListView::new(queue.queue.clone(), queue.clone());
|
||||
|
||||
QueueView { list, playlists }
|
||||
QueueView { list, playlists, queue }
|
||||
}
|
||||
|
||||
fn save_dialog_cb(s: &mut Cursive, playlists: Arc<Playlists>, id: Option<String>) {
|
||||
let tracks = s
|
||||
.call_on_id(LIST_ID, |view: &mut ListView<_>| view.content().clone())
|
||||
.unwrap();
|
||||
fn save_dialog_cb(s: &mut Cursive, queue: Arc<Queue>, playlists: Arc<Playlists>, id: Option<String>) {
|
||||
let tracks = queue.queue.read().unwrap().clone();
|
||||
match id {
|
||||
Some(id) => {
|
||||
playlists.overwrite_playlist(&id, &tracks);
|
||||
@@ -53,7 +53,7 @@ impl QueueView {
|
||||
}
|
||||
}
|
||||
|
||||
fn save_dialog(playlists: Arc<Playlists>) -> Modal<Dialog> {
|
||||
fn save_dialog(queue: Arc<Queue>, playlists: Arc<Playlists>) -> Modal<Dialog> {
|
||||
let mut list_select: SelectView<Option<String>> = SelectView::new().autojump();
|
||||
list_select.add_item("[Create new]", None);
|
||||
|
||||
@@ -62,7 +62,7 @@ impl QueueView {
|
||||
}
|
||||
|
||||
list_select.set_on_submit(move |s, selected| {
|
||||
Self::save_dialog_cb(s, playlists.clone(), selected.clone())
|
||||
Self::save_dialog_cb(s, queue.clone(), playlists.clone(), selected.clone())
|
||||
});
|
||||
|
||||
let dialog = Dialog::new()
|
||||
@@ -75,15 +75,16 @@ impl QueueView {
|
||||
}
|
||||
|
||||
impl ViewWrapper for QueueView {
|
||||
wrap_impl!(self.list: IdView<ListView<Track>>);
|
||||
wrap_impl!(self.list: ListView<Track>);
|
||||
|
||||
fn wrap_on_event(&mut self, ch: Event) -> EventResult {
|
||||
match ch {
|
||||
Event::Char('s') => {
|
||||
debug!("save list");
|
||||
let queue = self.queue.clone();
|
||||
let playlists = self.playlists.clone();
|
||||
let cb = move |s: &mut Cursive| {
|
||||
let dialog = Self::save_dialog(playlists.clone());
|
||||
let dialog = Self::save_dialog(queue.clone(), playlists.clone());
|
||||
s.add_layer(dialog)
|
||||
};
|
||||
EventResult::Consumed(Some(Callback::from_fn(cb)))
|
||||
@@ -92,3 +93,29 @@ impl ViewWrapper for QueueView {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ViewExt for QueueView {
|
||||
fn on_command(&mut self,
|
||||
s: &mut Cursive,
|
||||
cmd: &String,
|
||||
args: &[String]
|
||||
) -> Result<CommandResult, String> {
|
||||
if cmd == "play" {
|
||||
self.queue.play(self.list.get_selected_index(), true);
|
||||
return Ok(CommandResult::Consumed(None));
|
||||
}
|
||||
|
||||
if cmd == "queue" {
|
||||
return Ok(CommandResult::Ignored);
|
||||
}
|
||||
|
||||
if cmd == "delete" {
|
||||
self.queue.remove(self.list.get_selected_index());
|
||||
return Ok(CommandResult::Consumed(None));
|
||||
}
|
||||
|
||||
self.with_view_mut(move |v| {
|
||||
v.on_command(s, cmd, args)
|
||||
}).unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user