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