Skip to content

Commit

Permalink
xou816#96: Add basic menus everywhere (xou816#111)
Browse files Browse the repository at this point in the history
* Add menus to playlists

* Add artist menus

* Add copy menus

* Add album menus
  • Loading branch information
Douile authored Mar 1, 2021
1 parent 87c0e36 commit 52e8c1b
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 17 deletions.
56 changes: 52 additions & 4 deletions src/app/components/artist_details/artist_details_model.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
use gdk::SELECTION_CLIPBOARD;
use gio::prelude::*;
use gio::{ActionMapExt, SimpleAction, SimpleActionGroup};
use gtk::Clipboard;
use std::ops::Deref;
use std::rc::Rc;

Expand Down Expand Up @@ -105,11 +109,55 @@ impl PlaylistModel for ArtistDetailsModel {
)
}

fn actions_for(&self, _: String) -> Option<gio::ActionGroup> {
None
fn actions_for(&self, id: String) -> Option<gio::ActionGroup> {
let songs = self.tracks_ref()?;
let song = songs.iter().find(|song| song.id == id)?;

let group = SimpleActionGroup::new();

let album_id = song.album.id.clone();
let view_album = SimpleAction::new("view_album", None);
let dispatcher = self.dispatcher.box_clone();
view_album.connect_activate(move |_, _| {
dispatcher.dispatch(AppAction::ViewAlbum(album_id.clone()));
});

group.add_action(&view_album);

for (i, artist) in song.artists.iter().enumerate() {
let view_artist = SimpleAction::new(&format!("view_artist_{}", i), None);
let dispatcher = self.dispatcher.box_clone();
let id = artist.id.clone();
view_artist.connect_activate(move |_, _| {
dispatcher.dispatch(AppAction::ViewArtist(id.clone()));
});
group.add_action(&view_artist);
}

let track_id = song.id.clone();
let copy_link = SimpleAction::new("copy_link", None);
copy_link.connect_activate(move |_, _| {
let clipboard = Clipboard::get(&SELECTION_CLIPBOARD);
clipboard.set_text(&format!("https://open.spotify.com/track/{}", &track_id,));
});
group.add_action(&copy_link);

Some(group.upcast())
}

fn menu_for(&self, _: String) -> Option<gio::MenuModel> {
None
fn menu_for(&self, id: String) -> Option<gio::MenuModel> {
let songs = self.tracks_ref()?;
let song = songs.iter().find(|song| song.id == id)?;

let menu = gio::Menu::new();
menu.append(Some("View album"), Some("song.view_album"));
for (i, artist) in song.artists.iter().enumerate() {
menu.append(
Some(&format!("More from {}", artist.name)),
Some(&format!("song.view_artist_{}", i)),
);
}
menu.append(Some("Copy link"), Some("song.copy_link"));
Some(menu.upcast())
}
}
48 changes: 44 additions & 4 deletions src/app/components/details/details_model.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
use gdk::SELECTION_CLIPBOARD;
use gio::prelude::*;
use gio::{ActionMapExt, SimpleAction, SimpleActionGroup};
use gtk::Clipboard;
use std::cell::Ref;
use std::ops::Deref;
use std::rc::Rc;
Expand Down Expand Up @@ -118,11 +122,47 @@ impl PlaylistModel for DetailsModel {
)
}

fn actions_for(&self, _: String) -> Option<gio::ActionGroup> {
None
fn actions_for(&self, id: String) -> Option<gio::ActionGroup> {
let songs = self.songs_ref()?;
let song = songs.iter().find(|song| song.id == id)?;

let group = SimpleActionGroup::new();

for (i, artist) in song.artists.iter().enumerate() {
let view_artist = SimpleAction::new(&format!("view_artist_{}", i), None);
let dispatcher = self.dispatcher.box_clone();
let id = artist.id.clone();
view_artist.connect_activate(move |_, _| {
dispatcher.dispatch(AppAction::ViewArtist(id.clone()));
});
group.add_action(&view_artist);
}

let track_id = song.id.clone();
let copy_link = SimpleAction::new("copy_link", None);
copy_link.connect_activate(move |_, _| {
let clipboard = Clipboard::get(&SELECTION_CLIPBOARD);
clipboard.set_text(&format!("https://open.spotify.com/track/{}", &track_id));
});
group.add_action(&copy_link);

Some(group.upcast())
}

fn menu_for(&self, _: String) -> Option<gio::MenuModel> {
None
fn menu_for(&self, id: String) -> Option<gio::MenuModel> {
let songs = self.songs_ref()?;
let song = songs.iter().find(|song| song.id == id)?;

let menu = gio::Menu::new();
for (i, artist) in song.artists.iter().enumerate() {
menu.append(
Some(&format!("More from {}", artist.name)),
Some(&format!("song.view_artist_{}", i)),
);
}

menu.append(Some("Copy link"), Some("song.copy_link"));

Some(menu.upcast())
}
}
18 changes: 15 additions & 3 deletions src/app/components/now_playing/now_playing_model.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use gdk::SELECTION_CLIPBOARD;
use gio::prelude::*;
use gio::{ActionMapExt, SimpleAction, SimpleActionGroup};
use gtk::Clipboard;
use std::cell::Ref;
use std::rc::Rc;

Expand Down Expand Up @@ -77,6 +79,14 @@ impl PlaylistModel for NowPlayingModel {
group.add_action(&view_artist);
}

let track_id = song.id.clone();
let copy_link = SimpleAction::new("copy_link", None);
copy_link.connect_activate(move |_, _| {
let clipboard = Clipboard::get(&SELECTION_CLIPBOARD);
clipboard.set_text(&format!("https://open.spotify.com/track/{}", &track_id));
});
group.add_action(&copy_link);

Some(group.upcast())
}

Expand All @@ -85,14 +95,16 @@ impl PlaylistModel for NowPlayingModel {
let song = queue.song(&id)?;

let menu = gio::Menu::new();
menu.insert(0, Some("View album"), Some("song.view_album"));
menu.append(Some("View album"), Some("song.view_album"));
for (i, artist) in song.artists.iter().enumerate() {
menu.insert(
(i + 1) as i32,
menu.append(
Some(&format!("More from {}", artist.name)),
Some(&format!("song.view_artist_{}", i)),
);
}

menu.append(Some("Copy link"), Some("song.copy_link"));

Some(menu.upcast())
}
}
61 changes: 55 additions & 6 deletions src/app/components/playlist_details/playlist_details_model.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
use gdk::SELECTION_CLIPBOARD;
use gio::prelude::*;
use gio::{ActionMapExt, SimpleAction, SimpleActionGroup};
use gtk::Clipboard;
use std::cell::Ref;
use std::ops::Deref;
use std::rc::Rc;

use crate::app::components::{handle_error, PlaylistModel};
use crate::app::dispatch::ActionDispatcher;
use crate::app::models::*;
use crate::app::state::{BrowserAction, BrowserEvent, PlaybackAction, PlaylistSource};
use crate::app::{AppEvent, AppModel, AppState};
use crate::app::{ActionDispatcher, AppAction, AppEvent, AppModel, AppState};

pub struct PlaylistDetailsModel {
pub id: String,
Expand Down Expand Up @@ -94,11 +97,57 @@ impl PlaylistModel for PlaylistDetailsModel {
)
}

fn actions_for(&self, _: String) -> Option<gio::ActionGroup> {
None
fn actions_for(&self, id: String) -> Option<gio::ActionGroup> {
let songs = self.songs_ref()?;
let song = songs.iter().find(|song| song.id == id)?;

let group = SimpleActionGroup::new();

let album_id = song.album.id.clone();
let view_album = SimpleAction::new("view_album", None);
let dispatcher = self.dispatcher.box_clone();
view_album.connect_activate(move |_, _| {
dispatcher.dispatch(AppAction::ViewAlbum(album_id.clone()));
});

group.add_action(&view_album);

for (i, artist) in song.artists.iter().enumerate() {
let view_artist = SimpleAction::new(&format!("view_artist_{}", i), None);
let dispatcher = self.dispatcher.box_clone();
let id = artist.id.clone();
view_artist.connect_activate(move |_, _| {
dispatcher.dispatch(AppAction::ViewArtist(id.clone()));
});
group.add_action(&view_artist);
}

let track_id = song.id.clone();
let copy_link = SimpleAction::new("copy_link", None);
copy_link.connect_activate(move |_, _| {
let clipboard = Clipboard::get(&SELECTION_CLIPBOARD);
clipboard.set_text(&format!("https://open.spotify.com/track/{}", &track_id));
});
group.add_action(&copy_link);

Some(group.upcast())
}

fn menu_for(&self, _: String) -> Option<gio::MenuModel> {
None
fn menu_for(&self, id: String) -> Option<gio::MenuModel> {
let songs = self.songs_ref()?;
let song = songs.iter().find(|song| song.id == id)?;

let menu = gio::Menu::new();
menu.append(Some("View album"), Some("song.view_album"));
for (i, artist) in song.artists.iter().enumerate() {
menu.append(
Some(&format!("More from {}", artist.name)),
Some(&format!("song.view_artist_{}", i)),
);
}

menu.append(Some("Copy link"), Some("song.copy_link"));

Some(menu.upcast())
}
}

0 comments on commit 52e8c1b

Please sign in to comment.