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 gstreamer_player::gst;
|
||||||
use gtk::{
|
use gtk::{
|
||||||
gio,
|
gio,
|
||||||
glib::{self, clone, Properties},
|
glib::{self, clone, subclass::Signal, Properties},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
subclass::prelude::*,
|
subclass::prelude::*,
|
||||||
};
|
};
|
||||||
use mpris_player::{MprisPlayer, PlaybackStatus};
|
use mpris_player::{MprisPlayer, PlaybackStatus};
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
use std::{
|
use std::{
|
||||||
cell::{Cell, OnceCell},
|
cell::{Cell, OnceCell},
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
|
|
@ -92,6 +93,13 @@ mod imp {
|
||||||
|
|
||||||
#[glib::derived_properties]
|
#[glib::derived_properties]
|
||||||
impl ObjectImpl for MusicusPlayer {
|
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) {
|
fn constructed(&self) {
|
||||||
self.parent_constructed();
|
self.parent_constructed();
|
||||||
|
|
||||||
|
|
@ -101,15 +109,16 @@ mod imp {
|
||||||
"de.johrpan.musicus.desktop".to_string(),
|
"de.johrpan.musicus.desktop".to_string(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
mpris.set_can_raise(true);
|
||||||
mpris.set_can_play(true);
|
mpris.set_can_play(true);
|
||||||
mpris.set_can_pause(true);
|
mpris.set_can_pause(true);
|
||||||
mpris.set_can_go_previous(true);
|
mpris.set_can_go_previous(true);
|
||||||
mpris.set_can_go_next(true);
|
mpris.set_can_go_next(true);
|
||||||
mpris.set_can_seek(false);
|
mpris.set_can_seek(false);
|
||||||
mpris.set_can_raise(false);
|
|
||||||
mpris.set_can_set_fullscreen(false);
|
mpris.set_can_set_fullscreen(false);
|
||||||
|
|
||||||
let obj = self.obj();
|
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_play(clone!(@weak obj => move || obj.play()));
|
||||||
mpris.connect_pause(clone!(@weak obj => move || obj.pause()));
|
mpris.connect_pause(clone!(@weak obj => move || obj.pause()));
|
||||||
mpris.connect_play_pause(clone!(@weak obj => move || obj.play_pause()));
|
mpris.connect_play_pause(clone!(@weak obj => move || obj.play_pause()));
|
||||||
|
|
@ -198,6 +207,14 @@ impl MusicusPlayer {
|
||||||
.build()
|
.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>) {
|
pub fn append(&self, tracks: Vec<PlaylistItem>) {
|
||||||
let playlist = self.playlist();
|
let playlist = self.playlist();
|
||||||
|
|
||||||
|
|
@ -223,13 +240,21 @@ impl MusicusPlayer {
|
||||||
pub fn play(&self) {
|
pub fn play(&self) {
|
||||||
self.player().play();
|
self.player().play();
|
||||||
self.set_playing(true);
|
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) {
|
pub fn pause(&self) {
|
||||||
self.player().pause();
|
self.player().pause();
|
||||||
self.set_playing(false);
|
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> {
|
pub fn current_item(&self) -> Option<PlaylistItem> {
|
||||||
|
|
|
||||||
|
|
@ -55,19 +55,24 @@ mod imp {
|
||||||
player_bar.playlist_hidden();
|
player_bar.playlist_hidden();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
player_bar.connect_show_playlist(clone!(@weak playlist_page, @weak stack => move |_, show| {
|
player_bar.connect_show_playlist(
|
||||||
if show {
|
clone!(@weak playlist_page, @weak stack => move |_, show| {
|
||||||
playlist_page.scroll_to_current();
|
if show {
|
||||||
stack.set_visible_child_name("playlist");
|
playlist_page.scroll_to_current();
|
||||||
} else {
|
stack.set_visible_child_name("playlist");
|
||||||
stack.set_visible_child_name("navigation");
|
} else {
|
||||||
};
|
stack.set_visible_child_name("navigation");
|
||||||
}));
|
};
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
self.player
|
self.player
|
||||||
.bind_property("active", &self.player_bar_revealer.get(), "reveal-child")
|
.bind_property("active", &self.player_bar_revealer.get(), "reveal-child")
|
||||||
.sync_create()
|
.sync_create()
|
||||||
.build();
|
.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