Add hjkl controls for AddToPlaylistMenu (#335)

* Add hjkl controls for AddToPlaylistMenu

* turn off autojump in contextmenu for vim bindings

Co-authored-by: Henrik Friedrichsen <henrik@affekt.org>
This commit is contained in:
JojiiOfficial
2020-12-13 20:41:22 +01:00
committed by GitHub
parent b28f215e41
commit 5fefe9eec3
3 changed files with 73 additions and 48 deletions

View File

@@ -6,10 +6,10 @@ use cursive::Cursive;
use crate::commands::CommandResult;
use crate::library::Library;
use crate::playable::Playable;
use crate::queue::Queue;
use crate::track::Track;
use crate::traits::{ListItem, ViewExt};
use crate::playable::Playable;
use crate::ui::layout::Layout;
use crate::ui::modal::Modal;
use crate::{
@@ -25,6 +25,10 @@ pub struct ContextMenu {
dialog: Modal<Dialog>,
}
pub struct AddToPlaylistMenu {
dialog: Modal<Dialog>,
}
enum ContextMenuAction {
ShowItem(Box<dyn ListItem>),
ShareUrl(String),
@@ -38,8 +42,8 @@ impl ContextMenu {
library: Arc<Library>,
spotify: Arc<Spotify>,
track: Track,
) -> Modal<Dialog> {
let mut list_select: SelectView<Playlist> = SelectView::new().autojump();
) -> NamedView<AddToPlaylistMenu> {
let mut list_select: SelectView<Playlist> = SelectView::new();
let current_user_id = library.user_id.as_ref().unwrap();
for list in library.items().iter() {
@@ -82,8 +86,12 @@ impl ContextMenu {
.title("Add track to playlist")
.dismiss_button("Cancel")
.padding(Margins::lrtb(1, 1, 1, 0))
.content(ScrollView::new(list_select));
Modal::new(dialog)
.content(ScrollView::new(list_select.with_name("addplaylist_select")));
AddToPlaylistMenu {
dialog: Modal::new_ext(dialog),
}
.with_name("addtrackmenu")
}
fn track_already_added() -> Dialog {
@@ -94,7 +102,7 @@ impl ContextMenu {
}
pub fn new(item: &dyn ListItem, queue: Arc<Queue>, library: Arc<Library>) -> NamedView<Self> {
let mut content: SelectView<ContextMenuAction> = SelectView::new().autojump();
let mut content: SelectView<ContextMenuAction> = SelectView::new();
if let Some(a) = item.artist() {
content.add_item("Show artist", ContextMenuAction::ShowItem(Box::new(a)));
}
@@ -170,48 +178,59 @@ impl ContextMenu {
}
}
impl ViewExt for AddToPlaylistMenu {
fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result<CommandResult, String> {
handle_move_command::<Playlist>(&mut self.dialog, s, cmd, "addplaylist_select")
}
}
impl ViewExt for ContextMenu {
fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result<CommandResult, String> {
match cmd {
Command::Back => {
s.pop_layer();
Ok(CommandResult::Consumed(None))
}
Command::Move(mode, amount) => self
.dialog
.call_on_name(
"contextmenu_select",
|select: &mut SelectView<ContextMenuAction>| {
let items = select.len();
match mode {
MoveMode::Up => {
match amount {
MoveAmount::Extreme => select.set_selection(0),
MoveAmount::Integer(amount) => {
select.select_up(*amount as usize)
}
};
Ok(CommandResult::Consumed(None))
}
MoveMode::Down => {
match amount {
MoveAmount::Extreme => select.set_selection(items),
MoveAmount::Integer(amount) => {
select.select_down(*amount as usize)
}
};
Ok(CommandResult::Consumed(None))
}
_ => Ok(CommandResult::Consumed(None)),
}
},
)
.unwrap_or(Ok(CommandResult::Consumed(None))),
_ => Ok(CommandResult::Consumed(None)),
}
handle_move_command::<ContextMenuAction>(&mut self.dialog, s, cmd, "contextmenu_select")
}
}
fn handle_move_command<T: 'static>(
sel: &mut Modal<Dialog>,
s: &mut Cursive,
cmd: &Command,
name: &str,
) -> Result<CommandResult, String> {
match cmd {
Command::Back => {
s.pop_layer();
Ok(CommandResult::Consumed(None))
}
Command::Move(mode, amount) => sel
.call_on_name(name, |select: &mut SelectView<T>| {
let items = select.len();
match mode {
MoveMode::Up => {
match amount {
MoveAmount::Extreme => select.set_selection(0),
MoveAmount::Integer(amount) => select.select_up(*amount as usize),
};
Ok(CommandResult::Consumed(None))
}
MoveMode::Down => {
match amount {
MoveAmount::Extreme => select.set_selection(items),
MoveAmount::Integer(amount) => select.select_down(*amount as usize),
};
Ok(CommandResult::Consumed(None))
}
_ => Ok(CommandResult::Consumed(None)),
}
})
.unwrap_or(Ok(CommandResult::Consumed(None))),
_ => Ok(CommandResult::Consumed(None)),
}
}
impl ViewWrapper for AddToPlaylistMenu {
wrap_impl!(self.dialog: Modal<Dialog>);
}
impl ViewWrapper for ContextMenu {
wrap_impl!(self.dialog: Modal<Dialog>);
}