Refactor command handling

This commit is contained in:
KoffeinFlummi
2019-03-28 03:05:25 +01:00
parent 83a394790f
commit 486bc7617e
10 changed files with 380 additions and 349 deletions

View File

@@ -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()
}
}