mirror of
https://github.com/johrpan/musicus.git
synced 2025-10-26 11:47:25 +01:00
player: Implement MPRIS raise
This commit is contained in:
parent
31144dff46
commit
2092f25c57
2 changed files with 42 additions and 12 deletions
|
|
@ -3,11 +3,12 @@ use fragile::Fragile;
|
|||
use gstreamer_player::gst;
|
||||
use gtk::{
|
||||
gio,
|
||||
glib::{self, clone, Properties},
|
||||
glib::{self, clone, subclass::Signal, Properties},
|
||||
prelude::*,
|
||||
subclass::prelude::*,
|
||||
};
|
||||
use mpris_player::{MprisPlayer, PlaybackStatus};
|
||||
use once_cell::sync::Lazy;
|
||||
use std::{
|
||||
cell::{Cell, OnceCell},
|
||||
sync::Arc,
|
||||
|
|
@ -92,6 +93,13 @@ mod imp {
|
|||
|
||||
#[glib::derived_properties]
|
||||
impl ObjectImpl for MusicusPlayer {
|
||||
fn signals() -> &'static [Signal] {
|
||||
static SIGNALS: Lazy<Vec<Signal>> =
|
||||
Lazy::new(|| vec![Signal::builder("raise").build()]);
|
||||
|
||||
SIGNALS.as_ref()
|
||||
}
|
||||
|
||||
fn constructed(&self) {
|
||||
self.parent_constructed();
|
||||
|
||||
|
|
@ -101,15 +109,16 @@ mod imp {
|
|||
"de.johrpan.musicus.desktop".to_string(),
|
||||
);
|
||||
|
||||
mpris.set_can_raise(true);
|
||||
mpris.set_can_play(true);
|
||||
mpris.set_can_pause(true);
|
||||
mpris.set_can_go_previous(true);
|
||||
mpris.set_can_go_next(true);
|
||||
mpris.set_can_seek(false);
|
||||
mpris.set_can_raise(false);
|
||||
mpris.set_can_set_fullscreen(false);
|
||||
|
||||
let obj = self.obj();
|
||||
mpris.connect_raise(clone!(@weak obj => move || obj.emit_by_name::<()>("raise", &[])));
|
||||
mpris.connect_play(clone!(@weak obj => move || obj.play()));
|
||||
mpris.connect_pause(clone!(@weak obj => move || obj.pause()));
|
||||
mpris.connect_play_pause(clone!(@weak obj => move || obj.play_pause()));
|
||||
|
|
@ -198,6 +207,14 @@ impl MusicusPlayer {
|
|||
.build()
|
||||
}
|
||||
|
||||
pub fn connect_raise<F: Fn(&Self) + 'static>(&self, f: F) -> glib::SignalHandlerId {
|
||||
self.connect_local("raise", true, move |values| {
|
||||
let obj = values[0].get::<Self>().unwrap();
|
||||
f(&obj);
|
||||
None
|
||||
})
|
||||
}
|
||||
|
||||
pub fn append(&self, tracks: Vec<PlaylistItem>) {
|
||||
let playlist = self.playlist();
|
||||
|
||||
|
|
@ -223,13 +240,21 @@ impl MusicusPlayer {
|
|||
pub fn play(&self) {
|
||||
self.player().play();
|
||||
self.set_playing(true);
|
||||
self.imp().mpris.get().unwrap().set_playback_status(PlaybackStatus::Playing);
|
||||
self.imp()
|
||||
.mpris
|
||||
.get()
|
||||
.unwrap()
|
||||
.set_playback_status(PlaybackStatus::Playing);
|
||||
}
|
||||
|
||||
pub fn pause(&self) {
|
||||
self.player().pause();
|
||||
self.set_playing(false);
|
||||
self.imp().mpris.get().unwrap().set_playback_status(PlaybackStatus::Paused);
|
||||
self.imp()
|
||||
.mpris
|
||||
.get()
|
||||
.unwrap()
|
||||
.set_playback_status(PlaybackStatus::Paused);
|
||||
}
|
||||
|
||||
pub fn current_item(&self) -> Option<PlaylistItem> {
|
||||
|
|
|
|||
|
|
@ -55,19 +55,24 @@ mod imp {
|
|||
player_bar.playlist_hidden();
|
||||
}));
|
||||
|
||||
player_bar.connect_show_playlist(clone!(@weak playlist_page, @weak stack => move |_, show| {
|
||||
if show {
|
||||
playlist_page.scroll_to_current();
|
||||
stack.set_visible_child_name("playlist");
|
||||
} else {
|
||||
stack.set_visible_child_name("navigation");
|
||||
};
|
||||
}));
|
||||
player_bar.connect_show_playlist(
|
||||
clone!(@weak playlist_page, @weak stack => move |_, show| {
|
||||
if show {
|
||||
playlist_page.scroll_to_current();
|
||||
stack.set_visible_child_name("playlist");
|
||||
} else {
|
||||
stack.set_visible_child_name("navigation");
|
||||
};
|
||||
}),
|
||||
);
|
||||
|
||||
self.player
|
||||
.bind_property("active", &self.player_bar_revealer.get(), "reveal-child")
|
||||
.sync_create()
|
||||
.build();
|
||||
|
||||
let obj = self.obj().to_owned();
|
||||
self.player.connect_raise(move |_| obj.present());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue