extend ContextMenu by sharing item
This commit is contained in:
@@ -4,6 +4,7 @@ use cursive::view::ViewWrapper;
|
|||||||
use cursive::views::{Dialog, SelectView};
|
use cursive::views::{Dialog, SelectView};
|
||||||
use cursive::Cursive;
|
use cursive::Cursive;
|
||||||
|
|
||||||
|
use clipboard::{ClipboardContext, ClipboardProvider};
|
||||||
use library::Library;
|
use library::Library;
|
||||||
use queue::Queue;
|
use queue::Queue;
|
||||||
use traits::ListItem;
|
use traits::ListItem;
|
||||||
@@ -14,25 +15,39 @@ pub struct ContextMenu {
|
|||||||
dialog: Modal<Dialog>,
|
dialog: Modal<Dialog>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ContextMenuAction {
|
||||||
|
ShowItem(Box<ListItem>),
|
||||||
|
ShareUrl(String),
|
||||||
|
}
|
||||||
|
|
||||||
impl ContextMenu {
|
impl ContextMenu {
|
||||||
pub fn new(item: &Box<ListItem>, queue: Arc<Queue>, library: Arc<Library>) -> Self {
|
pub fn new(item: &Box<ListItem>, queue: Arc<Queue>, library: Arc<Library>) -> Self {
|
||||||
let mut content: SelectView<Box<ListItem>> = SelectView::new().autojump();
|
let mut content: SelectView<ContextMenuAction> = SelectView::new().autojump();
|
||||||
if let Some(a) = item.artist() {
|
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()) {
|
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
|
// open detail view of artist/album
|
||||||
content.set_on_submit(move |s: &mut Cursive, selected: &Box<ListItem>| {
|
content.set_on_submit(move |s: &mut Cursive, action: &ContextMenuAction| {
|
||||||
s.pop_layer();
|
s.pop_layer();
|
||||||
let queue = queue.clone();
|
let queue = queue.clone();
|
||||||
let library = library.clone();
|
let library = library.clone();
|
||||||
s.call_on_id("main", move |v: &mut Layout| {
|
s.call_on_id("main", move |v: &mut Layout| match action {
|
||||||
let view = selected.open(queue, library);
|
ContextMenuAction::ShowItem(item) => {
|
||||||
if let Some(view) = view {
|
if let Some(view) = item.open(queue, library) {
|
||||||
v.push_view(view)
|
v.push_view(view)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ContextMenuAction::ShareUrl(url) => {
|
||||||
|
ClipboardProvider::new()
|
||||||
|
.and_then(|mut ctx: ClipboardContext| ctx.set_contents(url.to_string()))
|
||||||
|
.ok();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user