diff --git a/src/ui/contextmenu.rs b/src/ui/contextmenu.rs index f52d238..bdd427e 100644 --- a/src/ui/contextmenu.rs +++ b/src/ui/contextmenu.rs @@ -4,6 +4,7 @@ use cursive::view::ViewWrapper; use cursive::views::{Dialog, SelectView}; use cursive::Cursive; +use clipboard::{ClipboardContext, ClipboardProvider}; use library::Library; use queue::Queue; use traits::ListItem; @@ -14,25 +15,39 @@ pub struct ContextMenu { dialog: Modal, } +enum ContextMenuAction { + ShowItem(Box), + ShareUrl(String), +} + impl ContextMenu { pub fn new(item: &Box, queue: Arc, library: Arc) -> Self { - let mut content: SelectView> = SelectView::new().autojump(); + let mut content: SelectView = SelectView::new().autojump(); if let Some(a) = item.artist() { - content.add_item("Artist", Box::new(a)) + content.add_item("Show artist", ContextMenuAction::ShowItem(Box::new(a))); } if let Some(a) = item.album(queue.clone()) { - content.add_item("Album", Box::new(a)) + content.add_item("Show album", ContextMenuAction::ShowItem(Box::new(a))); + } + if let Some(url) = item.share_url() { + content.add_item("Share", ContextMenuAction::ShareUrl(url)); } // open detail view of artist/album - content.set_on_submit(move |s: &mut Cursive, selected: &Box| { + content.set_on_submit(move |s: &mut Cursive, action: &ContextMenuAction| { s.pop_layer(); let queue = queue.clone(); let library = library.clone(); - s.call_on_id("main", move |v: &mut Layout| { - let view = selected.open(queue, library); - if let Some(view) = view { - v.push_view(view) + s.call_on_id("main", move |v: &mut Layout| match action { + ContextMenuAction::ShowItem(item) => { + if let Some(view) = item.open(queue, library) { + v.push_view(view) + } + } + ContextMenuAction::ShareUrl(url) => { + ClipboardProvider::new() + .and_then(|mut ctx: ClipboardContext| ctx.set_contents(url.to_string())) + .ok(); } }); });